Menu
CoddyTech

Vòng lặp lồng nhau với mảng 2 chiều

Thuộc phần Logic và luồng chương trình trong hành trình GDScript của Coddy. Bài học 14 trên 78.

Để duyệt qua mọi ô trong mảng 2D, hãy đặt một vòng lặp bên trong một vòng lặp khác. Vòng lặp bên ngoài duyệt qua các hàng, còn vòng lặp bên trong duyệt qua các ô của hàng hiện tại:

var grid := [[1, 2, 3], [4, 5, 6]]
var total := 0
for row in grid:
	for cell in row:
		total += cell
print(total) # 21

Khi cần biết vị trí của từng ô, hãy lặp qua các chỉ số. r là chỉ số hàng, c là chỉ số cột, còn vòng lặp bên trong dùng grid[r].size(), tức độ dài của hàng hiện tại:

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]]

Việc gán giá trị cho cell trong vòng lặp (loop) for cell in row không làm thay đổi lưới, vì cell chứa một bản sao của số đó. Hãy thay đổi các ô thông qua chỉ số của chúng, như trên.

Vòng lặp lồng nhau cũng tạo nên một lưới. Tạo một hàng mới bên trong vòng lặp ngoài, điền các phần tử vào hàng đó trong vòng lặp trong, rồi thêm hàng vào:

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.
....

Bạn phải tạo hàng bên trong vòng lặp ngoài. Khi bạn thêm một mảng vào, các hàng sẽ dùng chung mảng đó chứ không tạo bản sao: nếu bạn thêm cùng một row ba lần, cả ba hàng đều là một mảng, và town[1][2] = "P" sẽ đặt P vào mọi hàng.

challenge icon

Thử thách

Dễ

Vẽ bản đồ của một thị trấn. Chương trình đọc bốn số nguyên, mỗi số trên một dòng: số hàng, số cột, hàng của người chơi và cột của người chơi. Vị trí của người chơi luôn nằm trong bản đồ.

  1. Tạo grid, một mảng 2D có số hàng và số cột tương ứng, trong đó mọi ô đều là ".". Dùng các vòng lặp lồng nhau và tạo một mảng hàng mới cho mỗi hàng.
  2. Đặt ô tại vị trí của người chơi thành "P".
  3. In bản đồ ra, mỗi hàng trên một dòng, không có khoảng trắng giữa các ô.

Với các đầu vào 3, 4, 1 và 2, đầu ra là:

....
..P.
....

Tự làm thử

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 := []

	# Tạo lưới bằng các vòng lặp lồng nhau

	# Đặt người chơi lên bản đồ

	# In bản đồ ra
	pass
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng chương trình

Tự luyện tập: Trình biên dịch GDScript online