大数跨境
0
0

用python做个五子棋游戏(可复制源代码)

用python做个五子棋游戏(可复制源代码) 趣聊科技圈
2024-10-02
1

五子棋游戏设计(Python版)

效果演示

hello,大家好,我是程序员黎明 ,作为一个热爱技术分享的博主,我今天想和大家聊一聊如何用Python设计一个简单的五子棋游戏。五子棋这个游戏规则简单,但也很容易激发思考,特别是在编程实现的过程中,能够锻炼逻辑能力。

首先,我们需要明确五子棋的基本规则:

  1. 玩家在19×19的棋盘上轮流下子。
  2. 任意一方首先在横、竖、或斜线上连成五个同色棋子即为获胜。
  3. 棋子不可覆盖已落下的子。

为了实现这个游戏,我们可以使用Python的tkinter库来创建一个简单的图形用户界面。tkinter能够让我们用少量代码实现直观的棋盘界面,用户点击屏幕就能下子。

项目步骤

  1. 棋盘的绘制:我们将创建一个19×19的网格来模拟五子棋的棋盘。
  2. 落子机制:检测玩家点击棋盘的坐标,并根据当前玩家下子。
  3. 胜负判定:每次下子后,判断当前下子是否已经连成五子。
  4. 游戏交互:实现简单的提示机制,比如显示当前轮到哪位玩家下子,以及游戏结束后的提示。

代码实现

import tkinter as tk
from tkinter import messagebox
# 定义棋盘的大小和棋子的半径
BOARD_SIZE = 19
GRID_SIZE = 30
STONE_RADIUS = 14
class Gomoku:
    def __init__(self, root):
        self.root = root
        self.root.title("五子棋教学")
        self.canvas = tk.Canvas(self.root, width=GRID_SIZE*BOARD_SIZE, height=GRID_SIZE*BOARD_SIZE)
        self.canvas.pack()
        self.current_player = 'black'  # 黑子先手
        self.board = [[None for _ in range(BOARD_SIZE)] for _ in range(BOARD_SIZE)]
        self.draw_board()
        self.canvas.bind("<Button-1>", self.on_click)
    def draw_board(self):
        """绘制棋盘"""
        for i in range(BOARD_SIZE):
            self.canvas.create_line(GRID_SIZE * i, 0, GRID_SIZE * i, GRID_SIZE * BOARD_SIZE)
            self.canvas.create_line(0, GRID_SIZE * i, GRID_SIZE * BOARD_SIZE, GRID_SIZE * i)
        print("棋盘已经画好,现在可以开始下子了!")
    def on_click(self, event):
        """处理点击事件,下子"""
        x = event.x // GRID_SIZE
        y = event.y // GRID_SIZE
        if self.board[y][x] is None:  # 判断是否已经有棋子
            self.place_stone(x, y)
            if self.check_win(x, y):
                messagebox.showinfo("游戏结束"f"{self.current_player} 获胜!")
                self.canvas.unbind("<Button-1>")  # 禁用鼠标点击事件
            else:
                self.switch_player()

    def place_stone(self, x, y):
        """在指定位置放置棋子"""
        x_pos = x * GRID_SIZE + GRID_SIZE // 2
        y_pos = y * GRID_SIZE + GRID_SIZE // 2
        color = 'black' if self.current_player == 'black' else 'white'
        self.canvas.create_oval(x_pos - STONE_RADIUS, y_pos - STONE_RADIUS,
                                x_pos + STONE_RADIUS, y_pos + STONE_RADIUS, fill=color)
        self.board[y][x] = self.current_player
        print(f"{self.current_player} 在位置 ({x}{y}) 落子")

    def check_win(self, x, y):
        """检查是否有玩家获胜"""
        directions = [(10), (01), (11), (1-1)]  # 横、竖、正斜、反斜
        for dx, dy in directions:
            count = 1
            count += self.count_stones(x, y, dx, dy)
            count += self.count_stones(x, y, -dx, -dy)
            if count >= 5:
                return True
        return False
    def count_stones(self, x, y, dx, dy):
        """计算同方向的相同颜色棋子数量"""
        count = 0
        player = self.board[y][x]
        i, j = x + dx, y + dy
        while 0 <= i < BOARD_SIZE and 0 <= j < BOARD_SIZE and self.board[j][i] == player:
            count += 1
            i += dx
            j += dy
        return count

    def switch_player(self):
        """切换玩家"""
        self.current_player = 'white' if self.current_player == 'black' else 'black'
        print(f"现在轮到 {self.current_player} 下子了")
# 启动游戏
if __name__ == "__main__":
    root = tk.Tk()
    game = Gomoku(root)
    root.mainloop()

代码讲解

  • Gomoku类是我们游戏的核心,它负责棋盘的绘制、用户点击的处理以及胜负的判断。
  • draw_board()负责画出19×19的棋盘。
  • on_click()函数处理玩家的点击事件,通过点击位置计算出棋盘坐标,然后调用place_stone()函数下子。
  • check_win()负责检测玩家是否已经获胜,通过在四个方向上连续计算相同颜色的棋子数量来判断。

文章总结

通过这个简单的五子棋游戏,我们不仅能够学习Python的基本GUI编程,还可以进一步理解如何实现游戏中的交互和胜负判断。如果你有任何问题或希望了解更多,欢迎在评论区留言,我会一一解答!


【声明】内容源于网络
0
0
趣聊科技圈
🧐探索科技,发现乐趣。🤩带你玩遍科技好物!
内容 511
粉丝 0
趣聊科技圈 🧐探索科技,发现乐趣。🤩带你玩遍科技好物!
总阅读484
粉丝0
内容511