2012-09-01 36 views
0

我花了很長時間試圖找出這個問題,我需要一雙新鮮的眼睛和一個知道蟒蛇好一點的人。國際象棋遊戲開始/設置損壞

我開始實施一款象棋遊戲來幫助我學習python,而且我基本上只實現了移動棋子並顯示棋盤。這是問題:

- 當我移動任何頂級球員的兵時,前進1或2個空間,一切都很好。

-當我向前移動任何底部球員的棋子2個空間時,一切都很好。

-當我將任何底部球員的棋子向前移動1個空格時,一切都會出錯。在顯示屏上,新位置的整行變成棋子,但是在打印結果之後,所有打開的斑點現在「屬於」底部玩家(它們應該屬於無人,0)。

我試過用相同的結果測試不同的列。

這裏的問題的說明:

SETUP

1 [R][k][B][K][Q][B][k][R] 
2 [P][P][P][P][P][P][P][P] 
3 [ ][ ][ ][ ][ ][ ][ ][ ] 
4 [ ][ ][ ][ ][ ][ ][ ][ ] 
5 [ ][ ][ ][ ][ ][ ][ ][ ] 
6 [ ][ ][ ][ ][ ][ ][ ][ ] 
7 [P][P][P][P][P][P][P][P] 
8 [R][k][B][K][Q][B][k][R] 
    a b c d e f g h 

OK

Enter a move [r0,c0,r1,s1]: [2,a,3,a] 

1 [R][k][B][K][Q][B][k][R] 
2 [ ][P][P][P][P][P][P][P] 
3 [P][ ][ ][ ][ ][ ][ ][ ] 
4 [ ][ ][ ][ ][ ][ ][ ][ ] 
5 [ ][ ][ ][ ][ ][ ][ ][ ] 
6 [ ][ ][ ][ ][ ][ ][ ][ ] 
7 [P][P][P][P][P][P][P][P] 
8 [R][k][B][K][Q][B][k][R] 
    a b c d e f g h 

OK

Enter a move [r0,c0,r1,s1]: [2,a,4,a] 

1 [R][k][B][K][Q][B][k][R] 
2 [ ][P][P][P][P][P][P][P] 
3 [ ][ ][ ][ ][ ][ ][ ][ ] 
4 [P][ ][ ][ ][ ][ ][ ][ ] 
5 [ ][ ][ ][ ][ ][ ][ ][ ] 
6 [ ][ ][ ][ ][ ][ ][ ][ ] 
7 [P][P][P][P][P][P][P][P] 
8 [R][k][B][K][Q][B][k][R] 
    a b c d e f g h 

OK

Enter a move [r0,c0,r1,s1]: [7,a,5,a] 

1 [R][k][B][K][Q][B][k][R] 
2 [P][P][P][P][P][P][P][P] 
3 [ ][ ][ ][ ][ ][ ][ ][ ] 
4 [ ][ ][ ][ ][ ][ ][ ][ ] 
5 [P][ ][ ][ ][ ][ ][ ][ ] 
6 [ ][ ][ ][ ][ ][ ][ ][ ] 
7 [ ][P][P][P][P][P][P][P] 
8 [R][k][B][K][Q][B][k][R] 
    a b c d e f g h 

??不行? - (移動後,所有「空白」空間屬於底部播放器,並且所有行6(如下所示)的具有類型變量集合典當)

Enter a move [r0,c0,r1,s1]: [7,a,6,a] 

1 [R][k][B][K][Q][B][k][R] 
2 [P][P][P][P][P][P][P][P] 
3 [ ][ ][ ][ ][ ][ ][ ][ ] 
4 [ ][ ][ ][ ][ ][ ][ ][ ] 
5 [ ][ ][ ][ ][ ][ ][ ][ ] 
6 [P][P][P][P][P][P][P][P] 
7 [ ][P][P][P][P][P][P][P] 
8 [R][k][B][K][Q][B][k][R] 
    a b c d e f g h 

和代碼:

#!/usr/bin/python 

import sys 

