2014-07-22 3 views
0

간단한 체커 프로그램을 쓰고 있습니다. 나는 게임 상태의 좋은 ASCII 출력을 얻으려고 노력하고있다.Maddening Python For Loop

def function(self): 
    board = [["+", " - "]*8 + ["+", "\n"], \ 
       ["|", " "]*8 + ["|", "\n"]]*8 + \ 
       [["+", " - "]*8 + ["+", "\n"]] 

    i = 0 
    for row in self.state: 
     j = 0 
     for cell in row: 
      if cell == WHITE: 
       board[2*i+1][2*j+1] = ' w ' 
      elif cell == WHITE_KING: 
       board[2*i+1][2*j+1] = ' W ' 
      elif cell == BLACK: 
       board[2*i+1][2*j+1] = ' b ' 
      elif cell == BLACK_KING: 
       board[2*i+1][2*j+1] = ' B ' 
      j += 1 
     i += 1 

    return board 

(클래스 정의 외부) : 내가 잘못이다, 그러나 여기에서 무슨 일이 일어나고 있는지 무엇을 볼 수 없습니다

EMPTY, WHITE, WHITE_KING, BLACK, BLACK_KING = range(5) 

여기 내가 사용하려고하는 기능입니다.

>>> B = CheckerBoard() 
>>> B.state 
[[3, 0, 3, 0, 3, 0, 3, 0], [0, 3, 0, 3, 0, 3, 0, 3], [3, 0, 3, 0, 3, 0, 3, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 0, 1, 0], [0, 1, 0, 1, 0, 1, 0, 1]] 
>>> print("".join(map(lambda x: "".join(x), B.function()))) 
+ - + - + - + - + - + - + - + - + 
| w | w | w | w | w | w | w | w | 
+ - + - + - + - + - + - + - + - + 
| w | w | w | w | w | w | w | w | 
+ - + - + - + - + - + - + - + - + 
| w | w | w | w | w | w | w | w | 
+ - + - + - + - + - + - + - + - + 
| w | w | w | w | w | w | w | w | 
+ - + - + - + - + - + - + - + - + 
| w | w | w | w | w | w | w | w | 
+ - + - + - + - + - + - + - + - + 
| w | w | w | w | w | w | w | w | 
+ - + - + - + - + - + - + - + - + 
| w | w | w | w | w | w | w | w | 
+ - + - + - + - + - + - + - + - + 
| w | w | w | w | w | w | w | w | 
+ - + - + - + - + - + - + - + - + 

원하는 출력은

+ - + - + - + - + - + - + - + - + 
| b | | b | | b | | b | | 
+ - + - + - + - + - + - + - + - + 
| | b | | b | | b | | b | 
+ - + - + - + - + - + - + - + - + 
| b | | b | | b | | b | | 
+ - + - + - + - + - + - + - + - + 
| | | | | | | | | 
+ - + - + - + - + - + - + - + - + 
| | | | | | | | | 
+ - + - + - + - + - + - + - + - + 
| w | | w | | w | | w | | 
+ - + - + - + - + - + - + - + - + 
| | w | | w | | w | | w | 
+ - + - + - + - + - + - + - + - + 
| w | | w | | w | | w | | 
+ - + - + - + - + - + - + - + - + 

편집입니다 :

def function(self): 
    board = [x for list in 
       [[[a for subl in [["+", " - "] for _ in range(8)] for a in subl] + ["+", "\n"], \ 
       [a for subl in [["|", " "] for _ in range(8)] for a in subl] + ["|", "\n"]] \ 
       for _ in range(8)] for x in list] + \ 
       [[a for subl in [["+", " - "] for _ in range(8)] for a in subl] + ["+", "\n"]] 

    i = 0 
    for row in self.state: 
     j = 0 
     for cell in row: 
      if cell == WHITE: 
       board[2*i+1][2*j+1] = ' w ' 
      elif cell == WHITE_KING: 
       board[2*i+1][2*j+1] = ' W ' 
      elif cell == BLACK: 
       board[2*i+1][2*j+1] = ' b ' 
      elif cell == BLACK_KING: 
       board[2*i+1][2*j+1] = ' B ' 
      j += 1 
     i += 1 

    return board 
+0

예상되는 출력은 무엇입니까? 명확성을 위해 그것을 포함하십시오 .. – vishal

+0

더 중요한 것은 _input_은 무엇입니까? 당신이 우리에게 보여주지 않은 코드의 버그 때문에'self.state'가 모두'화이트 (WHITE)'셀이 아니라고 확신합니까? 또한 자체적으로 실행하거나 디버깅 할 수없는 코드 조각 대신 [MCVE] (http://stackoverflow.com/help/mcve)를 제공 할 수 있습니까? – abarnert

+2

해당 보드 선언의 * 8 표현식은 목록의 8 개의 고유 사본을 만들거나 동일한 목록에 대한 8 개의 참조를 만듭니다. –

답변

6

일반적인 실수 : 비슷한 장소에 집착하는 사람들을 위해, 여기에 작업 솔루션입니다. list*N은 얕은 복사를 수행합니다. x = …; l = [x]*4에서 ll = [x,x,x,x]과 같습니다. 이제 x이 목록이면 여러 위치에서 참조를 편집합니다.

자세한 내용은 공식 Python FAQ에서 How do I create a multidimensional list?을 참조하십시오. 그러나 짧은 버전은 [x]*4 대신 [x for _ in range(4)]이라고 쓰면 x에 대한 4 개의 참조 대신에 x의 4 개의 개별 복사본이 생성됩니다.

+3

이 답변에는이를 수정하는 방법이 설명되어 있지 않습니다 (예 :'[x] * 4' 대신'[x in _ range (4)] '사용). 그러나 아마 그의 문제를 밝혀 낼 것입니다. – abarnert