返回

用Python探索五子棋,体验智力博弈的乐趣

前端

在智力游戏爱好者的世界中,五子棋一直备受推崇,其简单的规则和难以捉摸的策略性使其成为了一款经久不衰的经典。而作为一位热衷于探究人工智能奥秘的程序员,我迫不及待地想要用Python来实现这一迷人的游戏,让更多的人领略到五子棋的独特魅力。

Python实现五子棋:棋盘搭建与棋子放置

第一步,我们从棋盘的搭建开始。五子棋的棋盘一般为15×15格,我们可以用一个二维列表来表示棋盘,其中每个元素代表一个格子,取值为0表示空,1表示黑棋,-1表示白棋。

board = [[0 for _ in range(15)] for _ in range(15)]

接下来,我们需要实现棋子放置的逻辑。玩家可以点击棋盘上的任意空格子来放置棋子。我们通过获取玩家点击的坐标,然后将相应位置的元素设置为1或-1来实现棋子放置。

def place_piece(x, y, player):
    if board[x][y] == 0:
        board[x][y] = player

判断胜负:五子连珠

五子棋的胜利条件很简单:率先在棋盘上形成五子连珠的一方获胜。我们可以用一个函数来遍历棋盘,检查每个位置是否满足连珠条件。

def check_winner(board):
    for i in range(15):
        for j in range(15):
            if abs(board[i][j]) == 1:
                # 检查水平方向
                if i + 4 < 15 and board[i][j] == board[i+1][j] == board[i+2][j] == board[i+3][j] == board[i+4][j]:
                    return board[i][j]
                # 检查垂直方向
                if j + 4 < 15 and board[i][j] == board[i][j+1] == board[i][j+2] == board[i][j+3] == board[i][j+4]:
                    return board[i][j]
                # 检查右上到左下斜线
                if i + 4 < 15 and j - 4 >= 0 and board[i][j] == board[i+1][j-1] == board[i+2][j-2] == board[i+3][j-3] == board[i+4][j-4]:
                    return board[i][j]
                # 检查左上到右下斜线
                if i - 4 >= 0 and j - 4 >= 0 and board[i][j] == board[i-1][j-1] == board[i-2][j-2] == board[i-3][j-3] == board[i-4][j-4]:
                    return board[i][j]
    return 0  # 平局

人机对战:简单人工智能

为了让五子棋游戏更具趣味性,我们可以加入一个简单的AI对手。这个AI对手可以根据一定的策略来放置棋子,例如:

  • 优先占据棋盘中心位置
  • 优先连成三子
  • 阻止对方形成四子连珠

我们可以用一个函数来实现AI对手的策略,然后在与玩家对战时调用这个函数。

def ai_move(board):
    # 寻找最佳落子位置
    best_move = None
    best_score = -1000
    for i in range(15):
        for j in range(15):
            if board[i][j] == 0:
                board[i][j] = -1  # 模拟AI落子
                score = evaluate_board(board)  # 评估棋盘局面
                board[i][j] = 0  # 撤销落子
                if score > best_score:
                    best_move = (i, j)
                    best_score = score
    return best_move

界面设计:打造沉浸式体验

为了让五子棋游戏更加生动有趣,我们可以设计一个用户界面,让玩家可以直观地操作棋盘,并提供游戏状态的反馈。我们可以使用PyQt5或其他GUI框架来实现界面设计。

from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QPushButton
from PyQt5.QtGui import QPainter, QColor, QPen

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle("五子棋")
        self.setFixedSize(500, 500)

        # 创建棋盘布局
        self.grid_layout = QGridLayout()
        self.grid_layout.setSpacing(0)
        for i in range(15):
            for j in range(15):
                btn = QPushButton()
                btn.setFixedSize(30, 30)
                btn.setStyleSheet("background-color: white")
                btn.clicked.connect(self.on_click)
                self.grid_layout.addWidget(btn, i, j)

        # 创建画布,用于绘制棋子
        self.canvas = QPainter()
        self.canvas.begin(self)
        self.canvas.setPen(QPen(QColor("black"), 2))

        self.setLayout(self.grid_layout)

    def on_click(self):
        # 获取玩家点击的位置
        btn = self.sender()
        row = self.grid_layout.indexOf(btn)
        col = self.grid_layout.columnOf(btn)

        # 判断是否可以落子
        if board[row][col] == 0:
            # 落子
            place_piece(row, col, 1)

            # 绘制棋子
            self.canvas.drawEllipse(btn.x() + 5, btn.y() + 5, 20, 20)

            # 判断胜负
            winner = check_winner(board)
            if winner != 0:
                if winner == 1:
                    self.show_message("黑方获胜")
                elif winner == -1:
                    self.show_message("白方获胜")
                else:
                    self.show_message("平局")
            else:
                # AI落子
                move = ai_move(board)
                if move is not None:
                    row, col = move
                    place_piece(row, col, -1)
                    self.canvas.drawEllipse(btn.x() + 5, btn.y() + 5, 20, 20)
                    winner = check_winner(board)
                    if winner != 0:
                        if winner == 1:
                            self.show_message("黑方获胜")
                        elif winner == -1:
                            self.show_message("白方获胜")
                        else:
                            self.show_message("平局")

    def show_message(self, message):
        # 弹出消息框显示胜负结果
        QMessageBox.information(self, "游戏结束", message)

if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())