2016-03-27 26 views
1

我知道像這樣的主題的問題已經發布之前,但我有一個錯誤,我沒有看到任何其他問題。Tilemap error pygame

我試圖讓從一個二維數組平鋪背景,但是當我運行它,我得到這個錯誤:

current_tile =紋理[tilemap的[X,Y]
類型錯誤:列表索引必須是整數,而不是元組

這是我的代碼:

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] 

這是從子表的索引j取元素在指數X:

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

我沒有給你倒票,但是當你建議迭代'tileset'時,你從不會引用'l'變量。 'l'需要在循環之前聲明,在'for y in sub:'的每次迭代結束時增加一個,並且在'for ind,sub in enumerate(tilemap):'每次迭代之後再次設置爲0。 。 – Flutterguy135

+0

@ Flutterguy135,這不是我的答案被低估的原因,這是一個巨魔。下面的答案基本上反駁了我已經詳細解釋過的內容,並且有一個upvote,以便真正解釋這一切 –

1

TypeError: list indices must be integers, not tuple

要解決此錯誤,您必須使用整數(數字)而不是元組(1,2)作爲列表索引。從我所看到的,你試圖做二維列表[1,2]這是錯誤的,因爲二維數組/列表是列表列表。 這就是爲什麼你必須使用瓷磚地圖[x] [y]。 Tilemap [x]從tilemap和tilemap [x] [y]返回子列表子列表x返回元素y