93
社区成员
发帖
与我相关
我的任务
分享课程:《Python程序设计》
班级: 2241
姓名: 黄子涵
学号:20224101
实验教师:王志强
实验日期:2024年5月14日
必修/选修: 专选课
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
课代表和各小组负责人收集作业(源代码、视频、综合实践报告)
例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
例如:利用公开数据集,开展图像分类、恶意软件检测等
例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
例如:爬取天气数据,实现自动化微信提醒
例如:利用爬虫,实现自动化下载网站视频、文件等。
例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等
注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
在CSDN社区上进行检索学习后,决定编写一个井字游戏,具体操作过程如下:
1.利用canvas和create方法画出井字游戏的九宫格框线

2.使用for循环在已经画好的九宫格中输入数字1-9

3.绘制辅助游戏运行的输入框与按钮

4.定义一个函数,使得在输入框输入对应的九宫格数字,点击按下落子按钮,实现在格子里面画叉,如果重复一个数字输入,则会弹出警告框。

5.设置一个函数,使得输入1-9以外的数字会弹出弹窗警告,如果输入其他数字也会弹出警告。

6.设置一个函数,里面设置一个二维数组,把所有赢的可能设置在里面,然后判断是否赢,超过5步则平局。

7.定义一个函数,链接重新开始按钮,使点击主窗口的重新开始按钮,九宫格内所有叉消失,重新开始游戏。

8.定义一个函数,代表AI下棋,在里面随机生成0~8的整数,用于表示AI在棋盘上的位置,让AI落子时不落在已经落子的地方,然后画圈,实现AI与玩家交替下棋。

运行编写好的井字游戏代码,查看各种可能的运行结果




