2016-11-30 2 views
0

저는 플레이어와 보드라는 2 개의 파이썬 클래스가 있습니다. 보드에는 공백에 대한 "A1"참조 스타일이있는 사전이 있습니다.오브젝트 내부의 오브젝트를 참조하는 파이썬

player.py의 플레이어 클래스 :

from board import Board 

class Player: 
    def __init__(self): 
     self.name = input("Name: ") 
     self.board = Board(3, ["A", "B", "C"]) 

board.py의 보드 클래스 :

플레이어가 인스턴스화
class Board: 
    EMPTY = "0" 
    spaces = {} 
    def __init__(self, size, letters): 
     for let in letters: 
      for num in range(1, size + 1): 
       self.spaces["{}{}".format(let, num)] = self.EMPTY 

    def place_piece(self, spot): 
     self.spaces[spot] = "X" 

    def display_board(self): 
     for let in letters: 
      for num in range(1, size + 1): 
       print("\n" + self.spaces["{}{}".format(let, num)] 

, 그것은 내부 보드 개체를 만듭니다. 2 명의 플레이어가 생성되고 각각이 플레이어 []에 추가됩니다. 각 플레이어의 턴은 current_player라는 간단한 1/0 변수로 선택됩니다.

from player import * 
    from board import * 

    current_player = 1 
    players = [] 
    player_1 = Player() 
    player_2 = Player() 
    players.append(player_1) 
    players.append(player_2) 

    while True: 
     # Switches players 
     current_player = abs(current_player - 1) 

     # Prints the current player's name 
     print(players[current_player].name) 

     # Calls some method which should alter the current player's board 
     players[current_player].board.place_piece(input("> ")) 

     # Calls some method which should show the current player's board 
     players[current_player].board.show_board() 

분명히 매우 간단. 이름은 매번 정확하게 인쇄됩니다. 그러나 보드는 두 플레이어 모두에게 첫 번째 플레이어의 보드만을 사용합니다. 플레이어의 이름이 올바르게 인쇄되기 때문에 작동하는 것입니다.

보드를 별도로 만들고 자체 목록에 배치하더라도 문제가 지속됩니다.

내가 뭘 잘못하고 있니?

+1

귀하의 질문에'Player'와'Board' 클래스를 넣어야합니다. 여기에'player.py'와'board.py' 파일을 넣으면 더 좋을 것입니다. –

+0

파일별로 파일 내용을 의미합니다. 당신이'에서 가져 오기 *'를하고 있기 때문에 [좋지 않습니다] (http://stackoverflow.com/questions/2386714/why-is-import-bad). –

+0

그리고 무엇을'print ("{}) 보드에 조각을 넣으십시오."형식 (players [current_player] .name) players [current_player] .board.place_piece()'가 맞습니까? 그 코드는 무엇입니까? 또한 place_piece() 함수는 무엇입니까? –

답변

1

게시 된 코드는 작동하지 않아야합니다. 게시판에있는 두 가지 방법, place_piecedisplay_board은 '자체'를 첫 번째 인수로 받아 들일 필요가 있습니다.

오타가 있다고 가정하면 다음과 같이 처리됩니다. 클래스 보드는 클래스 멤버spaces으로 생성됩니다. 객체에서 self.spaces을 참조 할 때마다 객체에서 찾을 수없는 대신 객체가 클래스에서 조회됩니다. 의미 당신은 Board 클래스의 모든 객체에 대해 동일한 사전을 사용하고 있습니다.

class Board: 
    EMPTY = "0" 
    # Remove spaces = {} 

    def __init__(self, size, letters): 
     self.spaces = {} 
     ... 

마지막으로 파이썬 2 배 (나를 항상 새로운 스타일의 클래스를 사용하는 것이 좋습니다 주시기 바랍니다 사용하고 있기 때문에, : 당신은 Player 클래스에서와 대신, 정회원 장소를 init 메소드의 선언을 만들 수 있습니다 예 : class Board(object)). What is the difference between old style and new style classes in Python?

+1

No $^#^$ @ way. 그것은 __init __() :'문제였습니다. 실생활에서 너를 만난다. 나는 너에게 피자를 사 줄께. 내 모자는 영원히 너에게 떨어져있을거야. –

+0

하하, 내가 도울 수있어서 기뻐요! – agrinh

관련 문제