20224101 2023-2024-2 《Python程序设计》实验4 Python综合实践

20224101黄子涵 2024-05-14 21:19:28

20224101 2023-2024-2 《Python程序设计》实验4 Python综合实践

课程:《Python程序设计》
班级: 2241
姓名: 黄子涵
学号:20224101
实验教师:王志强
实验日期:2024年5月14日
必修/选修: 专选课

1.实验内容

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
课代表和各小组负责人收集作业(源代码、视频、综合实践报告)
例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
例如:利用公开数据集,开展图像分类、恶意软件检测等
例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
例如:爬取天气数据,实现自动化微信提醒
例如:利用爬虫,实现自动化下载网站视频、文件等。
例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等
注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。

2.实验过程及结果

在CSDN社区上进行检索学习后,决定编写一个井字游戏,具体操作过程如下:
1.利用canvas和create方法画出井字游戏的九宫格框线

img

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

img

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

img

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

img

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

img

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

img

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

img

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

img

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

img

img

img

img

3.源代码

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()

4.井字游戏运行视频

5.本次实验遇到的问题及感想体会

问题1:在刻意将游戏运行为“平局”状态时,始终运行不出来“都没有赢了”的结果,电脑一直显示在缓冲。
问题1解决方案:重新检查了一遍代码,发现“玩家获胜”的条件设置有误,应该是“>=”而不是“>”,修正过后成功运行出“都没有赢了”的结果。
问题2:发现自己对于包括“for循环”在内的一些基本语法结构形式还是不太理解,可以对照csdn社区上已有的代码敲出,但是无法独立编写。
问题2解决方案:找到了之前三次实验的代码以及学习通平台上的相关课件资料,对照着进行复习、再学习。
我的感想体会:本次实验是对于python的一个综合应用,在选取实践主题、编写代码的过程中我遇到了很多困难,包括当别人的代码无法在我的电脑上正常运行报错时、我因为没能完全掌握相关知识所以无法进行相应修正,只能更换编写的游戏主题等等。也正是因为这些问题的出现,让我深刻地意识到单纯依靠复制粘贴别人的代码是无法解决问题的,正如志强老师在课上反复强调的那样,在未来,我还需要更深入地理解和掌握Python的底层逻辑和相关知识。虽然比较坎坷,但是通过在CSDN上自主查找资料、在B站上浏览相关讲解视频、寻求同学帮助的方式,我也是完成了本次实践,还是比较有成就感的。

6.课程总结与建议

首先非常感谢志强老师对我们的耐心教导与无限包容!一开始对于python的好奇心还能支撑我在课堂上认真听讲、记录重点内容,然而从某节课开始,我觉得难度一下就飙升了,认真听讲也不能支撑我做到完全听明白了,但是志强老师始终特别耐心的为我们解答疑问;很多课堂提问即便我们答不上来老师也不会为难我们,而是不厌其烦的为我们一遍两遍三遍再去讲解知识点,只为我们能更多的了解一些python知识,特别让人感动。
虽然我不能说自己已经成功入门python,但我能够感受到自己在编程方面的进步和成长:我学会了如何编写简单的程序,如何运用Python的语法和函数来解决问题,学会了如何查找资料、解决遇到的问题等等等等。希望在未来我能够继续保持着这大半学期积攒出的、对python的热情和兴趣,不断学习和探索新的知识和技能。
不知道老师有没有感觉,平时我们的上课状态是相对比较有松弛感的,大家虽然都打开着电脑,但其实有没有听进去讲、有没有跟着老师进行实际操作其实都是未知的;直到有一节课老师发布了一个随堂测验、让大家当堂编写一个代码,大家的课堂学习状态非常明显地变得积极认真了,真是魔法!所以我建议老师在下届python课堂上可以多多添加几次这种“随堂小测”,让大家的学习状态都能“脉动回来”。
最后的最后,再次感谢老师的辛勤付出,就像老师说的那样,特别感谢一起在富丰路7号成长的这段时光!

...全文
241 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

93

社区成员

发帖
与我相关
我的任务
社区描述
Python程序设计作业
软件构建 高校 北京·丰台区
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