python实现简单的井字棋小游戏
作者:壹屋安源 时间:2022-06-30 10:48:05
Python做三子棋游戏,这个是我刚开始了解做Python小游戏的时候第一个项目,因为简单好入手,实现它的过程是我开始摸索Python的GUI界面的入门之路。这个设计也都是按照自己对于这个游戏的理解,一步一步去实现它。
窗口
万能的窗口,实现窗口都可以进行简单的修改进行使用:
from tkinter import *
root = Tk() #窗口名称
root.title("憨憨制作的三子棋")
f1=Frame(root)
f1.pack()
w1 = Canvas(f1, width=580,height=580,background='lightcyan')#创建一个画布,设置大小和背景颜色
w1.pack()
root.mainloop()
画出棋盘
#画出棋盘
for i in range(0, 4):
w1.create_line(i * 180 + 20, 20, i * 180 + 20, 560)
w1.create_line(20, i * 180 + 20, 560, i * 180 + 20)
分别画横竖线,四条横线四条竖线,生成九个格子。也可以画出两横两竖,更加贴近井字形状。少画几条线就好,例如:
for i in range(1, 3):
w1.create_line(i * 180 + 20, 20, i * 180 + 20, 560)
w1.create_line(20, i * 180 + 20, 560, i * 180 + 20)
num = 0 #记录点击的次数,用来决定点击后该画哪种图形
A = np.full((3, 3), 0) #记录每个位置的图形
算法
每一次点击以后我们都要进行画图和判断是否达到获胜的条件。
设置函数
def dawn(event):
global w1
global num, A
for i in range(0, 3):
for j in range(0, 3):
if 20 + j * 180 < event.y and event.y <= 20 + (j+1) * 180:
break
if 20 + i * 180 <= event.x and event.x <= 20 + (i+1) * 180:
break
if num % 2 == 0 and A[i][j] == 0:
A[i][j] = 1
w1.create_line(110 + 180 * i - 45 * math.sqrt(2), 110 + 180 * j - 45 * math.sqrt(2),
110 + 180 * i + 45 * math.sqrt(2), 110 + 180 * j + 45 * math.sqrt(2))
w1.create_line(110 + 180 * i + 45 * math.sqrt(2), 110 + 180 * j - 45 * math.sqrt(2),
110 + 180 * i - 45 * math.sqrt(2), 110 + 180 * j + 45 * math.sqrt(2))
num += 1
if num % 2 != 0 and A[i][j] == 0:
A[i][j] = 2
w1.create_oval(20 + 180 * i, 20 + 180 * j, 20 + 180 * (i + 1), 20 + 180 * (j + 1))
num += 1
if A[0][0] == A[0][1] == A[0][2] == 2 or A[1][0] == A[1][1] == A[1][2] == 2 or A[2][0] == A[2][1] == A[2][
2] == 2 or \
A[0][0] == A[1][0] == A[2][0] == 2 or A[0][1] == A[1][1] == A[2][1] == 2 or A[0][2] == A[1][2] == \
A[2][
2] == 2 or \
A[0][0] == A[1][1] == A[2][2] == 2 or A[2][0] == A[1][1] == A[0][2] == 2:
tkinter.messagebox.showinfo('消息提示', '圆圈获胜')
elif A[0][0] == A[0][1] == A[0][2] == 1 or A[1][0] == A[1][1] == A[1][2] == 1 or A[2][0] == A[2][1] == A[2][
2] == 1 or \
A[0][0] == A[1][0] == A[2][0] == 1 or A[0][1] == A[1][1] == A[2][1] == 1 or A[0][2] == A[1][2] == \
A[2][
2] == 1 or \
A[0][0] == A[1][1] == A[2][2] == 1 or A[2][0] == A[1][1] == A[0][2] == 1:
tkinter.messagebox.showinfo('消息提示', '叉号获胜')
w1.bind("<Button -1>", dawn)
我们拆开进行分析:
首先是:点击位置的确定,得到我们的点击单元格,开始时我是用的是判断是否在方格的内切圆范围内,发现点击到方格的剩余部分会导致化的图形错位,通过进一步的分析发现,可以通过分别定位点击位置的横纵坐标,确定点击的方格。
for i in range(0, 3):
for j in range(0, 3):
if 20 + j * 180 < event.y and event.y <= 20 + (j+1) * 180:
break
if 20 + i * 180 <= event.x and event.x <= 20 + (i+1) * 180:
break
接着,确定了位置以后我们就开始判断当前位置是否能画图形,应该画什么图形,画❌是比较麻烦的需要进行复杂的计算,画⚪就比较简单。
if num % 2 == 0 and A[i][j] == 0: #若为偶数就画叉号
A[i][j] = 1
w1.create_line(110 + 180 * i - 45 * math.sqrt(2), 110 + 180 * j - 45 * math.sqrt(2),
110 + 180 * i + 45 * math.sqrt(2), 110 + 180 * j + 45 * math.sqrt(2))
w1.create_line(110 + 180 * i + 45 * math.sqrt(2), 110 + 180 * j - 45 * math.sqrt(2),
110 + 180 * i - 45 * math.sqrt(2), 110 + 180 * j + 45 * math.sqrt(2))
num += 1
if num % 2 != 0 and A[i][j] == 0: #若为奇数就画圆圈
A[i][j] = 2
w1.create_oval(20 + 180 * i, 20 + 180 * j, 20 + 180 * (i + 1), 20 + 180 * (j + 1))
num += 1
画完以后我们要判断是否达到获胜的条件,这里我没想到简便的方法,但是好在获胜的情况屈指可数,只有八种(横3,竖3,两个斜方向的)于是将八种情况列出进行判断是否达到获胜条件,而且两种图形都需要列出。
if A[0][0] == A[0][1] == A[0][2] == 2 or A[1][0] == A[1][1] == A[1][2] == 2 or A[2][0] == A[2][1] == A[2][
2] == 2 or \
A[0][0] == A[1][0] == A[2][0] == 2 or A[0][1] == A[1][1] == A[2][1] == 2 or A[0][2] == A[1][2] == \
A[2][
2] == 2 or \
A[0][0] == A[1][1] == A[2][2] == 2 or A[2][0] == A[1][1] == A[0][2] == 2:
tkinter.messagebox.showinfo('消息提示', '圆圈获胜')
elif A[0][0] == A[0][1] == A[0][2] == 1 or A[1][0] == A[1][1] == A[1][2] == 1 or A[2][0] == A[2][1] == A[2][
2] == 1 or \
A[0][0] == A[1][0] == A[2][0] == 1 or A[0][1] == A[1][1] == A[2][1] == 1 or A[0][2] == A[1][2] == \
A[2][
2] == 1 or \
A[0][0] == A[1][1] == A[2][2] == 1 or A[2][0] == A[1][1] == A[0][2] == 1:
tkinter.messagebox.showinfo('消息提示', '叉号获胜')
最后设置点击时间的获取以及退出按钮的设置。
w1.bind("<Button -1>", dawn)
def quit():
root.quit()
button1 = Button(root, text="退出", font=('楷体', 20), command=quit)
button1.pack()
到这里游戏的每个代码都讲解完了。
附完整代码:
from tkinter import *
import numpy as np
import math
import tkinter.messagebox
root = Tk() #窗口名称
root.title("憨憨制作的三子棋")
f1=Frame(root)
f1.pack()
w1 = Canvas(f1, width=580,height=580,background='lightcyan')
w1.pack()
#棋盘
for i in range(0, 4):
w1.create_line(i * 180 + 20, 20, i * 180 + 20, 560)
w1.create_line(20, i * 180 + 20, 560, i * 180 + 20)
num = 0
A = np.full((3, 3), 0)
def dawn(event):
global w1
global num, A
for i in range(0, 3):
for j in range(0, 3):
if 20 + j * 180 < event.y and event.y <= 20 + (j+1) * 180:
break
if 20 + i * 180 <= event.x and event.x <= 20 + (i+1) * 180:
break
if num % 2 == 0 and A[i][j] == 0:
A[i][j] = 1
w1.create_line(110 + 180 * i - 45 * math.sqrt(2), 110 + 180 * j - 45 * math.sqrt(2),
110 + 180 * i + 45 * math.sqrt(2), 110 + 180 * j + 45 * math.sqrt(2))
w1.create_line(110 + 180 * i + 45 * math.sqrt(2), 110 + 180 * j - 45 * math.sqrt(2),
110 + 180 * i - 45 * math.sqrt(2), 110 + 180 * j + 45 * math.sqrt(2))
num += 1
if num % 2 != 0 and A[i][j] == 0:
A[i][j] = 2
w1.create_oval(20 + 180 * i, 20 + 180 * j, 20 + 180 * (i + 1), 20 + 180 * (j + 1))
num += 1
if A[0][0] == A[0][1] == A[0][2] == 2 or A[1][0] == A[1][1] == A[1][2] == 2 or A[2][0] == A[2][1] == A[2][
2] == 2 or \
A[0][0] == A[1][0] == A[2][0] == 2 or A[0][1] == A[1][1] == A[2][1] == 2 or A[0][2] == A[1][2] == \
A[2][
2] == 2 or \
A[0][0] == A[1][1] == A[2][2] == 2 or A[2][0] == A[1][1] == A[0][2] == 2:
tkinter.messagebox.showinfo('消息提示', '圆圈获胜')
elif A[0][0] == A[0][1] == A[0][2] == 1 or A[1][0] == A[1][1] == A[1][2] == 1 or A[2][0] == A[2][1] == A[2][
2] == 1 or \
A[0][0] == A[1][0] == A[2][0] == 1 or A[0][1] == A[1][1] == A[2][1] == 1 or A[0][2] == A[1][2] == \
A[2][
2] == 1 or \
A[0][0] == A[1][1] == A[2][2] == 1 or A[2][0] == A[1][1] == A[0][2] == 1:
tkinter.messagebox.showinfo('消息提示', '叉号获胜')
w1.bind("<Button -1>", dawn)
def quit():
root.quit()
button1 = Button(root, text="退出", font=('楷体', 20), command=quit)
button1.pack()
root.mainloop()
游戏实现只是个人的思路和操作,可能会有很多的不足,有愿意一起研究的朋友可以联系我,愿意虚心请教。
来源:https://blog.csdn.net/qq_44793283/article/details/110529928
标签:python,井字棋
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
无法使用pip命令安装python第三方库的原因及解决方法
2023-11-24 00:32:33
![](https://img.aspxhome.com/file/2023/1/64631_0s.jpg)
如何在独立服务器上创建用户?
2010-06-18 19:59:00
Jupyter notebook在mac:linux上的配置和远程访问的方法
2023-06-20 06:11:01
浅谈解除装饰器作用(python3新增)
2022-05-30 03:31:52
品牌的统一体验
2010-05-19 13:08:00
![](https://img.aspxhome.com/file/UploadPic/20105/19/bue-01-70s.jpg)
tensorflow将图片保存为tfrecord和tfrecord的读取方式
2022-01-22 11:32:04
![](https://img.aspxhome.com/file/2023/4/77004_0s.jpg)
基于Python+Tkinter实现一个简易计算器
2021-06-23 00:40:29
![](https://img.aspxhome.com/file/2023/4/72244_0s.png)
PHP入门基础之注释的写法
2023-10-20 07:26:17
用python实现名片管理系统
2022-03-27 09:34:33
![](https://img.aspxhome.com/file/2023/9/75349_0s.jpg)
Asp WinHttp.WinHttpRequest.5.1 对象使用详解
2012-05-02 10:15:27
在SQL server2005数据库下创建计划任务
2008-12-26 09:19:00
![](https://img.aspxhome.com/file/UploadPic/200812/20081231122259529.jpg)
python实现学生管理系统源码
2023-05-29 22:05:16
![](https://img.aspxhome.com/file/2023/9/62919_0s.jpg)
python放大图片和画方格实现算法
2023-05-21 15:22:41
PHP获取类中常量,属性,及方法列表的方法
2023-11-19 19:57:58
python3 pillow模块实现简单验证码
2021-07-04 11:10:44
![](https://img.aspxhome.com/file/2023/5/89145_0s.jpg)
Python表示矩阵的方法分析
2022-06-24 01:31:59
![](https://img.aspxhome.com/file/2023/2/71342_0s.png)
Python实现读取文件夹按数字排序功能
2023-08-24 02:12:45
python3实现字符串的全排列的方法(无重复字符)
2022-04-14 19:47:56
爱你就要说出来,来表白吧
2008-11-23 16:23:00
![](https://img.aspxhome.com/file/UploadPic/200811/23/loveyou-38s.gif)
Python+PyQt5制作一个图片查看器
2021-03-03 04:16:06
![](https://img.aspxhome.com/file/2023/5/87995_0s.gif)