アットウィキロゴ

1始まり (1-based indexing)

1始まり (1-based indexing) とは、配列(テーブル)の要素にアクセスする際、最初の要素のインデックス(添字)が「0」ではなく「1」からスタートする仕様のことです。
多くの現代的なプログラミング言語(C, Python, JavaScriptなど)は0始まり(0-based)ですが、Luaは歴史的な経緯や数学的な直感性を重視し、1始まりを採用しています。


概要

Playdateの開発において「1始まり(1-based indexing)」を理解することは非常に重要です。これは、Playdateのメイン言語であるLuaが、配列やリストの添え字を1からカウントする仕様であることに由来します。
C言語、Python、JavaScriptなどの「0始まり」の言語に慣れている開発者にとっては、最も間違いやすいポイントの一つです。
1. Luaにおける「1始まり」の基本
Luaのテーブル(配列)は、最初の要素にインデックス1でアクセスします。
local fruits = {"apple", "orange", "banana"}
 
print(fruits) -- "apple" (0ではない!)
print(#fruits)   -- 3 (要素数)
なぜ1始まりなのか?
Luaはもともと非プログラマー(データ記述を行うエンジニアなど)でも扱いやすいように設計されたため、「1番目、2番目…」という人間の直感的な数え方に合わせられています。

2. Playdate SDKにおける具体例
Playdateの各種APIも、このLuaの仕様に準拠しています。
タイルマップ (Tilemaps)
タイルマップの座標指定やタイルのインデックスは1始まりです。
  • タイルマップの左上のタイルは x=1, y=1 です
  • getTileAt(1, 1) で左上のタイルを取得します
スプライトのインデックス
スプライトのリストや、アニメーションのフレーム指定も1から始まります。
  • playdate.graphics.getSpriteList() で返されるテーブルの最初のスプライトは です
  • imagetable:getImage(1) は最初の画像を取得します
ループ処理
配列を走査する際の標準的な for 文も1から始まります。
for i=1, #myTable do
    print(myTable[i])
end

3. C言語(C SDK)との違い
ここが混乱の元ですが、Playdate C SDKを使用する場合は0始まりになります。
項目 Lua SDK C SDK
インデックス 1始まり 0始まり
タイル座標 (1, 1) が起点 (0, 0) が起点
メモリ管理 自動 (GC) 手動
LuaとCを混ぜて使う(LuaからC関数を呼び出す)場合は、インデックスの「+1 / -1」の変換を意識する必要があります。

4. 注意点と「落とし穴」
JSONとの相互変換
前述の通り、JSONは一般的に0始まりの言語で使われることが多いため、外部ツールで作成したJSON配列を読み込む際は注意が必要です。
  • Playdateの json.decode を使うと、JSONの配列はLuaの1始まりテーブルに自動で変換されるので、読み込み後は からアクセスすればOKです。
0をインデックスに使うと?
Luaでは myTable に値を代入すること自体は可能(単なるキーとして扱われる)ですが、配列の長さ演算子 # には含まれず、標準的な関数では無視されるため、バグの原因になります。
算術計算でのオフセット
数学的な計算(剰余 % を使ったループなど)を行う際、0始まりの方が計算が楽な場合があります。その場合は一度0ベースで計算してから最後に +1 するテクニックがよく使われます。
-- 1から4をループさせたい場合
local index = (count % 4) + 1 

関連ページ

最終更新:2026年05月01日 09:06