Menu
CoddyTech

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が入ります。

challenge icon

チャレンジ

簡単

町の地図を描きます。プログラムは4つの整数を1行に1つずつ読み取ります。行数、列数、プレイヤーの行、プレイヤーの列です。プレイヤーの位置は常に地図の範囲内です。

  1. gridを作成します。指定された行数と列数を持つ2次元配列で、すべてのセルは"."です。入れ子のループを使い、各行ごとに新しい行配列を作成してください。
  2. プレイヤーの位置にあるセルを"P"に設定します。
  3. セルの間にスペースを入れず、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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン

自分で練習してみよう: GDScriptオンラインコンパイラ