2016-03-27 12 views
1

このような件名に関する質問は以前に投稿されていますが、私には間違いがあります。タイルマップエラーpygame

私は2次元配列からタイル張りの背景を作るしようとしていますが、私はそれを実行したとき、私はこのエラーを取得:リストインデックス:
はTypeError [[x、y]がタイルマップ]

current_tile =テクスチャを

タプルない、整数でなければなりません。これは私のコードです:任意の助けをいただければ幸いです

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]がやっていることであるタプルとリストにアクセスすることはできません。

インデックスYでサブリストからのインデックスxで要素を取っている
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

私はあなたに投票を下しませんでしたが、 'tileset'を通して反復することを提案したときに' l'変数を参照したことはありません。 'l'はループの前に宣言する必要があり、' for y in sub: 'の各繰り返しの最後に1つずつ増分し、' for ind、sub in enumerate(tilemap): ' 。 – Flutterguy135

+0

@ Flutterguy135、それは私の答えがdownvotedされた理由ではない、それはトロールだった。下の答えは、基本的に私がすでに説明した内容を逆にしてアップワイヤーを持っているので、実際にすべてを説明しています。 –

1

TypeError: list indices must be integers, not tuple

このエラーを修正するには、リストインデックスとしてタプル(1,2)ではなく整数(数値)を使用する必要があります。 2次元配列/リストはのリストののリストなので、私が見ていることから、あなたは2次元のリスト[1,2]をしようとしています。 そのため、tilemap [x] [y]を使用する必要があります。 Tilemap [x]はtilemapのサブリストを返します。tilemap [x] [y]はからのサブリストx、戻り値yです。