# This is easy to solve with a simple tiny wrapper: 
class Callable: 
    def __init__(self, anycallable): 
     self.__call__ = anycallable 

class Piece: 
    Arr_Slot = 0 
    Row = 0 
    Col = 0 
    Sym = "[ ]" 
    Id = "" 
    Player = 0 
    def __init__(self, row, col, player): 
     self.Row = row 
     self.Col = col 
     self.Player = player 
     self.Arr_Slot = self.Arr_Slot + 1 

class Blank(Piece): 
    Sym = "[ ]" 
    Id = "Blank" 
    Row = 0 
    Col = 0 
    def __init__(self,row,col): 
     self.Row = row 
     self.Col = col 

class King(Piece): 
    Sym = "[K]" 
    Id = "King" 

class Queen(Piece): 
    Sym = "[Q]" 
    Id = "Queen" 

class Rook(Piece): 
    Sym = "[R]" 
    Id = "Queen" 

class Bishop(Piece): 
    Sym = "[B]" 
    Id = "Bishop" 

class Knight(Piece): 
    Sym = "[k]" 
    Id = "Knight" 

class Pawn(Piece): 
    Sym = "[P]" 
    Id = "Pawn" 
    def TryMove(board,row0,col0,row1,col1): 
     type = board.Board[row0][col0].Id 
     player = board.Board[row0][col0].Player 

    if player == 1: 
     if (row1 == (row0+1) or ((row1 == (row0+2)) and row0 == 1)) and (col0 == col1): 
      if board.Board[row1][col1].Player != player: 
       board.Board[row1][col1].Sym = board.Board[row0][col0].Sym 
       board.Board[row1][col1].Id = board.Board[row0][col0].Id 
       board.Board[row1][col1].Player = board.Board[row0][col0].Player 
       board.MakeBlank(row0,col0) 
       return 1 
      else: 
       print "Error: Spot taken by same player" 
       return 0 
     else: 
      print "Error: Illegal move" 
      return 0 
    elif player == 2: 
     if (row1 == (row0-1) or ((row1 == (row0-2)) and row0 == 6)) and (col0 == col1): 
      if board.Board[row1][col1].Player != player: 
       board.Board[row1][col1].Sym = board.Board[row0][col0].Sym 
       board.Board[row1][col1].Id = board.Board[row0][col0].Id 
       board.Board[row1][col1].Player = board.Board[row0][col0].Player 
       board.MakeBlank(row0,col0) 
       return 1 
      else: 
       print "Error: Spot taken by same player" 
       return 0 
     else: 
      print "Error: Illegal move" 
      return 0 
    else: 
     print "Error: Don't own that spot" 
    TryMove = Callable(TryMove) 

class Board: 
    """The game board""" 
    Board_Dims = 8 
    Arr_Slot = 0 
    Board = [] 
    def __init__(self): 
     self.Board = [[Piece for i in range(self.Board_Dims)] for j in range(self.Board_Dims)] 

    def AddPiece(self, Piece): 
     self.Board[Piece.Row][Piece.Col] = Piece 
     self.Board[Piece.Row][Piece.Col].Arr_Slot = self.Arr_Slot 
     self.Arr_Slot = self.Arr_Slot + 1 
    def MakeBlank(self,row,col): 
     self.Board[row][col].Sym = "[ ]" 
     self.Board[row][col].Id = "Blank" 
     self.Board[row][col].Player = 0 
    def PrintBoard(self): 
     sys.stdout.write("\n") 
     for i in range(self.Board_Dims): 
      sys.stdout.write(str(i+1) + " ") 
      for j in range(self.Board_Dims): 
       sys.stdout.write(self.Board[i][j].Sym) 
      sys.stdout.write("\n") 
     sys.stdout.write(" a b c d e f g h\n") 
    def TryMove(self, row0, col0, row1, col1): 
     type = self.Board[row0][col0].Id 
     player = self.Board[row0][col0].Player 
     if type == "Blank": 
      print "Error: No piece there" 
      return 0 
     if type == "Pawn": 
      return Pawn.TryMove(self,row0,col0,row1,col1) 


