【python小游戏】五子棋

目录

游戏简介

实现的基本功能

主要的方法

游戏界面

完整代码

 


游戏简介

五子棋,也称为连珠游戏,是一种传统的二人对弈游戏。玩家轮流在棋盘上落子,目标是在横、竖、斜的任意方向上先形成连续的五颗棋子,即五子连珠,以获得胜利。游戏规则简单,但是策略性很强,需要玩家在防守和进攻之间取得平衡,找到最佳的落子位置,以击败对手。

实现的基本功能

  1. 创建了一个图形化界面,用于展示棋盘和交互操作。
  2. 实现了玩家在棋盘上落子的功能,通过点击棋盘上的按钮来放置对应的棋子。
  3. 实现了简单的胜负判断逻辑,检查是否有玩家在横、竖、斜的任意方向上形成连续的五颗棋子。
  4. 提供了重置棋盘的功能,可以清空棋盘上的所有棋子,重新开始游戏。

主要的方法

  • __init__: 初始化游戏窗口,设置窗口标题、大小(15×15)等参数。
  • create_board_buttons: 创建棋盘按钮,每个按钮代表棋盘上的一个格子。
  • place_piece: 玩家落子的操作,根据玩家的点击在棋盘上放置对应的棋子,并检查是否有玩家获胜。
  • check_winner: 判断指定玩家是否获胜,通过检查行、列、对角线上是否有连续五颗相同的棋子来判断。
  • check_direction: 检查指定方向上是否存在连续五颗相同的棋子。
  • reset_board: 重置棋盘状态,清空棋盘上的所有棋子。

游戏界面

游戏界面

结果弹窗

完整代码

import tkinter as tk
from tkinter import messagebox


class FiveInARow(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Five in a Row")  # 设置窗口标题

        self.board_size = 15  # 棋盘大小
        self.board = [['.' for _ in range(self.board_size)] for _ in range(self.board_size)]  # 初始化棋盘状态
        self.players = ['X', 'O']  # 玩家标记
        self.current_player = 0  # 当前玩家(0代表'X',1代表'O')

        self.create_board_buttons()  # 创建棋盘按钮

    def create_board_buttons(self):
        # 创建棋盘按钮,每个按钮代表一个棋盘格子
        self.buttons = [[tk.Button(self, text=' ', font=('Arial', 12), width=2, height=1,
                                   command=lambda r=row, c=col: self.place_piece(r, c))
                         for col in range(self.board_size)] for row in range(self.board_size)]

        # 将棋盘按钮放置在窗口中
        for row in range(self.board_size):
            for col in range(self.board_size):
                self.buttons[row][col].grid(row=row, column=col)
       
        # 将棋盘置于窗口中间
        self.center_board()

    def center_board(self):
        # 计算窗口居中位置
        window_width = self.winfo_reqwidth()
        window_height = self.winfo_reqheight()
        screen_width = self.winfo_screenwidth()
        screen_height = self.winfo_screenheight()
        x = (screen_width - window_width) // 2
        y = (screen_height - window_height) // 2
        self.geometry(f'+{x}+{y}')  # 设置窗口位置

    def place_piece(self, row, col):
        # 玩家在棋盘上落子的操作
        if self.board[row][col] == '.':  # 检查当前位置是否为空
            player = self.players[self.current_player]  # 获取当前玩家标记
            self.board[row][col] = player  # 更新棋盘状态
            self.buttons[row][col].config(text=player)  # 更新按钮显示

            if self.check_winner(player):  # 检查是否有玩家获胜
                messagebox.showinfo("Game Over", f"Player {player} wins!")  # 弹出获胜提示框
                self.reset_board()  # 重置棋盘
            else:
                self.current_player = (self.current_player + 1) % 2  # 切换到下一个玩家

    def check_winner(self, player):
        # 判断指定玩家是否获胜
        # 需要检查行、列、对角线上是否有连续5颗相同的棋子
        for i in range(self.board_size):
            for j in range(self.board_size):
                if self.board[i][j] == player:
                    # 检查四个方向是否存在连续5颗相同的棋子
                    if self.check_direction(i, j, 1, 0, player) or \
                            self.check_direction(i, j, 0, 1, player) or \
                            self.check_direction(i, j, 1, 1, player) or \
                            self.check_direction(i, j, 1, -1, player):
                        return True
        return False

    def check_direction(self, row, col, dr, dc, player):
        # 检查指定方向上是否存在连续5颗相同的棋子
        count = 0
        while 0 <= row < self.board_size and 0 <= col < self.board_size and self.board[row][col] == player:
            count += 1
            row += dr
            col += dc
        return count >= 5

    def reset_board(self):
        # 重置棋盘状态,清空棋盘上的所有棋子
        for row in range(self.board_size):
            for col in range(self.board_size):
                self.board[row][col] = '.'
                self.buttons[row][col].config(text=' ')


if __name__ == "__main__":
    app = FiveInARow()
    app.mainloop()

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

turtleSteps

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值