Вы получаете IndexError
, потому что вы определили только одну строку в вашем tilemap
, но внешний цикл for
поставляет row
индексы от 0
до mapheight-1
из-за этого утверждения:
for row in range(mapheight):
Чтобы избежать этой ошибки, попробуйте изменить ее на:
for row in range(len(tilemap)):
Обновление
Я думаю, что яВыяснили, что вы пытаетесь сделать. Как я уже говорил ранее, IndexError
заключается в том, что число строк в tilemap
не совпадает с числом, которое вы пытаетесь отобразить с помощью вложенных циклов for
.
Ниже я исправилспособ tilemap
определен так, чтобы он имел правильное количество строк и столбцов (а также упорядочил несколько других определений и добавил некоторую обработку событий в цикл отображения, чтобы позволить сценарию изящно завершить работу вместо выполнения в бесконечном цикле.
import pygame
pygame.init()
tilesize = 64
mapwidth, mapheight = 16, 13
screen = pygame.display.set_mode((mapwidth*tilesize, mapheight*tilesize))
pygame.display.set_caption("Aspen")
WALLTOP, WALLBOT, GRASS = range(3)
wallTop = (128, 128, 128)
wallBot = (210, 105, 30,)
grass = (50, 205, 50)
colors = {
WALLTOP : wallTop,
WALLBOT : wallBot,
GRASS : grass
}
tilemap = [
[WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP],
[WALLTOP, WALLBOT, WALLBOT, WALLBOT, WALLBOT, WALLBOT, WALLBOT, WALLBOT, WALLBOT, WALLBOT, WALLBOT, WALLBOT, WALLBOT, WALLBOT, WALLBOT, WALLTOP],
[WALLTOP, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, WALLTOP],
[WALLTOP, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, WALLTOP],
[WALLTOP, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, WALLTOP],
[WALLTOP, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, WALLTOP],
[WALLTOP, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, WALLTOP],
[WALLTOP, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, WALLTOP],
[WALLTOP, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, WALLTOP],
[WALLTOP, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, WALLTOP],
[WALLTOP, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, WALLTOP],
[WALLTOP, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, GRASS, WALLTOP],
[WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP, WALLTOP],
]
running = True
while running:
screen.fill((64, 64, 64))
for row in range(mapheight):
for column in range(mapwidth):
pygame.draw.rect(screen, colors[tilemap[row][column]], (column*tilesize, row*tilesize, tilesize, tilesize))
# Process user-events.
for event in pygame.event.get():
if event.type == pygame.QUIT: # User clicked to close window.
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE: # Press escape key to quit.
running = False
pygame.display.update()