GameBoard = Board() 

GameBoard.AddPiece(King(0,3,1)) 
GameBoard.AddPiece(Queen(0,4,1)) 
GameBoard.AddPiece(Rook(0,0,1)) 
GameBoard.AddPiece(Rook(0,7,1)) 
GameBoard.AddPiece(Knight(0,1,1)) 
GameBoard.AddPiece(Knight(0,6,1)) 
GameBoard.AddPiece(Bishop(0,2,1)) 
GameBoard.AddPiece(Bishop(0,5,1)) 
for i in range(GameBoard.Board_Dims): 
GameBoard.AddPiece(Pawn(1,i,1)) 

GameBoard.AddPiece(King(7,3,2)) 
GameBoard.AddPiece(Queen(7,4,2)) 
GameBoard.AddPiece(Rook(7,0,2)) 
GameBoard.AddPiece(Rook(7,7,2)) 
GameBoard.AddPiece(Knight(7,1,2)) 
GameBoard.AddPiece(Knight(7,6,2)) 
GameBoard.AddPiece(Bishop(7,2,2)) 
GameBoard.AddPiece(Bishop(7,5,2)) 

for j in range(GameBoard.Board_Dims): 
GameBoard.AddPiece(Pawn(6,j,2)) 

for i in range(2,5): 
for j in range(GameBoard.Board_Dims): 
    GameBoard.AddPiece(Blank(i,j)) 

GameBoard.PrintBoard() 
result = 1 
while 1: 
inp = raw_input("Enter a move [r0,c0,r1,s1]: ") 
r1 = int(inp[1])-1 
c1 = int(ord(inp[3]))-97 
r2 = int(inp[5])-1 
c2 = int(ord(inp[7]))-97 
result = GameBoard.TryMove(r1,c1,r2,c2) 
if result == 0: 
    print "ERROR: TRY AGAIN" 
print GameBoard.Board[3][3].Player 
print GameBoard.Board[3][3].Sym 
GameBoard.PrintBoard()  

談到這些行了:

board.Board[row1][col1].Sym = board.Board[row0][col0].Sym 
board.Board[row1][col1].Id = board.Board[row0][col0].Id 
board.Board[row1][col1].Player = board.Board[row0][col0].Player 

使得它基本上什麼都不做,所以我想你可以說這是哪裏出了問題,但它適用於相反的球員,這是相同的代碼,所以這就是爲什麼我對於wh不確定以太問題實際上是在這些方面。

任何幫助,非常感謝。

回答

0

我會採取完全不同的方法,而是採用了存儲位置和空白,我將存儲在安裝中產生的32個Piece S上的位置信息,並只使用Board類來存儲它的片段列表Board.draw()

eg沿線的東西:

class Piece(object): 
    symbol = " " 
    name = None 
    def __init__(self, side, col, row): 
     self.side = side 
     self.col = col 
     self.row = row 

class Pawn(Piece): 
    symbol = "P" 
    name = "Pawn" 
    def __init__(self, side, col): 
     if side == "white": 
      row = 2 
     else: 
      row = 7 
     super(Pawn, self).__init__(self, side, col, row) 
    def move(col, row): 
     if self.check_if_move_is_valid(col, row): 
      self.col = col 
      self.row = row 

... same for other pieces... 

class Board(object): 
    def __init__(self): 
     self.pieces = list() 
     for col in range(1,9): 
      self.pieces.append(Pawn("white", col)) 
      self.pieces.append(Pawn("black", col)) 
     self.pieces.append(Rook("white"), 1) 
     self.pieces.append(Rook("black"), 8) 
     ... etc ... 

    def draw(): 
     grid = create_empty_grid(8) 
     for piece in self.pieces: 
      grid[piece.row][piece.col] = piece.symbol 
     for row in grid: 
      print ''.join(row) 
+0

因此,要檢查一個片段在給定的位置,這是否需要循環所有的作品,並看着他們的行/列?我想這部分是我的理由,讓董事會對象跟蹤這些部分。 – prelic

+0

是的,不幸的。 – Kimvais