用Python编写的简单双人对战五子棋游戏

news2025/1/13 3:03:39

本文是使用python创建的一个基于tkinter库的GUI界面,用于实现五子棋游戏。编辑器使用的是spyder,该工具。既方便做数据分析,又可以做小工具开发,   

首先,导入tkinter库:import tkinter as tk,这里使用tkinter库来创建GUI界面。

然后创建GobangGame类:这个类包含了五子棋游戏的逻辑和界面显示。其中,make_move函数是在玩家点击棋盘上的按钮时调用的函数,用于处理玩家的落子操作。具体来说,当玩家点击棋盘上的某个按钮时,make_move函数会被调用,并传入按钮所在的行和列的索引。然后,该函数会检查对应的棋盘位置是否为空,如果为空,则将该位置标记为当前玩家的标记('X'或'O'),并禁用对应的按钮,表示该位置已经落子。接着,函数会检查当前玩家是否获胜,如果有则显示获胜信息,并禁用所有按钮。否则,切换到另一个玩家,准备让另一个玩家继续落子。

class GobangGame:
    def __init__(self, root):
        self.root = root
        self.root.title("五子棋游戏")

        self.board = [[' ' for _ in range(15)] for _ in range(15)]
        self.current_player = 'X'

        self.buttons = [[tk.Button(root, text=' ', width=2, height=1, command=lambda i=i, j=j: self.make_move(i, j)) for j in range(15)] for i in range(15)]
        for i in range(15):
            for j in range(15):
                self.buttons[i][j].grid(row=i, column=j)

        self.status_label = tk.Label(root, text=f"当前玩家: {self.current_player}")
        self.status_label.grid(row=15, columnspan=15)

    def make_move(self, i, j):
        if self.board[i][j] == ' ':
            self.board[i][j] = self.current_player
            self.buttons[i][j].config(text=self.current_player, state='disabled')
            if self.check_winner(i, j):
                self.status_label.config(text=f"玩家 {self.current_player} 赢了!")
                for i in range(15):
                    for j in range(15):
                        self.buttons[i][j].config(state='disabled')
            else:
                self.current_player = 'O' if self.current_player == 'X' else 'X'
                self.status_label.config(text=f"当前玩家: {self.current_player}")

    def check_winner(self, i, j):
        directions = [(1, 0), (0, 1), (1, 1), (1, -1)]
        for dx, dy in directions:
            count = 1
            for k in range(1, 5):
                x, y = i + k*dx, j + k*dy
                if 0 <= x < 15 and 0 <= y < 15 and self.board[x][y] == self.current_player:
                    count += 1
                else:
                    break
            for k in range(1, 5):
                x, y = i - k*dx, j - k*dy
                if 0 <= x < 15 and 0 <= y < 15 and self.board[x][y] == self.current_player:
                    count += 1
                else:
                    break
            if count >= 5:
                return True
        return False

check_winner函数用于检查当前玩家是否获胜。它遍历四个方向(水平、垂直、正斜线、反斜线),检查是否有连续的五个棋子,如果有则返回True,表示当前玩家获胜。具体来说,该函数会对每个棋盘位置进行检查,以当前位置为起点,向四个方向(水平、垂直、正斜线、反斜线)延伸,统计相同标记的棋子数目。如果在某个方向上找到了连续的五个相同标记的棋子,就表示当前玩家获胜。

完整代码如下:

import tkinter as tk

class GobangGame:
    def __init__(self, root):
        self.root = root
        self.root.title("五子棋游戏")

        self.board = [[' ' for _ in range(15)] for _ in range(15)]
        self.current_player = 'X'

        self.buttons = [[tk.Button(root, text=' ', width=2, height=1, command=lambda i=i, j=j: self.make_move(i, j)) for j in range(15)] for i in range(15)]
        for i in range(15):
            for j in range(15):
                self.buttons[i][j].grid(row=i, column=j)

        self.status_label = tk.Label(root, text=f"当前玩家: {self.current_player}")
        self.status_label.grid(row=15, columnspan=15)

    def make_move(self, i, j):
        if self.board[i][j] == ' ':
            self.board[i][j] = self.current_player
            self.buttons[i][j].config(text=self.current_player, state='disabled')
            if self.check_winner(i, j):
                self.status_label.config(text=f"玩家 {self.current_player} 赢了!")
                for i in range(15):
                    for j in range(15):
                        self.buttons[i][j].config(state='disabled')
            else:
                self.current_player = 'O' if self.current_player == 'X' else 'X'
                self.status_label.config(text=f"当前玩家: {self.current_player}")

    def check_winner(self, i, j):
        directions = [(1, 0), (0, 1), (1, 1), (1, -1)]
        for dx, dy in directions:
            count = 1
            for k in range(1, 5):
                x, y = i + k*dx, j + k*dy
                if 0 <= x < 15 and 0 <= y < 15 and self.board[x][y] == self.current_player:
                    count += 1
                else:
                    break
            for k in range(1, 5):
                x, y = i - k*dx, j - k*dy
                if 0 <= x < 15 and 0 <= y < 15 and self.board[x][y] == self.current_player:
                    count += 1
                else:
                    break
            if count >= 5:
                return True
        return False

