0

私はこの問題を理解するために長い時間を費やしてきました。新しい目とPythonをもう少しよく知っている人が必要です。

私はPythonを学ぶのを助けるためにチェスゲームを実装し始めました、そして私は基本的にポーンを動かしてボードを表示することだけを実装しました。問題は次のとおりです。

-トッププレーヤーのポーンのいずれかを1スペースまたは2スペース前方に移動すると、すべてが正常になります。

-一番下のプレイヤーのポーンのいずれかを2スペース前方に移動すると、すべてが正常になります。

-一番下のプレイヤーのポーンのいずれかを1スペース前方に移動すると、すべてがうまくいきません。ディスプレイでは、新しい位置の行全体がポーンに変わりますが、結果を印刷した後、すべてのオープンスポットは最下位のプレーヤーに「属します」(誰にも属さないはずです、0)。

同じ結果で異なる列をテストしてみました。

これが問題の実例です:

設定

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

わかった

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

わかった

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

わかった

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のすべて(以下に示す)の型変数はpawnに設定されています)

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

基本的に何もしないので、これが問題の原因だと言えるかもしれませんが、反対のプレーヤーでも機能し、同じコードなので、問題が実際にこれらの行にあるかどうかはわかりません。 。

どんな助けでも大歓迎です。

4

1 に答える 1

0

ボードを使用して位置と空白のピースを格納する代わりに、まったく異なるアプローチを取り、Pieceセットアップ時に生成された32秒間に位置情報を格納しBoard、クラスのみを使用してピースのリストを格納します。Board.draw()

例:線に沿った何か:

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)
于 2012-09-01T06:14:54.430 に答える