Python-井字棋

井字棋

  • 1.设计登录界面
    • 1.1导入需要的工具包
    • 1.2窗口显示
    • 1.3登录界面图片显示
    • 1.6标签按钮输入框显示
  • 2.登录功能实现
    • 2.1用户数据存储
  • 2.2登录和注册
    • 2.2.1登录功能实现
    • 2.2.2注册功能实现
  • 3.井字棋游戏
    • 3.1 导入需要的工具包
    • 3.2 窗口显示
    • 3.2 按钮标签显示
    • 3.3 棋盘设置初始状态
    • 3.4 游戏设计
      • 3.4.1创建白布
      • 3.4.2 画出九宫格
  • 在每个格子中心绘制数字或 "X"
  • 3.6设置输赢条件
  • 3.7 进一步处理用户输入
  • 3.8设置AI步数
  • 3.9 清空棋盘状态
  • 效果图

1.设计登录界面

1.1导入需要的工具包

import tkinter as tk
from PIL import Image, ImageTk
import pickle
from tkinter import messagebox
import subprocess

1.2窗口显示

window = tk.Tk()
window.title("Welcome")
window.geometry('500x600')

1.3登录界面图片显示

image = Image.open("welcome.gif")
photo = ImageTk.PhotoImage(image)

函数解析 ImageTk.PhotoImage 是 Python 中用于处理图像的模块,通常与 PIL(Python Imaging
Library)一起使用。它允许你在 Tkinter 程序中加载和显示图像。
1.5 用户名设置默认值

value = "GaoYue"
entry_var = tk.StringVar(window)
entry_var.set(value)

解释:
创建了一个StringVar对象entry_var,用于绑定到一个Entry控件,以便可以在用户输入时更新该控件的值。然后,给entry_var设置了一个初始值value,这样在Entry控件中显示的文本就是value的值,并设置初始值为@qq.com,这样在Entry控件中显示的文本就是。

1.6标签按钮输入框显示

label1_image = tk.Label(window,image=photo)
label1_image.place(x=10,y=10)
label2 = tk.Label(window,text='User name',width=10,height=5)
label2.place(x=40,y=130)
label3 = tk.Label(window,text='password',width=10,height=5)
label3.place(x=40,y=180)
label4 = tk.Entry(window,width=30,bd=5)
label4.place(x=140,y=210)
label5 = tk.Entry(window,textvariable=entry_var,width=30,bd=5)
label5.place(x=140,y=160)button1 = tk.Button(window,text='Loign',width=10,command=usr_login)
button1.place(x=140,y=280)
button2 = tk.Button(window,text='Sign up',width=10,command=usr_sign_up)
button2.place(x=250,y=280)

2.登录功能实现

2.1用户数据存储

def usr_login():usr_name = label5.get()usr_pwd=label4.get()print(usr_name)try:with open("usrs_info.pickle",'rb') as usr_file:print("1")usrs_info = pickle.load(usr_file)print(usrs_info)except FileNotFoundError:with open("usrs_info.pickle",'wb') as usr_file:print("2")usrs_info = {'admin':'admin'}pickle.dump(usrs_info,usr_file)

解释:

两个输入框(label5,label4)使用get()函数,获取用户输入的数据,接下来使用使用了Python中的异常处理机制。在try使用with语句打开"usrs_info.pickle"文件,设置为只读二进制模式,将”usrs_info.pickle”二进制文件加载到内存里面,转换到usrs_info变量中,输出出来。当读取的文件不存在报错时,跳转到except代码块中执行相应的异常处理,使用with语句打开二进制写入模式打开文件,文件不存在时创建相对应文件,用一个变量(usrs_info)接收一个字典(
{‘admin’:‘admin’})用来存储用户信息或者账户信息,用于验证用户身份,将字典序列化为字节流(二进制数据)并写入usr_file文件中永久保存。

2.2登录和注册

2.2.1登录功能实现

