使用 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。
挑战
简单绘制一张城镇地图。程序会读取 4 个整数,每行一个:行数、列数、玩家所在的行和玩家所在的列。玩家的位置始终在地图内。
- 构建
grid,这是一个包含相应行数和列数的二维数组,每个单元格都是"."。使用嵌套循环,并为每一行创建一个新的行数组。 - 将玩家所在位置的单元格设为
"P"。 - 打印地图,每行输出一行,单元格之间不留空格。
输入 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 在线编译器