2次元配列を使った入れ子のループ
CoddyのGDScriptジャーニー「ロジックとフロー」セクションの一部。レッスン 14/78。
2D配列のすべてのセルを訪れるには、ループの中に別のループを入れます。外側のループは行を順に処理し、内側のループは現在の行のセルを順に処理します:
var grid := [[1, 2, 3], [4, 5, 6]]
var total := 0
for row in grid:
for cell in row:
total += cell
print(total) # 21各セルの位置が必要な場合は、インデックスを使ってループします。rは行のインデックス、cは列のインデックスで、内側のループでは現在の行の長さであるgrid[r].size()を使います:
for r in range(grid.size()):
for c in range(grid[r].size()):
grid[r][c] *= 10
print(grid) # [[10, 20, 30], [40, 50, 60]]for cell in rowループ内でcellに値を代入しても、cellには数値のコピーが格納されているため、グリッドは変化しません。上記のように、インデックスを使ってセルを変更してください。
入れ子のループでもグリッドを作れます。外側のループ内で新しい行を作り、内側のループで埋めてから、追加します。
var town := []
for r in range(3):
var row := []
for c in range(4):
row.append(".")
town.append(row)
town[1][2] = "P"
for row in town:
print("".join(row))....
..P.
....行は外側のループの中で作成する必要があります。配列を追加するとき、配列はコピーされずに共有されます。同じrowを3回追加すると、3つの行は1つの配列となり、town[1][2] = "P"を実行すると、すべての行にPが入ります。
チャレンジ
簡単町の地図を描きます。プログラムは4つの整数を1行に1つずつ読み取ります。行数、列数、プレイヤーの行、プレイヤーの列です。プレイヤーの位置は常に地図の範囲内です。
gridを作成します。指定された行数と列数を持つ2次元配列で、すべてのセルは"."です。入れ子のループを使い、各行ごとに新しい行配列を作成してください。- プレイヤーの位置にあるセルを
"P"に設定します。 - セルの間にスペースを入れず、1行ずつ地図を出力します。
入力が3、4、1、2の場合、出力は次のとおりです。
....
..P.
....自分で試してみよう
extends Node
func _ready():
var rows := int(OS.read_string_from_stdin())
var cols := int(OS.read_string_from_stdin())
var player_row := int(OS.read_string_from_stdin())
var player_col := int(OS.read_string_from_stdin())
var grid := []
# 入れ子のループでグリッドを作成する
# マップ上にプレイヤーを配置する
# マップを出力する
pass
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: GDScriptオンラインコンパイラ