print("ok")
print("usr_name:",usr_name)
if usr_name in usrs_info:print("3")if usr_pwd  == usrs_info[usr_name]:tk.messagebox.showinfo(title="Welcome",message="How are you"+usr_name)tk.messagebox.showinfo(title="Game Start", message="Let's start the game!")subprocess.run(["python", "飞机大战.py"])else:tk.messagebox.showerror(message="Error,your password is wrong,try again.")
else:print("4")is_sign_up = tk.messagebox.askyesno(title="Welcome",message="You have not sign up yet.sign up today?")

解释:
If语句如果用户名在字典中执行下一个if语句用户密码是否等于usrs_info中键usr_name的值,如果等于弹出消息框((title=“Welcome”,message=“How
are you”+usr_name),(title=“Game Start”, message=“Let’s start the
game!”),使用subprocess.run函数以python解释器,执行井字棋.py文件,如果不等于弹出消息框(message=“Error,your
password is wrong,try
again.”),如果第一个if语句没有达到条件,弹出一个对话框,内容是title=“Welcome”,message=“You have
not sign up yet.sign up today?”。

2.2.2注册功能实现

def sign_up():nn = entry9.get()np = entry10.get()npf = entry11.get()with open('usrs_info.pickle','rb') as usr_file:exist_usr_info = pickle.load(usr_file)if np != npf:tk.messagebox.showerror("Error","The user has already signed up!")elif nn in exist_usr_info:print("已经注册过了")tk.messagebox.showerror("Error","The user has already signed up!")else:exist_usr_info[nn] = npwith open("usrs_info.pickle","wb") as usr_file:pickle.dump(exist_usr_info,usr_file)tk.messagebox.showinfo("Welcome","You have successfully signed up!")window.destroy()
button3 = tk.Button(window, text='Sign up', width=10,command=sign_up)
button3.place(x=140, y=150)
print("开始注册")

解释:
三个输入框获取用户输入的用户名,注册密码,重复密码,打开二进制文件,将二进制文件数据转换为python对象,用一个变量exist_usr_info保存,然后if判断注册密码是否与重复密码相等,如果不相等就弹出消息框(“Error”,“The
user has already signed
up!”),反之文件中的用户名中的密码等于注册密码,将变量exist_usr_info中的数据通过with语句和pickle函数保存在二进制文件中,然后弹出消息框(“Welcome”,“You
have successfully signed up!”),窗口销毁,将函数sign_up与按钮进行连接,最后输入开始注册。

3.井字棋游戏

3.1 导入需要的工具包

import tkinter as tk
from tkinter import messagebox

3.2 窗口显示

window = tk.Tk()
window.geometry("600x500")
window.title("Welcome")

3.2 按钮标签显示

label2 = tk.Label(text="请输入要落下棋子的位置(1-9):", width=30, height=2)
label2.pack()
label2.place(x=190, y=310)
entry2 = tk.Entry(width=20)
entry2.pack()
entry2.place(x=220, y=350)
button11 = tk.Button(text="落下棋子", width=10, height=2,command=message2)
button11.pack()
button11.place(x=250, y=380)
button22 = tk.Button(text="重新开始", width=10, height=2)
button22.pack()
button22.place(x=250, y=430)

解释: 设置标签和按钮,按钮与函数相连接

3.3 棋盘设置初始状态

gameover = False
board = ['']*9
step = 0

解释: 设置游戏初始化为结束,设置棋盘状态为九个空字符串的列表,step为初始化棋盘步数为0

3.4 游戏设计

3.4.1创建白布

canvas = tk.Canvas(window, width=300, height=300, bg="white")
canvas.pack()

函数解析: tk.Canvas 是 Tkinter
中用于绘制图形的组件,你可以在其中绘制直线、矩形、椭圆等形状,也可以放置文本、图像等元素。

3.4.2 画出九宫格

def draw_nume(canvas,width,height,line_color='black'):cell_width = width / 3cell_height = height / 3for i in range(3):x = i * cell_widthcanvas.create_line(x, 0, x, height, fill=line_color)  # 垂直线for i in range(3):y = i * cell_heightcanvas.create_line(0, y, width, y, fill=line_color)  # 水平线

解释:
定义一个draw_nume函数传入形参(canvas,width,height,line_color=‘black’),’line_color='black’表示线条颜色,width,height,cell_width
= width / 3和cell_height = height / 3计算了每个单元格的宽度和高度,第一个for循环是画垂直线(起点坐标,终点坐标) fill=line_color填充方式为线条,计算当前列的
x 坐标为 i * cell_width。第二个for循环是画水平线,计算当前行的 y坐标为 i *
cell_height,canvas.create_line()画水平线。

在每个格子中心绘制数字或 “X”

for i in range(3):for j in range(3):x = i * cell_width + cell_width / 2y = j * cell_height + cell_height / 2index = i * 3 + jif board[index] == 'X':canvas.create_text(y, x, text="X", font=("Helvetica", 20))else:canvas.create_text(y, x, text=str(index + 1), font=("Helvetica", 20))

解释: 第一个for循环为行的中心位置,第二个for循环为列的中心位置,在x,y找到中心位置 index = i * 3 +
j是在九宫格上写上数字的索引,如果board[index] == ‘X’:,就在x,y的中心位置画X,如果不是在index索引加一。
3.5设置输入限制

def message():Iemet = entry2.get()if not Iemet.isdigit():tk.messagebox.showinfo("输入错误", "请输入一个数字。")elif int(Iemet) > 9:tk.messagebox.showinfo("输入错误", "输入的数字不能大于 9。")

解释: 如果判断不是数字,弹出消息框(“输入错误”, “请输入一个数字。”),接着判断输入的是大于9 的弹出消息框(“输入错误”,
“输入的数字不能大于 9。”)

3.6设置输赢条件

def iswins():global gameoverwins = [[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]for w in wins:if (board[w[0]]!=" " and board[w[0]]==board[w[1]]==board[w[2]]):gameover = Truetk.messagebox.showinfo(title="你别挣了",message="我赢了")returnif step>=5:gameover =Truereturn tk.messagebox.showinfo(title="你别挣了",message="都没有赢了")return

解释:
定义全局变量gameover,列出所有的用户赢的可能,for循环用与循环遍历wins列表,if条件使用索引board[w[0]],w的第一个数不能为空,判断board[w[0]]的第一个数和第二个数和第三个数是否相等,如果相等就是wins列表中的一个赢的可能,弹出消息框(title=“你别挣了”,message=“我赢了”),返回,第二个if条件如果我方步数大于等于5返回消息框(title=“你别挣了”,message=“都没有赢了”),返回。

3.7 进一步处理用户输入

def message2():global boardglobal stepIemet = entry2.get()if Iemet.isdigit():number = int(Iemet)if 1 <= number <= 9:index = number - 1board[index] = 'X'draw_nume(canvas, 300, 300)is_Win()step +=1

解释:
定义两个全局变量,获取输入框文本,if语句检查用户输入的文本是否为数字,接着if语句判断是否在1到9之间(包括1-9),井字棋游戏板上的索引位置标记为
‘X’,表示用户的棋子,这是一个函数调用,用来在画布上绘制新的游戏板,调用一个函数is_Win(),用来检查是否获胜,这一行代码增加游戏的步数,以便在每一步后进行检查。将函数放置在按钮上。

3.8设置AI步数

index = ai.AI().decide("AI","高越",board)
r = 20
canvas.create_oval()
board[index] = "AI"
iswins()

解释: 调用了 ai.AI().decide(“AI”,“高越”,board),圆的半径为20,设置棋盘数据为”AI”。

3.9 清空棋盘状态

def reset():global canvascanvas.delete('A')

使用canvas.delete函数清空棋盘状态

效果图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

ChatUI:使用Gradio.NET为LLamaWorker快速创建大模型演示界面

Gradio.NET 是 Gradio 的.NET 移植版本。它是一个能够助力迅速搭建机器学习模型演示界面的库&#xff0c;其提供了简洁的 API&#xff0c;仅需寥寥数行代码就能创建出一个具备交互性的界面。在本篇文章中&#xff0c;我们将会阐述如何借助 Gradio.NET 为 LLamaWorker 快捷地创建…

新需求:如何实现一个ShardingSphere分库分表平台

大家好&#xff0c;目前我们正面对一个既具挑战又令人兴奋的任务——构建一套高效、稳定的数据处理系统&#xff0c;特别是一个结合了SpringBoot、ShardingSphere、MyBatisPlus和MySQL技术的综合数据分库分表平台。简单来说&#xff0c;我们要做的就是打造一个能轻松应对大数据…

企智汇软件:机电工程项目管理系统智能化管理,洞悉项目全貌!

在机电工程领域&#xff0c;项目管理的复杂性要求系统不仅要能够处理大量的数据和信息&#xff0c;还要能够提供实时的洞察和分析&#xff0c;以支持快速而明智的决策。企智汇机电工程项目管理系统正是为了满足这些需求而设计的&#xff0c;它通过一系列先进的功能&#xff0c;…

计算机专业课面试常见问题-计算机网络篇

目录 1. 计算机网络分为哪 5 层&#xff1f; 2. TCP 协议简述&#xff1f; 3. TCP 和 UDP 的区别&#xff1f;->不同的应用场景&#xff1f; 4. 从浏览器输入网址到显示页…

ES6深潜指南:解锁JavaScript类与继承的高级技巧,让您的代码更加优雅

前言 随着前端技术的迅猛发展&#xff0c;JavaScript已经成为构建现代Web应用不可或缺的编程语言。ES6&#xff08;ECMAScript 2015&#xff09;引入了许多期待已久的特性&#xff0c;其中类&#xff08;Classes&#xff09;和继承机制的引入&#xff0c;极大地增强了JavaScrip…

基于 elementUI / elementUI plus,实现 主要色(主题色)的一件换色(换肤)

一、效果图 二、方法 改变elementUI 的主要色 --el-color-primary 为自己选择的颜色&#xff0c;核心代码如下&#xff1a; // 处理主题样式 export function handleThemeStyle(theme) {document.documentElement.style.setProperty(--el-color-primary, theme) } 三、全部代…

OutOfMemoryError能被catch(Exception)捕获吗?

背景 写了一个 Kafka 消费者程序&#xff0c;Kafka 集群中数据量过大时&#xff0c;消费线程无故退出了&#xff0c;日志打印了心跳 OOM 异常信息&#xff1a; 但是消费线程里面的 run 方法里面明明包含了 catch (Exception e) &#xff0c;结尾信息没有打印异常&#xff0c;…

2024全网最全面及最新且最为详细的网络安全技巧四 之 sql注入以及mysql绕过技巧 (2)———— 作者:LJS

目录 4.5 DNS记录类型介绍(A记录、MX记录、NS记录等&#xff0c;TXT&#xff0c;CNAME&#xff0c;PTR) 4.5.1 DNS 4.5.2 A记录 4.5.3NS记录 4.5.4 MX记录 4.5.5 CNAME记录 4.5.6 TXT记录 4.5.7 泛域名与泛解析 4.5.8域名绑定 4.5.9 域名转向 4.6 Mysql报错注入之floor报错详解…

【Mac】王国保卫战:起源 for mac(塔防策略游戏)游戏介绍和安装教程

游戏介绍 《王国保卫战&#xff1a;起源》&#xff08;Kingdom: Origins&#xff09;是一款策略塔防游戏&#xff0c;其核心玩法融合了塔防、策略管理和资源管理元素。游戏的主要目标是在一个开放的像素化世界中建立和管理自己的王国&#xff0c;并抵御夜晚来袭的怪物入侵。 …

v0.9.6 开源跨平台个人知识管理工具 TidGi-Desktop

在这个信息爆炸的时代&#xff0c;知识管理变得尤为重要。太记(TidGi)&#xff0c;一款基于太微(TiddlyWiki)的知识管理桌面应用&#xff0c;正是为了满足人们对信息整理、知识管理和个人隐私保护的需求而设计的。它不仅能够帮助用户高效地管理和整理信息&#xff0c;还能够自动…

go中的方法 func-----数据类型

本文是java学习者学go种产生的容易记混点的笔记,所以有其他编译语言的基础更好 go的方法有点像js 基础 func main() {fmt.Println("Starting")var p *string new(string)*p "hello world"demo : "demo"fmt.Println(*&demo) //这样既然也…

【文献及模型、制图分享】汾河流域新型城镇化与生态韧性耦合协调时空演变及协调影响力研究

公众号新功能 目前公众号新增以下等功能 1、处理GIS出图、Python制图、区位图、土地利用现状图、土地利用动态度和重心迁移图等等 2、核密度分析、网络od分析、地形分析、空间分析等等 3、地理加权回归、地理探测器、生态环境质量指数、地理加权回归模型影响因素分析、计算…

mysql查询2个日期之间的数据,表字段只有年和月,无日期字段查询的解决

1.核心mysql查询 SELECT * FROM 表名 WHERE CONCAT(year, -, LPAD(month, 2, 0)) > 2022-02-08 AND CONCAT(year, -, LPAD(month, 2, 0)) < 2024-06-06;2.表结构 CREATE TABLE ys_datezzq (id int(10) NOT NULL AUTO_INCREMENT,bid int(10) NOT NULL DEFAULT 0 COMMEN…

使用单调队列求滑动窗口最大值

单调队列&#xff1a;队列元素之间的关系具有单调性&#xff08;从队首到队尾单调递增/递减&#xff09;&#xff0c;队首与队尾进行插入与删除操作&#xff0c;使队列保持单调递增/递减&#xff0c;由双端队列deque实现。 通过例题对单调队列进行分析掌握&#xff1a; 使用单…

力扣随机一题 6/26 哈希表 数组 思维

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 题目一&#xff1a; 2869.收集元素的最少操作次数【简单】 题目&#xff…

深度学习31-33

1.负采样方案 &#xff08;1&#xff09;为0是负样本&#xff0c;负样本是认为构造出来的。正样本是有上下文关系 负采样的target是1&#xff0c;说明output word 在input word之后。 2.简介与安装 &#xff08;1&#xff09;caffe:比较经常用于图像识别&#xff0c;有卷积网…

Yolo v5实现细节(2)

Yolo v5代码实现细节 IOU系列损失 在之前的yolo v3中我们使用的定位损失主要使用的是差值平方的形式&#xff0c;通过预测边界框的参数和真实边界框的参数来进行计算求解的。 定位损失 L loc ( t , g ) ∑ i ∈ pos ( σ ( t x i ) − g ^ x i ) 2 ( σ ( t y i ) − g ^ …

云服务器部署LNMP Web环境教程合集(多版linux系统安装方法)

LNMP环境包括Linux、Nginx、MySQL和PHP&#xff0c;Nginx是一款小巧而高效的Web服务器软件&#xff0c;使用阿里云服务器搭建LNMP Web网站环境很简单&#xff0c;支持多种LNMP环境部署教程&#xff0c;可使用ROS模板部署、LNMP镜像以及基于不同Linux操作系统手动部署LNMP全流程…

MySQL进阶——触发器

目录 1介绍 2语法 3案例 3.1 insert插入数据类型 3.2 update修改数据类型 3.3 delete删除数据类型 4视图/存储过程/触发器—小结 1介绍 触发器是与表有关的数据库对象&#xff0c;指在insert/update/delete之前(BEFORE)或之后(AFTER)&#xff0c;触发并执行触发器中定义…

字节发布Depth Anything V2深度模型,比 Depth Anything V1 更精细的细节。

欢迎点击关注下方公众号并加入官方读者交流群&#xff0c;一个有趣有AI的AIGC公众号:关注AI、深度学习、计算机视觉、AIGC、Stable Diffusion、Sora等相关技术&#xff0c;欢迎一起交流学习&#x1f497;&#xff5e; 字节发布Depth Anything V2深度模型。比 Depth Anything V1…