# 创建主窗口
root = tk.Tk()
game = GobangGame(root)
root.mainloop()

运行结果如下,支持双人对战

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1417368.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt无边框窗口拖拽和阴影

先看下效果&#xff1a; 说明 自定义窗口控件的无边框,窗口事件由于没有系统自带边框,无法实现拖拽拉伸等事件的处理,一种方法就是重新重写主窗口的鼠标事件&#xff0c;一种时通过nativeEvent事件处理。重写事件相对繁琐,我们这里推荐nativeEvent处理。注意后续我们在做win平…

HarmonyOS4.0系统性深入开发29层叠布局

层叠布局&#xff08;Stack&#xff09; 概述 层叠布局&#xff08;StackLayout&#xff09;用于在屏幕上预留一块区域来显示组件中的元素&#xff0c;提供元素可以重叠的布局。层叠布局通过Stack容器组件实现位置的固定定位与层叠&#xff0c;容器中的子元素&#xff08;子组…

maven中的version加不加SNAPSHOT的区别

我们平时开发时经常看到maven的pom.xml文件里面的包有两种 因为maven的远程仓库一般分为public(Release)和SNAPSHOT&#xff0c;前者代表正式版本&#xff0c;后者代表快照版本。 具体有什么区别呢&#xff1a; 举例说明&#xff0c;你开发了一个基础功能&#xff0c;打包发布…

bxCAN 主要特性

bxCAN 主要特性 ● 支持 2.0 A 及 2.0 B Active 版本 CAN 协议 ● 比特率高达 1 Mb/s ● 支持时间触发通信方案 发送 ● 三个发送邮箱 ● 可配置的发送优先级 ● SOF 发送时间戳 接收 ● 两个具有三级深度的接收 FIFO ● 可调整的筛选器组&#xff1a; — CAN1 和…

Execution failed for task ‘:app:compileFlutterBuildDebug‘. 解决

前言 项目场景&#xff1a;在Flutter项目中 或 在嵌入Flutter模块的Android原生项目&#xff1b; 启动场景&#xff1a;在Android原生端 编译 或 运行 项目时&#xff0c;可能出现这个异常&#xff1b; 异常 Build窗口并没有追踪到&#xff0c;引发异常代码位置&#xff0c;…

微信小程序Skyline在手机端不渲染的问题之一及其解决方式

问题&#xff1a;电脑端是skyline渲染&#xff0c;手机端是webview渲染?如何解? 开发者工具 当前渲染模式&#xff1a;Skyline 当进行预览时手机端却是: 请注意看轮播图的显示情况 请注意看轮播图的显示情况 请注意看轮播图的显示情况 从轮播图上来看,手机端是webview渲染…

[设计模式Java实现附plantuml源码~结构型]树形结构的处理——组合模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

聊聊Git合并和变基

一、 Git Merge 合并策略 1.1 Fast-Forward Merge&#xff08;快进式合并&#xff09; //在分支1下操作&#xff0c;会将分支1合并到分支2中 git merge <分支2>最简单的合并算法&#xff0c;它是在一条不分叉的两个分支之间进行合并。快进式合并是默认的合并行为&#…

【BUG】联想Y7000电池电量为0且无法充电解决方案汇总

因为最近火灾很多&#xff0c;所以昨天夜晚睡觉的时候把插线板电源关掉了&#xff0c;电脑也关机了。 各位一定要注意用电安全&#xff0c;网上的那些事情看着真的很难受qvq。 第二天早上起床的时候一看发现电脑直接没电了&#xff0c;插上电源后也是显示 你一定要冲进去啊(ू˃…

