2016-12-22 5 views
-1

예, 코드가 현재 실행 중일 때 내 문제가 있습니다. 맵 전체에서 무작위로 생성되는 작은 섬 점이 완벽하게 작동합니다. 그러나 최대한 빨리 사각형지도의 예를하지 할 수있는 모든 작업에 변수 MAPHEIGHT 또는 MAPWIDTH의 값을 변경하면 :Python에서 예기치 않은 배열 값

MAPWIDTH = 40 
    MAPHEIGHT = 60 

그것은 나에게 오류를 제공합니다. 섬 : "\ 사용자 \ 앤드류 \ 바탕 화면 \ 파이썬 \ MapGeneration \의 test.py C", 라인 59,() 파일 "C :

역 추적 (마지막으로 가장 최근 통화) 파일 \ 사용자 \ 앤드류 [RNX] [RNY] = 타일 IndexError tilemap 섬 에서 \ 바탕 화면 \ 파이썬 \ MapGeneration \의 test.py ", 줄 58 : 목록 할당 인덱스 범위를 벗어난

나는 오류가 내 잘못을 수있다 그림 def island() : 무엇이 문제가 될지 모르지만 도움을 청합니다.

from time import sleep 
    import pygame, sys, random 
    from pygame.locals import * 
    ##COLORS 
    BLACK = (0,0,0) 
    BROWN = (153,76,0) 
    GREEN = (0,255,0) 
    BLUE = (0,0,255) 
    ## CONSTANTS REPRESENTING RESOURCES 
    WATER = 0 
    GRASS = 1 
    DIRT = 2 
    FOREST = 3 
    ## DICTIONARY LINKING RESOURCES TO TEXTURES 
    textures = { 
        DIRT : pygame.image.load('images/mountain.png'), 
        GRASS : pygame.image.load('images/grass.png'), 
        WATER : pygame.image.load('images/water.png'), 
        FOREST : pygame.image.load('images/trees.png') 
       } 
    ## game dimensions 
    TILESIZE = 16 
    MAPWIDTH = 50 
    MAPHEIGHT = 50 
    TILERECORDX = [] 
    TILERECORDY = [] 
    ISLANDCOUNT = 30 
    #A LIST OF THE RESOURCES 
    resources = [DIRT,GRASS,WATER,FOREST] 
    #LIST TO CREATE TILEMAP 
    tilemap = [[WATER for w in range(MAPWIDTH)] for h in range(MAPHEIGHT)] 
    #set up display 
    pygame.init() 
    #SETS THE DISPLAY SIZE BASED ON THE SIZE OF THE TILES AND THE AMOUNT OF CELLS   SET OUT IN 
    #MAPWIDTH MAPHEIGHT 
    DISPLAYSURF = pygame.display.set_mode((MAPWIDTH*TILESIZE,MAPHEIGHT*TILESIZE)) 

    def island(): 
     global TILERECORDX,TILERECORDY 
     for cnt in range(ISLANDCOUNT): 
      #chooses a spot on the map to start landmass 
      rNx = random.randrange(1,MAPWIDTH) 
      rNy = random.randrange(1,MAPHEIGHT) 
      TILERECORDX.append(rNx) 
      TILERECORDY.append(rNy) 
      if rNx >= MAPWIDTH:#to keep islands from generating on the edges of the   map 
       rNx -= 1 
      elif rNy >= MAPHEIGHT:#to keep islands from generating on the edges of   the map 
       rNy -= 1 
       #chooses what tile type ends up there 
      randomNumber = random.randint(0,30) 
      if randomNumber <= 1 or randomNumber == 2: 
       tile = DIRT 
      elif randomNumber >= 3 and randomNumber <= 16: 
       tile = FOREST 
      elif randomNumber >= 17 and randomNumber <= 30: 
       tile = GRASS 
      tilemap[rNx][rNy] = tile 
    island() 
    while True: 
     #get user events 
     for event in pygame.event.get(): 
      if event.type == QUIT: 
       pygame.quit() 
       sys.exit() 
     for row in range(MAPHEIGHT): 
      for column in range(MAPWIDTH): 
       DISPLAYSURF.blit(textures[tilemap[row][column]],(column*TILESIZE,row*TILESIZE))   
     pygame.display.update() 
+0

타일 맵을 인쇄하려고 했습니까? – iFlo

+5

'tilemap [rNx] [rNy] = tile'을'tilemap [rNy] [rNx] = tile'으로 변경하면 문제가 해결됩니까? – doctorlove

+0

예! 고쳐! 주위 사람들을 바꿔 놓는 이유가 그것을 고칠 수 있을까요? – user3619596

답변

2

내 의견에 제안한대로 "사각형"배열을 위해 일하지만 다른 방법으로는 인덱싱이 거꾸로 (또는 설정) 제안되지 않았습니다. tilemap[rNx][rNy] = tile.

tilemap[rNy][rNx] = tile을 사용하면 해결됩니다.

왜?

설정 방법을 고려하십시오.

tilemap = [[WATER for w in range(MAPWIDTH)] for h in range(MAPHEIGHT)] 

몇 가지 숫자로 생각해 봅시다.

MAPWIDTH이 2이고 MAPHEIGHT이 3이라고 가정합니다. 그 다음에는 목록 인 3 개의 항목 (높이) 목록이 있습니다. 목록에는 두 개의 항목이 있습니다. 즉

  • tilemape[0]

    MAPWIDTH 것들의 목록이다.

  • tilemape[1]MAPWIDTH 목록입니다.
  • tilemape[2]은 범위를 벗어납니다.

필요할 경우 설정을 재구성하거나 "행"에 색인을 붙일 수 있습니다 (y 좌표를 먼저 지정).

관련 문제