import random
import tkinter as tk
from tkinter import messagebox
def draw_grid(canvas):
# 画外边框线
canvas.create_line(2, 2, 300, 2, width=2) # 上
canvas.create_line(2, 2, 2, 300, width=2) # 左
canvas.create_line(2, 300, 300, 300, width=2) # 下
canvas.create_line(300, 2, 300, 300, width=2) # 右
# 画横线
canvas.create_line(100, 0, 100, 300)
canvas.create_line(200, 0, 200, 300)
# 画竖线
canvas.create_line(0, 100, 300, 100)
canvas.create_line(0, 200, 300, 200)
num = 1
for i in range(3):
for j in range(3):
y = i * 100 + 50
x = j * 100 + 50
canvas.create_text(x, y, text=str(num), font=("Arial", 24))
num += 1
def on_click():
global board
global step
position = e1.get()
if position.isdigit() and 1 <= int(position) <= 9:
number = int(position)
index = number - 1
if board[index] == ' ':
board[index] = 'x'
x = ((int(position) - 1) % 3) * 100 + 50
y = ((int(position) - 1) // 3) * 100 + 50
canvas.create_line(x - 20, y - 20, x + 20, y + 20, fill='black', width=2)
canvas.create_line(x + 20, y - 20, x - 20, y + 20, fill='black', width=2)
step += 1
iswins()
if not gameover:
ai_move()
else:
messagebox.showerror("错误", "该位置已经落子,请选择其他位置")
def ai_move():
global board, foot
index = random.randint(0, 8)
while board[index] != ' ':
index = random.randint(0, 8)
x = ((index) % 3) * 100 + 50
y = ((index) // 3) * 100 + 50
canvas.create_oval(x - 20, y - 20, x + 20, y + 20, fill='red')
board[index] = 'AI'
foot += 1
iswins()
def problem():
try:
input_value = int(e1.get())
if input_value < 1 or input_value > 9:
messagebox.showerror("错误", "请输入1到9之间的数字")
else:
print("输入正确")
except ValueError:
messagebox.showerror("错误", "请输入一个有效的数字")
on_click()
def iswins():
global gameover,step
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
messagebox.showinfo(title="shuchu",message="赢家是"+board[w[0]])
return
if step>=5:
gameover = True
messagebox.showinfo(title="shuchu",message="都没有赢了")
return
def again():
global board, step, gameover
board = [' '] * 9
step = 0
gameover = False
canvas.delete('all')
draw_grid(canvas)
def main():
root = tk.Tk()
root.title("九宫格")
root.geometry("500x600")
lb1 = tk.Label(root, text='请要输入落子的位置(1~9):')
lb1.place(x=150, y=350)
global e1
e1 = tk.Entry(root, bd=5, width=20)
e1.place(x=150, y=380)
button1 = tk.Button(root, text="按下落子", width=10, height=2, fg='black', command=problem)
button1.place(x=180, y=420)
button2 = tk.Button(root, text="重新开始", width=10, height=2, fg='black', command=again)
button2.place(x=180, y=480)
global canvas
canvas = tk.Canvas(root, width=350, height=350,)
canvas.pack()
draw_grid(canvas)
root.mainloop()
if __name__ == "__main__":
board = [' '] * 9
gameover = False
step = 0
foot =0
main()
问题1:在刻意将游戏运行为“平局”状态时,始终运行不出来“都没有赢了”的结果,电脑一直显示在缓冲。
问题1解决方案:重新检查了一遍代码,发现“玩家获胜”的条件设置有误,应该是“>=”而不是“>”,修正过后成功运行出“都没有赢了”的结果。
问题2:发现自己对于包括“for循环”在内的一些基本语法结构形式还是不太理解,可以对照csdn社区上已有的代码敲出,但是无法独立编写。
问题2解决方案:找到了之前三次实验的代码以及学习通平台上的相关课件资料,对照着进行复习、再学习。
我的感想体会:本次实验是对于python的一个综合应用,在选取实践主题、编写代码的过程中我遇到了很多困难,包括当别人的代码无法在我的电脑上正常运行报错时、我因为没能完全掌握相关知识所以无法进行相应修正,只能更换编写的游戏主题等等。也正是因为这些问题的出现,让我深刻地意识到单纯依靠复制粘贴别人的代码是无法解决问题的,正如志强老师在课上反复强调的那样,在未来,我还需要更深入地理解和掌握Python的底层逻辑和相关知识。虽然比较坎坷,但是通过在CSDN上自主查找资料、在B站上浏览相关讲解视频、寻求同学帮助的方式,我也是完成了本次实践,还是比较有成就感的。
首先非常感谢志强老师对我们的耐心教导与无限包容!一开始对于python的好奇心还能支撑我在课堂上认真听讲、记录重点内容,然而从某节课开始,我觉得难度一下就飙升了,认真听讲也不能支撑我做到完全听明白了,但是志强老师始终特别耐心的为我们解答疑问;很多课堂提问即便我们答不上来老师也不会为难我们,而是不厌其烦的为我们一遍两遍三遍再去讲解知识点,只为我们能更多的了解一些python知识,特别让人感动。
虽然我不能说自己已经成功入门python,但我能够感受到自己在编程方面的进步和成长:我学会了如何编写简单的程序,如何运用Python的语法和函数来解决问题,学会了如何查找资料、解决遇到的问题等等等等。希望在未来我能够继续保持着这大半学期积攒出的、对python的热情和兴趣,不断学习和探索新的知识和技能。
不知道老师有没有感觉,平时我们的上课状态是相对比较有松弛感的,大家虽然都打开着电脑,但其实有没有听进去讲、有没有跟着老师进行实际操作其实都是未知的;直到有一节课老师发布了一个随堂测验、让大家当堂编写一个代码,大家的课堂学习状态非常明显地变得积极认真了,真是魔法!所以我建议老师在下届python课堂上可以多多添加几次这种“随堂小测”,让大家的学习状态都能“脉动回来”。
最后的最后,再次感谢老师的辛勤付出,就像老师说的那样,特别感谢一起在富丰路7号成长的这段时光!