2014-07-23 2 views
0

저는 코딩에 익숙하지 않으며 '파이썬의 어려운 길'학습서를 통해 자신을 파이썬으로 가르치고 있으며 현재 간단한 게임을 만들고 있습니다. 지금까지 모든 것이 제대로 작동하는 것 같습니다만, 제 수업 중 하나를 다른 수업과 함께 만드는 법을 알 수는 없습니다.IndexError : 목록 색인이 범위를 벗어남/OOP를 사용하여 목록 호출이 어려움

class engine(object): 
    def __init__(self,world,days,character): 
     self.world = world 
     self.days = days 
     self.character = character 

    def letsdoit(self): 
     self.world.worldbuilder() 

이것은 실제로 게임을 실행하기위한 블록이며, 9 번째 줄은 관련이 없으므로 생략됩니다.

world.worldbuilder는 게임이 실제로 실행되는지도를 만드는 기능입니다.

class World(self, width, height): 
    def __init__(self, width, height): 
     self.width = width 
     self.height = height 

    def worldbuilder(self): 
     map = [] 
     for x in xrange(self.width): 
      z = [] 
      for y in xrange(self.height): 
       z.append(self.tiletype()) 
      map.append(z) 
     return map 

World.typeype은 무작위로 타일을 생성 한 다음 재설정합니다. 월드 오브제를 인스턴스화하고 worldbuilder를 실행할 때 (반환하는 대신지도를 인쇄하는 것을 제외하고는) 모든 것이 완벽하게 작동합니다. 그러나 엔진이 돌아가는 세계 이외의 다른 물체를 가진 추측의지도를 참조 할 때, 나는 오류를 얻는다. 가장 흔한은 다음과 같습니다

IndexError: list out of range 

구체적 내가에 대한 응답으로 그것을 얻을 : 나는 일반적인 타일을 동일하게 player.tilestore을 설정 한 경우에도

class player(object): 
    def __init__(self, World): 
     self.x = randint(1,World.width) 
     self.y = randint(1,World.height) 
     self.tilestore = map([self.x][self.y]) 

, 내 'built_in_function_or_method 말한다 어디 TypeErrors로 실행 '항목에는 다른 장소의지도를 참조 할 때'get_item '속성이 없습니다.

나는 list = self.world.worldbuilder()를 설정하고지도 대신 list를 호출했지만 그 다음 똑같은 문제가 발생합니다.

답변

0

당신은 어쩌면 당신이지도를 사용하기 전에 호출 할 수 worldbuilder를 호출하지 않는 것 :

class player(object): 
    def __init__(self, World): 
     self.x = randint(1,World.width) 
     self.y = randint(1,World.height) 
     map = World.worldbuilder() 
     self.tilestore = map[self.x][self.y] 

그리고 Brionius 언급대로 내장을 사용하지 않으려면, 맵을 사용하는 것은 나쁜 생각이 (이다

-in 함수). 이로 인해 오도 된 오류 메시지가 나타납니다. 클래스와 인스턴스에 대해 동일한 이름 (월드)을 사용하는 것은 나쁘다.

+0

지도의 속성을 플레이어의 속성으로 설정해야했지만,이 방법 외에는 매우 효과적이었습니다. 감사합니다. –

0

IndexError은 잘못된 목록 인덱스 구문으로 인해 발생하며 TypeError은 네임 스페이스 충돌로 인해 발생합니다.

self.tilestore = world_map[self.x][self.y] 

TypeError는 네임 스페이스 충돌에 의한 경우 : IndexError를 해결하려면, 당신은이 구문을 사용합니다. In player.init 로컬 네임 스페이스에서 map을 초기화하지 않고 변수 map을 사용하고 있으므로 map은 내장 된 map 함수에 대한 참조를 포함하는 전역 네임 스페이스를 참조합니다. 당신은 내가 위에서처럼 당신은 또한에 인수 World을 변경해야이

class player(object): 
    def __init__(self, world): 
     self.x = randint(1,world.width) 
     self.y = randint(1,World.height) 
     self.tilestore = world.map([self.x][self.y]) 

같은 World 인스턴스를이

class player(object): 
    def __init__(self, world, map): 

같은 player.init에 인수로 map을 전달하거나 얻을 필요 클래스 이름 World과 클래스 인스턴스 (World) 사이의 다른 네임 스페이스 충돌을 피하려면 world을 사용하십시오.

IndexError이 발생할 수있는 또 다른 문제는 randint입니다. random.randint 함수를 사용한다고 가정하고, 인수가 a이고 b 인 경우 a <= N <= b과 같은 수를 생성합니다. 이 범위는 양쪽에 포함됩니다. 이는 때때로 self.xworld.width과 같고 self.yworld.height과 같음을 의미합니다.두 값 모두 world.map을 생성 한 방식으로 인해 범위를 벗어났습니다. 수정 사항은 다음과 같습니다.

class player(object): 
    def __init__(self, world): 
     self.x = randint(1,world.width - 1) 
     self.y = randint(1,World.height - 1) 
     self.tilestore = world.map([self.x][self.y]) 

월드 맵의 색인을 생성하는 곳이면 어디에서나 비슷한 변경을해야합니다.

+0

나는이 두 가지 제안을 모두 시도했다. 'map'의 모든 인스턴스를 'mapp'로 바꾸고 처음 시도한 경우에도 여전히 'IndexError : list index of range'가 표시됩니다. 두 번째 시도 (world.map 대신 world.worldbuilder 사용) 동일한 오류가 발생했습니다. –

+0

코드를 다시 살펴본 후 다른 IndexError 원인을 발견했습니다. 위의 추가 사항으로 문제가 해결되는지 확인하십시오. – Brionius

+0

이것은 내 코드로 많은 작은 문제를 해결하는 데 도움이되었습니다. 또한 최근 편집에서 지적한 것과 유사한 코드에서 다른 실수를 발견했습니다. 이제 작동하고 있습니다. 궁극적으로 내가 한 일은 self.mapp = world.worldbuilder()를 설정 한 다음 engine.letsdothis에서 self.character.mapp를 실행하는 것입니다. 도움을 주셔서 감사합니다. –

관련 문제