欢迎访问宙启技术站
智能推送

基于Python实现五子棋游戏

发布时间:2023-05-18 15:53:27

五子棋游戏是一种需要策略和技巧的好玩游戏,是许多人喜爱的棋类游戏之一。本文将基于Python语言用简单的图形化界面实现五子棋游戏。

1. 初始化界面

首先,我们需要使用Python自带的tkinter模块来实现游戏的界面。我们需要实现一个棋盘的界面,以及一些按钮和标签,用来展示游戏过程中的状态。具体实现代码如下:

import tkinter as tk
import tkinter.messagebox

BOARD_SIZE = 15  # 棋盘大小

class GobangUI:

    def __init__(self):
        self.root = tk.Tk()
        self.root.geometry('600x600')
        self.root.title('五子棋')
        
        # 棋盘
        self.canvas = tk.Canvas(self.root, bg='peru', height=600, width=600)
        for i in range(BOARD_SIZE):
            self.canvas.create_line(30, 30+i*40, 570, 30+i*40)
            self.canvas.create_line(30+i*40, 30, 30+i*40, 570)
        self.canvas.pack(side=tk.LEFT)
        
        # 标签
        self.label_turn = tk.Label(self.root, text='黑方先行')
        self.label_turn.pack()
        
        # 按钮
        self.button_restart = tk.Button(self.root, text='重新开始', command=self.restart)
        self.button_restart.pack()
        self.button_exit = tk.Button(self.root, text='退出游戏', command=self.root.quit)
        self.button_exit.pack()
        
        self.restart()

    def restart(self):
        pass
    
    def start(self):
        self.root.mainloop()
        
if __name__ == '__main__':
    ui = GobangUI()
    ui.start()

在上述代码中,我们创建了一个类GobangUI,它继承了tkinter.Frame类。在__init__方法中,我们创建了一个棋盘界面和一些按钮和标签,这里我们设置了棋盘大小为15*15,坐标为(30,30)(570,570)之间。其中标签用于显示当前轮到哪方下棋。

2. 实现游戏逻辑

接下来,我们需要实现游戏的逻辑部分。具体来说,我们需要实现以下几个功能:

- 判断某个位置是否可以落子;

- 判断游戏是否结束;

- 实现人机对战或者双人对战;

- 实现悔棋和重新开始等功能。

下面我们依次来详细讲解如何实现这些功能。

2.1 判断某个位置是否可以落子

我们可以在GobangUI类中添加一个put_chess方法,用于判断某个位置是否可以下棋。具体实现代码如下:

class GobangUI:

    ...

    def put_chess(self, row, col, chess_color):  # 在(row,col)位置放置棋子,颜色为chess_color
        if self.matrix[row][col] != 0:
            return False
        else:
            self.matrix[row][col] = chess_color
            x, y = col * 40 + 30, row * 40 + 30
            if chess_color == 1:
                self.canvas.create_oval(x-18, y-18, x+18, y+18, fill='black')
                self.label_turn.config(text='轮到白方下棋')
            else:
                self.canvas.create_oval(x-18, y-18, x+18, y+18, fill='white')
                self.label_turn.config(text='轮到黑方下棋')
            return True

其中,我们使用了一个二维数组matrix来表示当前棋盘的状态,元素值为0表示该位置没有棋子,为1表示该位置为黑棋,为2表示该位置为白棋。在进行落子操作时,我们需要检查该位置是否已经有棋子,如果有则不能落子。如果可以落子,我们就在棋盘上创建一个新的棋子并更新标签内容,以显示当前轮到哪方下棋。

2.2 判断游戏是否结束

我们可以在GobangUI类中添加一个check_winner方法,用于判断游戏是否结束。具体实现代码如下:

class GobangUI:

    ...

    def check_winner(self):
        for row in range(BOARD_SIZE):
            for col in range(BOARD_SIZE):
                if self.matrix[row][col] != 0:
                    if col+4 < BOARD_SIZE and self.matrix[row][col] == self.matrix[row][col+1] == self.matrix[row][col+2] == self.matrix[row][col+3] == self.matrix[row][col+4]:
                        return self.matrix[row][col]
                    if row+4 < BOARD_SIZE and self.matrix[row][col] == self.matrix[row+1][col] == self.matrix[row+2][col] == self.matrix[row+3][col] == self.matrix[row+4][col]:
                        return self.matrix[row][col]
                    if col+4 < BOARD_SIZE and row+4 < BOARD_SIZE and self.matrix[row][col] == self.matrix[row+1][col+1] == self.matrix[row+2][col+2] == self.matrix[row+3][col+3] == self.matrix[row+4][col+4]:
                        return self.matrix[row][col]
                    if col-4 >= 0 and row+4 < BOARD_SIZE and self.matrix[row][col] == self.matrix[row+1][col-1] == self.matrix[row+2][col-2] == self.matrix[row+3][col-3] == self.matrix[row+4][col-4]:
                        return self.matrix[row][col]
        return 0

在上述代码中,我们遍历整个棋盘,判断是否有连续的五个棋子出现。如果出现了,就返回该棋子的颜色(1代表黑色,2代表白色),表示游戏结束,否则返回0表示游戏未结束。

2.3 实现人机对战或者双人对战

我们可以在GobangUI类中添加一个play方法,用于实现人机对战或者双人对战。具体实现代码如下:

class GobangUI:

    ...

    def play(self, player1, player2):
        self.restart()
        while True:
            if self.turn == 1:  # 轮到黑方玩家下棋
                x, y = player1.get_move(self.matrix)
                if self.put_chess(x, y, self.turn):
                    winner = self.check_winner()
                    if winner != 0:
                        self.show_result(winner)
                        break
                    self.turn = 2
            else:  # 轮到白方玩家下棋
                x, y = player2.get_move(self.matrix)
                if self.put_chess(x, y, self.turn):
                    winner = self.check_winner()
                    if winner != 0:
                        self.show_result(winner)
                        break
                    self.turn = 1

在上述代码中,我们通过循环实现轮流下棋的过程,首先判断当前轮到哪方下棋,如果是黑方玩家,则调用player1.get_move()方法获取玩家输入的下棋位置,然后调用put_chess方法落子。如果是白方玩家,则调用player2.get_move()方法获取玩家输入的下棋位置。

2.4 实现悔棋和重新开始等功能

我们可以在GobangUI类中添加一些按钮和对应的事件处理方法,用于实现悔棋和重新开始等功能。具体实现代码如下:

`python

class GobangUI:

...

def back_step(self):

if len(self.history) > 0:

chess = self.history.pop()

self.matrix[chess[0]][chess[1]] = 0

self.canvas.delete(chess[2])

self.turn = 3 - self.turn