2016-03-27 2 views
1

Я знаю, что вопросы по подобным темам были опубликованы ранее, но у меня есть ошибка, которую я не видел ни в каких других вопросах.Tilemap error pygame

Я пытаюсь сделать плиточный фон из 2d массива, но когда я запускаю его я получаю эту ошибку:

current_tile = текстуры [tilemap [х, у]]
TypeError: список индексов должны быть целыми, а не кортеж

Это мой код:

import pygame, sys 
from pygame.locals import * 
pygame.init() 

tilesize = 32 
tileswidth = 11 
tilesheight = 12 

screenwidth = tilesize*tileswidth 
screenheight = tilesize*tilesheight 
screen = pygame.display.set_mode((screenwidth,screenheight)) 

tilemap = [ 
    [9,3,2,2,2,4,2,2,2,3,9], 
    [8,11,10,10,10,10,10,10,10,11,5], 
    [8,1,6,9,9,9,9,9,8,1,5], 
    [8,1,5,9,9,9,9,9,7,1,5], 
    [8,1,6,9,9,9,9,9,7,1,5], 
    [8,1,5,9,9,9,9,9,8,1,5], 
    [8,1,12,4,2,3,2,4,13,1,5], 
    [7,11,10,10,10,11,10,10,10,11,6], 
    [9,9,9,9,7,1,6,9,9,9,9], 
    [9,9,9,9,7,1,6,9,9,9,9], 
    [9,9,9,9,7,1,6,9,9,9,9] 
    ] 

textures = { 
    1 : pygame.image.load("data/tiles/1.jpg").convert_alpha(), 
    2 : pygame.image.load("data/tiles/2.jpg").convert_alpha(), 
    3 : pygame.image.load("data/tiles/3.jpg").convert_alpha(), 
    4 : pygame.image.load("data/tiles/4.jpg").convert_alpha(), 
    5 : pygame.image.load("data/tiles/5.jpg").convert_alpha(), 
    6 : pygame.image.load("data/tiles/6.jpg").convert_alpha(), 
    7 : pygame.image.load("data/tiles/7.jpg").convert_alpha(), 
    8 : pygame.image.load("data/tiles/8.jpg").convert_alpha(), 
    9 : pygame.image.load("data/tiles/9.jpg").convert_alpha(), 
    10 : pygame.image.load("data/tiles/10.jpg").convert_alpha(), 
    11 : pygame.image.load("data/tiles/11.jpg").convert_alpha(), 
    12 : pygame.image.load("data/tiles/12.jpg").convert_alpha(), 
    13 : pygame.image.load("data/tiles/13.jpg").convert_alpha() 
    } 

while True: 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 
    for x in range(tilesheight): 
     for y in range(tileswidth): 
      current_tile = textures[tilemap[x,y]] 
      screen.blit(current_tile, (x*tilesize, y*tilesize)) 


    screen.fill(0,0,0) 
    pygame.display.update() 

Любая помощь будет оценена.

+0

Вы также должны принять во внимание, что 'screenheight' должен быть равен 11, или код попадет в индексную ошибку, потому что в' tilemap' есть только 11 элементов, а 'screen.fill (0,0,0)' должен быть изменен на 'screen.fill ((0,0,0))', чтобы избежать ошибки значения. – Flutterguy135

ответ

0

Вы не можете получить доступ к списку с кортежем, который является то, что tilemap[x,y] делает, вы хотите:

tilemap[x][y] 

Который берет элемент с индексом х из подсписка по индексу у:

In [7]: tilemap = [ 
    ...:  [9,3,2,2,2,4,2,2,2,3,9], 
    ...:  [8,11,10,10,10,10,10,10,10,11,5], 
    ...:  [8,1,6,9,9,9,9,9,8,1,5], 
    ...:  [8,1,5,9,9,9,9,9,7,1,5], 
    ...:  [8,1,6,9,9,9,9,9,7,1,5], 
    ...:  [8,1,5,9,9,9,9,9,8,1,5], 
    ...:  [8,1,12,4,2,3,2,4,13,1,5], 
    ...:  [7,11,10,10,10,11,10,10,10,11,6], 
    ...:  [9,9,9,9,7,1,6,9,9,9,9], 
    ...:  [9,9,9,9,7,1,6,9,9,9,9], 
    ...:  [9,9,9,9,7,1,6,9,9,9,9] 
    ...:  ] 

In [8]: tilemap[0][0] 
Out[8]: 9 

In [9]: tilemap[1][0] 
Out[9]: 8 

Вы также можете просто перебрать список перечней:

for ind, sub in enumerate(tilemap): 
    for i, y in enumerate(sub): 
     current_tile = textures[y] 
     screen.blit(current_tile, (ind * tilesize, i * tilesize)) 
+0

Хотелось бы узнать, что не так с правильным ответом –

+0

Я не дал вам ни единого голоса, но вы никогда не ссылались на переменную 'l', когда вы предлагали повторить через' tileset'. 'l' нужно объявить перед циклами, увеличивающимися на один в конце каждой итерации' for y в sub: ', и после 0-й очереди после каждой итерации' for ind, sub в enumerate (tilemap) , – Flutterguy135

+0

@ Flutterguy135, это не причина, по которой мой ответ был опущен, это был тролль. Ответ ниже в основном срывает то, что я уже объяснял гораздо более подробно, и имеет upvote, так что действительно объясняет все это –

1

TypeError: list indices must be integers, not tuple

Чтобы исправить эту ошибку, вы должны использовать целые числа (числа), а не кортеж (1,2) в качестве индексов списка. Из того, что я вижу, вы пытаетесь сделать двумерный список [1,2], что неверно, потому что 2-мерные массивы/списки - это списки списков. Вот почему вы должны использовать tilemap [x] [y]. Tilemap [x] возвращает подсписку из tilemap и tilemap [x] [y] is отподписок в x, элемент возврата y.

Смежные вопросы