软件测试|教你使用Python实现五子棋游戏(一)
2023-03-07 09:45:41 时间
前言
五子棋是我们传统的益智游戏之一,老少皆宜,上手简单,对于锻炼逻辑思维,增强思考能力有很大帮助。那么,我们能不能使用Python来写出五子棋的程序呢,毕竟不是什么时候都有对手和你一起下棋的,编写一个五子棋程序,自己可以随时随地玩这个游戏。
需求
五子棋规则比较简单,有如下需求:
- 分为黑白两色棋子
- 黑白两方依次落子
- 任何一方达成五子连珠即获得胜利
- 横向纵向斜向五子连珠均符合胜利条件
- 五子棋棋盘为15*15的正方形棋盘
初级实现
我们之前介绍过tkinter这个库,可以用做GUI程序的开发,现在我们尝试一下使用tkinter来实现五子棋这个游戏。示例代码如下:
from tkinter import *
import tkinter.messagebox # 弹窗库
import numpy as np
root = Tk() # 创建窗口
root.title("五子棋") # 窗口名字
w1 = Canvas(root, width=600, height=600, background='chocolate')
w1.pack()
for i in range(0, 15):
w1.create_line(i * 40 + 20, 20, i * 40 + 20, 580)
w1.create_line(20, i * 40 + 20, 580, i * 40 + 20)
w1.create_oval(135, 135, 145, 145, fill='black')
w1.create_oval(135, 455, 145, 465, fill='black')
w1.create_oval(465, 135, 455, 145, fill='black')
w1.create_oval(455, 455, 465, 465, fill='black')
w1.create_oval(295, 295, 305, 305, fill='black')
num = 0
A = np.full((15, 15), 0)
B = np.full((15, 15), '')
def callback(event):
global num, A
for j in range(0, 15):
for i in range(0, 15):
if (event.x - 20 - 40 * i) ** 2 + (event.y - 20 - 40 * j) ** 2 <= 2 * 20 ** 2:
break
if (event.x - 20 - 40 * i) ** 2 + (event.y - 20 - 40 * j) ** 2 <= 2 * 20 ** 2:
break
if num % 2 == 0 and A[i][j] != 1:
w1.create_oval(40 * i + 5, 40 * j + 5, 40 * i + 35, 40 * j + 35, fill='black')
A[i][j] = 1
B[i][j] = 'b'
num += 1
if num % 2 != 0 and A[i][j] != 1:
w1.create_oval(40 * i + 5, 40 * j + 5, 40 * i + 35, 40 * j + 35, fill='white')
A[i][j] = 1.
B[i][j] = 'w'
num += 1
f = [[-1, 0], [-1, 1], [0, 1], [1, 1]]
for z in range(0, 4):
a, b = f[z][0], f[z][1]
count1, count2 = 0, 0
x, y = i, j
while B[x][y] == B[i][j]:
count1 += 1
if x + a >= 0 and y + b >= 0 and x + a < 15 and y + b < 15 and B[x + a][y + b] == B[i][j]:
[x, y] = np.array([x, y]) + np.array([a, b])
else:
x, y = i, j
break
while B[x][y] == B[i][j]:
count2 += 1
if x - a < 15 and y - b < 15 and x - a >= 0 and y - b >= 0 and B[x - a][y - b] == B[i][j]:
[x, y] = np.array([x, y]) - np.array([a, b])
else:
break
if count1 + count2 == 6:
if B[i][j] == 'b':
tkinter.messagebox.showinfo('提示', '黑棋获胜')
else:
tkinter.messagebox.showinfo('提示', '白棋获胜')
w1.bind("<Button -1>", callback)
w1.pack()
def quit():
root.quit()
u = Button(root, text="退出游戏", width=10, height=1, command=quit, font=('宋体', 20))
u.pack()
mainloop()
初始运行展示的棋盘如下:
依次在棋盘上点击各个落子点,进行游戏,我们可以看到黑子白子依次下在棋盘上,当一方实现五子连珠时,出现提示某一方获胜。如下所示:
代码缺陷
我们可以发现,点击获胜的弹窗之后,棋盘并没有清空重新开始游戏,而是可以继续落子,如下图所示:
在白棋先获胜之后,点击确定关闭弹窗后,游戏还可以继续进行,直到下一次出现一方五子连珠,再次出现弹窗,这是不符合我们的五子棋的规则的,我们的代码需要优化。
总结
本文主要讲解了使用tkinter编写一个五子棋的游戏小程序,我们只实现了双方交替落子,判断胜利条件等功能,对于结束游戏的逻辑实现不符合五子棋的规则,还需要优化,后面我们将优化这个五子棋游戏程序的脚本。
相关文章
- Python用RNN神经网络:LSTM、GRU、回归和ARIMA对COVID19新冠疫情人数时间序列预测|附代码数据
- Python金融时间序列模型ARIMA 和GARCH 在股票市场预测应用|附代码数据
- PYTHON 用几何布朗运动模型和蒙特卡罗MONTE CARLO随机过程模拟股票价格可视化分析耐克NKE股价时间序列数据|附代码数据
- 写【Python折线图】的一百个技巧(一、生成折线图网页)
- 画【Python折线图】的一百个学习报告(二、pyecharts引入js文件)
- 通过Python爬虫获取【小说网站GUI】数据,保姆级教学
- 最新Python大数据之Python基础【十】学生管理系统面向对象版
- View的onAttachedToWindow引发的图片轮播问题探究
- CPU流水线竞争解决方案
- 【Python常用函数】一文让你彻底掌握Python中的cut函数
- 多标签分类怎么做?(Python)
- 一览机器学习算法(附python和R代码)
- 引入业务先验约束的树模型(Python)
- ChatGPT竟写出毁灭人类计划书,还给出相应Python代码,网友:AI正在指数级发展
- 10行Python代码能实现什么高端操作?
- Feature-engine: 一个完备的特征工程Python库,实现端到端的特征流水线
- python 按行数分割文件
- CPU流水线越大越好吗?
- Python算法:三种简单排序的方法
- apisix 自定义插件方法