Menu
CoddyTech

使用 2D 数组的嵌套循环

本课属于 Coddy GDScript 学习旅程的“逻辑与流程”单元。第 14 课,共 78 课。

要访问二维数组中的每个单元格,可以在一个循环里嵌套另一个循环。外层循环遍历各行,内层循环遍历当前行中的单元格:

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 追加三次,这三行其实是同一个数组,执行 town[1][2] = "P" 会在每一行中放入一个 P。

challenge icon

挑战

简单

绘制一张城镇地图。程序会读取 4 个整数,每行一个:行数、列数、玩家所在的行和玩家所在的列。玩家的位置始终在地图内。

  1. 构建 grid,这是一个包含相应行数和列数的二维数组,每个单元格都是 "."。使用嵌套循环,并为每一行创建一个新的行数组。
  2. 将玩家所在位置的单元格设为 "P"。
  3. 打印地图,每行输出一行,单元格之间不留空格。

输入 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 在线编译器