TypeScript(三) 声明变量

1.声明变量 1.1. typescript变量声明 变量是一种使用方便的占位符&#xff0c;用于引用计算机内存地址。   我们可以把变量看做存储数据的容器。   typescript变量的命名规则&#xff1a; &#xff08;1&#xff09;变量名称可以包含数字和字母。 &#xff08;2&#xff0…

flask初体验

1、定义 Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务。 中文官网 2、初步上手 1、安装flask pip3 install flask 2、创建flask应用 # -*- coding = utf-8 -*- # @Time : 2024/1/28 23:02 # @Author: Frank # @File: main.py…

unity36——原神等手游常用的物理bone(弹簧)裙摆,与Cloth(布料)裙摆插件 Magica Cloth 使用教程(一)

目前我们手游开发&#xff0c;经常会遇到头发&#xff0c;双马尾&#xff0c;长裙&#xff0c;飘带等。以前我们都是在三维软件中制作骨骼后&#xff0c;自己手动K针。这样做有一些弊端&#xff0c;时间长&#xff0c;并且K帧的飘带效果没法随着游戏中角色的移动&#xff0c;旋…

HarmonyOS鸿蒙ArkTS,封装http网络请求

HarmonyOS鸿蒙ArkTS&#xff0c;封装http网络请求 前提&#xff1a; 要想使用http请求&#xff0c;系统必须要具备ohos.permission.INTERNET权限&#xff0c;在model.json5文件中的module模块下添加如下请求权限&#xff1a; 在module.json5文件中 配置 "requestPermi…

构建外卖跑腿系统:技术实现与架构设计

在当今数字化时代&#xff0c;外卖跑腿系统已成为人们生活中不可或缺的一部分。本文将探讨如何利用先进的技术和架构设计&#xff0c;开发一个高效、可靠的外卖跑腿系统。 1. 技术选型 在开发外卖跑腿系统之前&#xff0c;我们需要仔细选择适合的技术栈&#xff0c;以确保系…

HCIP复习课(三层架构)

1、ip配置 R1&#xff1a; R2&#xff1a; SW1&#xff1a; SW2: 2、vlanif配置&#xff1a; SW1&#xff1a; SW2&#xff1a; 3、ospf配置&#xff1a; R1&#xff1a; SW1&#xff1a; SW2&#xff1a; 4、vlan配置 SW1&#xff1a; SW2&#xff1a; SW3&#xff1a; SW…

在中国如何方便地使用GPT Plus?

一、背景 通过魔法&#xff0c;顺利登录ChatGPT&#xff0c;准备升级GPT Plus时&#xff0c;发现需要国外信用卡才能支付&#xff0c;这对大多数中国人来说是不方便的。在google搜索解决方案时&#xff0c;发现了WildCard平台&#xff0c;可以一键升级 GPT Plus (GPT-4)。将基…

【开源】基于JAVA+Vue+SpringBoot的康复中心管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 普通用户模块2.2 护工模块2.3 管理员模块 三、系统展示四、核心代码4.1 查询康复护理4.2 新增康复训练4.3 查询房间4.4 查询来访4.5 新增用药 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的康复中…

BGP同步规则

BGP同步规则&#xff1a;开启同步下&#xff0c;从IBGP收到一条路由不会传给任何EBGP邻居(实验效果IBGP邻居和EBGP邻居都不传)&#xff0c;除非从自身的IGP中也学到这条路由。目的是防止AS内部出现路由黑洞&#xff0c;向外部通告了一个本AS不可达的虚假的路由。 同步规则只影响…

一道CTFsql注入的问题

打开页面一个登录框&#xff0c;我甚至都没先弱口令登录&#xff0c;直接开始sql测试&#xff0c;结果测到最后发现没有&#xff0c;直接admin/admin就就去了&#xff0c;下次遇到登录框请先测试弱口令&#xff0c;ok&#xff1f; 登录成功后&#xff1a; 这句话提示中提到了…

【QT+QGIS跨平台编译】之十五:【libTiff+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、libTiff介绍二、文件下载三、文件分析四、pro文件五、编译实践一、libTiff介绍 libTiff是一个用于处理TIFF图像文件格式的开源软件库。 TIFF(Tagged Image File Format)是一种灵活且广泛支持的图像文件格式,常用于存储照片和其他高质量图像。libTiff提供了一套…