Python-井字棋

news2025/2/26 2:01:15

井字棋

  • 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] = np
        with 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 / 3
    cell_height = height / 3

    for i in range(3):
        x = i * cell_width
        canvas.create_line(x, 0, x, height, fill=line_color)  # 垂直线
    for i in range(3):
        y = i * cell_height
        canvas.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 / 2
        y = j * cell_height + cell_height / 2
        index = i * 3 + j
        if 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 gameover
    wins = [[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 = True
            tk.messagebox.showinfo(title="你别挣了",message="我赢了")
            return
    if step>=5:
        gameover =True
        return 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 board
    global step
    Iemet = entry2.get()
    if Iemet.isdigit():
        number = int(Iemet)
        if 1 <= number <= 9:
            index = number - 1
            board[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 canvas
    canvas.delete('A')

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

效果图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

# 深入理解 Java 虚拟机 (二)

深入理解 Java 虚拟机 &#xff08;二&#xff09; Java内存模型 主内存与工作内存 所有的变量存储在主内存&#xff08;虚拟机内存的一部分&#xff09;每条线程有自己的工作内存&#xff0c;线程对变量的所有操作&#xff08;读取、赋值&#xff09;都必须在工作内存中进行…

前端 CSS 经典:图层放大的 hover 效果

效果 思路 设置 3 层元素&#xff0c;最上层元素使用 clip-path 裁剪成圆&#xff0c;hover 改变圆大小&#xff0c;添加过渡效果。 实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /><meta http-eq…

Linux-笔记 OverlayFS文件系统小应用 恢复功能

前言 通过另一章节 OverlayFS文件系统入门 中已经大致了解了原理&#xff0c;这里来实现一个小应用。通过前面介绍我们已经知道lowerdir是只读层&#xff0c;upperdir是可读写层&#xff0c;merged是合并层&#xff08;挂载点&#xff09;&#xff0c;那么我们可以利用这个机…

[leetcode] smallest-k-lcci. 最小的k个数

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> smallestK(vector<int>& nums, int k) {int L 0, R nums.size() - 1;while (L < R){int left L, right R;int key nums[left];while (left < right){while (left &l…

【人工智能】—基于线性回归和多项式回归模型预测人均收入的研究

引言 随着人工智能技术的飞速发展&#xff0c;机器学习已成为数据分析和预测领域的重要工具。在众多机器学习算法中&#xff0c;线性回归和多项式回归因其模型简单、易于理解和实现而受到广泛应用。本文旨在探讨如何利用这两种回归模型对人均收入进行预测。线性回归模型以其简…

作 业 二

cs与msf权限传递 1、进入cs界面,首先来到 Cobalt Strike 目录下&#xff0c;启动 Cobalt Strike 服务端 2、用客户端进 3、建立监听 4、生成脚本文件 5、开启服务&#xff0c;让win_2012 下载木马文件并运行 6、显示已经获取到了win的权限 转到Metasploit Framework 7、进去m…

使用conda安装第三方包报错CondaSSLError

使用conda安装第三方包报错CondaSSLError 1. 报错信息2. 解决方法 1. 报错信息 错误描述&#xff1a;刚刚下载的 anaconda 在使用 conda 安装 pytorch 时报错&#xff08;CondaSSLError: OpenSSL appears to be unavailable on this machine. OpenSSL is required to download …

算法刷题日志 hot100 数组分类

文章目录 [169. 多数元素](https://leetcode.cn/problems/majority-element/)旋转图像215. 数组中的第K个最大元素](https://leetcode.cn/problems/kth-largest-element-in-an-array/description/)238. 除自身以外数组的乘积](https://leetcode.cn/problems/product-of-array-e…

线性代数基础概念:向量空间

目录 线性代数基础概念&#xff1a;向量空间 1. 向量空间的定义 2. 向量空间的性质 3. 基底和维数 4. 子空间 5. 向量空间的例子 总结 线性代数基础概念&#xff1a;向量空间 向量空间是线性代数中最基本的概念之一&#xff0c;它为我们提供了一个抽象的框架&#xff0c…

计算机视觉全系列实战教程 (十四):图像金字塔(高斯金字塔、拉普拉斯金字塔)

1.图像金字塔 (1)下采样 从G0 -> G1、G2、G3 step01&#xff1a;对图像Gi进行高斯核卷积操作&#xff08;高斯滤波&#xff09;step02&#xff1a;删除所有的偶数行和列 void cv::pyrDown(cv::Mat &imSrc, //输入图像cv::Mat &imDst, //下采样后的输出图像cv::Si…

Ceil()——向上取整函数

函数原型为&#xff1a; double ceil(double x); 大家可以在这个网站里更清晰的了解ceil - C Reference (cplusplus.com) 下面借助一道例题来帮助大家理解&#xff1a;牛牛的快递_牛客题霸_牛客网 (nowcoder.com) 我们分析题得知&#xff0c;在大于1的情况下&#xff0c;只要…

鸿蒙开发系统基础能力:【@ohos.screenLock (锁屏管理)】

锁屏管理 锁屏管理服务是OpenHarmony中系统服务&#xff0c;为锁屏应用提供注册亮屏、灭屏、开启屏幕、结束休眠、退出动画、请求解锁结果监听&#xff0c;并提供回调结果给锁屏应用。锁屏管理服务向三方应用提供请求解锁、查询锁屏状态、查询是否设置锁屏密码的能力。 说明&a…

OutOfMemoryError能被catch(Exception)捕获吗?

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

星坤Type-A连接器:创新快充技术,引领电子连接!

快速发展的电子时代&#xff0c;消费者对电子设备的性能和便利性有着更高的要求。特别是在充电和数据传输方面&#xff0c;快充技术和高速传输已成为市场的新宠。中国星坤公司推出的Type-A连接器系列&#xff0c;以其卓越的性能和创新的设计&#xff0c;满足了市场对高效、稳定…

考研数学复习(1/9):函数与极限

目录 函数与极限 1. 函数的概念 1.1 函数的定义 1.2 函数的表示方法 1.3 函数的分类 1.4 函数的运算 2. 极限的概念 2.1 极限的定义 2.2 极限的性质 2.3 极限的计算方法 2.4 极限的应用 3. 连续函数 3.1 连续函数的定义 3.2 连续函数的性质 3.3 连续函数的分类 …

从官方源码精简出第1个FreeRTOS程序

一、下载官方源码 1、打开百度搜索freerots&#xff0c;找到官网:FreeRTOS官网 2、将源码解压到没有中文目录的路径下 二、删减目录 1、删除FreeRTOS-Plus和tools 2、删除FreeRTOS/Demo下除CORTEX_STM32F103_Keil外的所有文件 3、删除FreeRTOS\Source\portable下除RVDS和MemM…

观星观景大屏呈现 实时拍摄长焦定格 当当狸智能天文望远镜TW2来啦

《宇宙的奇迹》中有这样一句话&#xff1a;“我们与那些遥远星系息息相关&#xff0c;无论它们是如何与我们天各一方&#xff0c;那些经过数十亿年旅行到达地球的光线&#xff0c;终究会把我们联系在一起”。 想象一下—— 等到繁星低垂&#xff0c;月光皎洁之时&#xff0c;…

景区智能厕所系统让旅游更便捷、更舒适

在旅游业蓬勃发展的今天&#xff0c;游客对于旅游体验的要求越来越高&#xff0c;而景区的基础设施建设也在不断创新和完善。其中&#xff0c;景区智能厕所系统的出现&#xff0c;无疑为游客带来了更加便捷、舒适的旅游体验。 一、智能厕所系统首先体现在其精准的定位和引导功能…

力扣1541. 平衡括号字符串的最少插入次数

Problem: 1541. 平衡括号字符串的最少插入次数 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 Problem: 力扣921. 使括号有效的最少添加 类似于上述题目&#xff0c;不过此时一个左括号要和两个右括号配对 1.同理上述题目&#xff0c;遍历字符串时若遇见一个左括…

Windows Nginx更新版本

一、准备新版安装包 nginx: downloadhttps://nginx.org/en/download.html 二、升级Nginx 1、备份原Nginx 2、上传新版Nginx 上传并解压 3、更新版本 1&#xff09;原文件夹更新 1.关闭nginx 查看原版本号 nginx -v 命今关闭 nginx -s stop 确认进程里没有nginx&#…