一个象棋(编码实现)

122 阅读2分钟

当涉及到编写一个完整的象棋游戏时,需要考虑到棋盘、棋子、规则、移动验证和游戏状态等方面。在这里,我提供一个简化版的代码示例,实现了一个基本的控制台版象棋游戏。



class Chessboard:
    def __init__(self):
        self.board = [['r', 'n', 'b', 'q', 'k', 'b', 'n', 'r'],
                      ['p', 'p', 'p', 'p', 'p', 'p', 'p', 'p'],
                      ['.', '.', '.', '.', '.', '.', '.', '.'],
                      ['.', '.', '.', '.', '.', '.', '.', '.'],
                      ['.', '.', '.', '.', '.', '.', '.', '.'],
                      ['.', '.', '.', '.', '.', '.', '.', '.'],
                      ['P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'],
                      ['R', 'N', 'B', 'Q', 'K', 'B', 'N', 'R']]

    def display(self):
        for row in self.board:
            print(' '.join(row))
        print()

    def move_piece(self, start_pos, end_pos):
        start_row, start_col = start_pos
        end_row, end_col = end_pos
        piece = self.board[start_row][start_col]
        self.board[start_row][start_col] = '.'
        self.board[end_row][end_col] = piece

    def is_valid_move(self, start_pos, end_pos):
        start_row, start_col = start_pos
        end_row, end_col = end_pos
        piece = self.board[start_row][start_col]

        # 当前位置和目标位置不在范围内
        if not self.is_valid_position(start_row, start_col) or not self.is_valid_position(end_row, end_col):
            return False

        # 当前位置和目标位置是同一位置
        if start_row == end_row and start_col == end_col:
            return False

        # 检查选中棋子是否可以移动到目标位置
        # 这里只检查了一些基本规则,要完整实现棋子的移动规则还需要进一步扩展
        if piece.lower() == 'p':
            # 兵的移动规则
            if start_row == end_row - 1 and start_col == end_col:
                return True
        if piece.lower() == 'r':
            # 车的移动规则
            if start_row == end_row or start_col == end_col:
                return True
        if piece.lower() == 'n':
            # 马的移动规则
            if (abs(start_row - end_row) == 2 and abs(start_col - end_col) == 1) or \
                    (abs(start_row - end_row) == 1 and abs(start_col - end_col) == 2):
                return True
        # 其他棋子的移动规则同理...

        return False

    @staticmethod
    def is_valid_position(row, col):
        return 0 <= row < 8 and 0 <= col < 8

    def play(self):
        current_turn = 'white'
        while True:
            self.display()
            print(f"Current Turn: {current_turn.capitalize()}")
            start = input("Enter the position of the piece you want to move (e.g., 'a2'): ")
            end = input("Enter the target position for the move (e.g., 'a4'): ")
            start_row, start_col = self.convert_position(start)
            end_row, end_col = self.convert_position(end)

            if not self.is_valid_move((start_row, start_col), (end_row, end_col)):
                print("Invalid move. Please try again.\n")
                continue

            self.move_piece((start_row, start_col), (end_row, end_col))
            current_turn = 'black' if current_turn == 'white' else 'white'

    @staticmethod
    def convert_position(position):
        column = ord(position[0]) - ord('a')
        row = int(position[1]) - 1
        return row, column


# 游戏开始
chessboard = Chessboard()
chessboard.play()

这个代码示例实现了一个基本的象棋游戏,运行时会在控制台展示棋盘,并提示玩家输入起始位置和目标位置来移动棋子。代码中只实现了兵、车和马的基本移动规则,您可以根据需要进一步扩展和完善游戏规则和棋子移动逻辑。

请注意,该代码示例只是一个简化的版本,不包括图形界面和高级规则,但可以作为一个入门点。如果要实现更完整和复杂的象棋游戏,请考虑使用图形界面库(如Pygame、Tkinter等)来创建游戏界面,并根据国际象棋规则扩展棋子移动逻辑。