课程:《Python程序设计》

班级: 2441

姓名: 陈思淼

学号:202444104

实验教师:王志强

实验日期:2025年5月29日

必修/选修: 公选课

1.实验内容

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。

课代表和各小组负责人收集作业(源代码、视频、综合实践报告)

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。

例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。

例如:利用公开数据集,开展图像分类、恶意软件检测等

例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。

例如:爬取天气数据,实现自动化微信提醒

例如:利用爬虫,实现自动化下载网站视频、文件等。

例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等

注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。

2.实验内容及结果

(1)确定需求和准备工作

贪吃蛇游戏是一个经典的街机游戏,玩家控制一条蛇在屏幕上移动,蛇会不断吃食物来增长身体长度,同时要避免撞到墙壁或自己的身体。在 Python 中,我们可以使用 turtle 库来实现这个游戏,因为它提供了简单的图形绘制和事件处理功能。

首先,我们需要导入必要的库:



2. 初始化游戏参数

我们需要定义一些初始参数,如游戏的延迟时间、当前得分和最高得分:



3. 设置游戏窗口

使用 turtle.Screen() 创建一个游戏窗口,并设置窗口的标题、背景颜色、大小和追踪功能:



4. 创建蛇头和食物

使用 turtle.Turtle() 创建蛇头和食物,并设置它们的初始位置、形状和颜色:



5. 初始化蛇的身体段列表和计分板

创建一个空列表 segments 用于存储蛇的身体段,并使用 turtle.Turtle() 创建一个计分板:



6. 定义蛇的移动方向函数

为了控制蛇的移动方向,我们需要定义四个函数:go_up()、go_down()、go_left() 和 go_right():



7. 绑定键盘事件

使用 window.listen() 监听键盘事件,并使用 window.onkeypress() 将方向函数绑定到相应的方向键:



8. 定义蛇的移动函数

定义一个 move() 函数,根据蛇的当前方向更新蛇头的位置:



9. 主游戏循环

使用一个无限循环来不断更新游戏窗口,并处理游戏逻辑:







在主循环中,我们执行以下操作:

更新游戏窗口。

检查蛇头是否撞到墙壁,如果是,则重置游戏。

检查蛇头是否吃到食物,如果是,则增加蛇的长度、更新得分和最高得分,并随机移动食物的位置。

移动蛇的身体段,使其跟随蛇头移动。

检查蛇头是否撞到自己的身体,如果是,则重置游戏。

使用 time.sleep(delay) 控制游戏的帧率。

10. 异常处理

使用 try-except 块捕获 turtle.Terminator 异常,以确保在用户关闭游戏窗口时程序能够正常退出。

11.以下是完整代码及其运行结果

import turtle

import time

import random

delay = 0.1

score = 0

high_score = 0

Set up the screen

window = turtle.Screen()

window.title("贪吃蛇游戏")

window.bgcolor("black")

window.setup(width=600, height=600)

window.tracer(0)

Snake head

head = turtle.Turtle()

head.speed(0)

head.shape("square")

head.color("white")

head.penup()

head.goto(0, 0)

head.direction = "stop"

Snake food

food = turtle.Turtle()

food.speed(0)

food.shape("circle")

food.color("red")

food.penup()

food.goto(0, 100)

segments = []

Pen to draw score

pen = turtle.Turtle()

pen.speed(0)

pen.shape("square")

pen.color("white")

pen.penup()

pen.hideturtle()

pen.goto(0, 260)

pen.write("得分: 0 最高分: 0", align="center", font=("Courier", 24, "normal"))

Functions to change direction

def go_up():

if head.direction != "down":

head.direction = "up"

def go_down():

if head.direction != "up":

head.direction = "down"

def go_left():

if head.direction != "right":

head.direction = "left"

def go_right():

if head.direction != "left":

head.direction = "right"

Keyboard bindings

window.listen()

window.onkeypress(go_up, "Up")

window.onkeypress(go_down, "Down")

window.onkeypress(go_left, "Left")

window.onkeypress(go_right, "Right")

def move():

if head.direction == "up":

y = head.ycor()

head.sety(y + 20)

if head.direction == "down":

y = head.ycor()

head.sety(y - 20)

if head.direction == "left":

x = head.xcor()

head.setx(x - 20)

if head.direction == "right":

x = head.xcor()

head.setx(x + 20)

try:

while True:

window.update()

    # Check for a collision with the border
if head.xcor()>290 or head.xcor()<-290 or head.ycor()>290 or head.ycor()<-290:
time.sleep(1)
head.goto(0,0)
head.direction = "stop" # Hide the segments
for segment in segments:
segment.goto(1000,1000) # Clear the segments list
segments.clear() # Reset the score
score = 0 # Reset the delay
delay = 0.1 pen.clear()
pen.write("得分: {} 最高分: {}".format(score, high_score), align="center", font=("Courier", 24, "normal")) # Check for a collision with the food
if head.distance(food) < 20:
# Move the food to a random spot
x = random.randint(-290, 290)
y = random.randint(-290, 290)
food.goto(x,y) # Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("grey")
new_segment.penup()
segments.append(new_segment) # Shorten the delay
delay -= 0.001 # Increase the score
score += 10 if score > high_score:
high_score = score pen.clear()
pen.write("得分: {} 最高分: {}".format(score, high_score), align="center", font=("Courier", 24, "normal")) # Move the end segments first in reverse order
for index in range(len(segments)-1, 0, -1):
x = segments[index-1].xcor()
y = segments[index-1].ycor()
segments[index].goto(x, y) # Move segment 0 to where the head is
if len(segments) > 0:
x = head.xcor()
y = head.ycor()
segments[0].goto(x,y) move() # Check for head collision with the body segments
for segment in segments:
if segment.distance(head) < 20:
time.sleep(1)
head.goto(0,0)
head.direction = "stop" # Hide the segments
for segment in segments:
segment.goto(1000,1000) # Clear the segments list
segments.clear() # Reset the score
score = 0 # Reset the delay
delay = 0.1 # Update the score display
pen.clear()
pen.write("得分: {} 最高分: {}".format(score, high_score), align="center", font=("Courier", 24, "normal")) time.sleep(delay)

except turtle.Terminator:

pass

运行结果:



3.实验中存在的问题及解决方案:

(1)问题:蛇身运动不受控制

解决:对键盘操作进行修改。

(2)问题:计分数字与背景颜色相同。

解决:修改计分数字颜色。

4.课程总结

这一学期的 Python 学习于我而言是从 “零” 到 “一” 的突破。作为毫无编程基础的文科生,初接触代码时,面对复杂的逻辑结构与满屏报错常感到手足无措。但通过多次实验,我逐渐掌握了 Python 的核心逻辑 —— 从基础的变量赋值、循环语句,到利用turtle库完成贪吃蛇游戏的交互逻辑,每一次从 “红色警告” 到程序流畅运行的过程,都让我对编程思维有了更具象的理解。印象最深的是在实现 “蛇身跟随蛇头移动” 功能时,通过列表存储坐标、逆序更新位置的方式,让我深刻体会到数据结构在解决实际问题中的关键作用,也第一次真正感受到代码 “化抽象为具体” 的魅力。

感谢王老师一学期的悉心教导!您在课堂上的耐心讲解与课后的及时答疑,让我从 “看见代码就头疼” 的小白,成长为能主动用代码解决问题的学习者。Python 不仅是一门技术,更是一扇窗,让我看到逻辑思维与文科创意结合的无限可能。

20244104陈思淼 实验四 Python综合实践的更多相关文章

  1. 实验四 Python综合实践

    课程:<Python程序设计> 班级:1843 姓名:章森洋 学号:20184307 实验教师:王志强 实验日期:2020年5月16日 必修/选修: 公选课 1.实验内容 此处填写实验的具 ...

  2. 20211306 实验四 Python综合实践

    学号 20211306 <Python程序设计>实验四报告 课程:<Python程序设计> 班级: 2113 姓名: 丁文博 学号:20211306 实验教师:王志强 实验日期 ...

  3. 20193314白晨阳《Python程序设计》实验四 Python综合实践

    课程:<Python程序设计> 班级: 1933 姓名: 白晨阳 学号:20193314 实验教师:王志强老师 实验日期:2021年6月13日 必修/选修: 公选课 实验内容: Pytho ...

  4. 20203412马畅若《Python程序设计》实验四Python综合实践报告

    作为初次接触程序设计的我在看到云班课中用python进行游戏编程后感到很有意思,所以我决定这次做一个最经典的小鸟管道游戏.虽然网上许多大佬都说这是最基础的一项游戏编码,但我还是用了许多时间去做成这个游 ...

  5. 20201123 《python程序设计》实验四报告

    20201123 2020-2021-2 <python程序设计>实验三报告 课程:<Python程序设计>班级:2011姓名:晏鹏捷学号:20201123实验教师:王志强实验 ...

  6. 20184302 2019-2020-2 《Python程序设计》实验四报告

    20184302 2019-2020-2 <Python程序设计>实验四报告 课程:<Python程序设计> 班级: 1843 姓名: 李新锐 学号:184302 实验教师:王 ...

  7. 20212115朱时鸿 《python程序设计》实验四报告

    课程:<Python程序设计>班级: 2121姓名: 朱时鸿学号:20212115实验教师:王志强实验日期:2022年5月28日必修/选修: 公选课 1.实验内容 Python综合应用:爬 ...

  8. Appium+python自动化(四十二)-Appium自动化测试框架综合实践- 寿终正寝完结篇(超详解)

    1.简介 按照上一篇的计划,今天给小伙伴们分享执行测试用例,生成测试报告,以及自动化平台.今天这篇分享讲解完.Appium自动化测试框架就要告一段落了. 2.执行测试用例&报告生成 测试报告, ...

  9. Appium+python自动化(四十一)-Appium自动化测试框架综合实践 - 即将落下帷幕(超详解)

    1.简介 今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现.到今天为止,大功即将告成:框架所需要的代码实现都基本完成. 2.data数据封装 2.1使用背景 在实际项目过程 ...

  10. Appium+python自动化(四十)-Appium自动化测试框架综合实践 - 代码实现(超详解)

    1.简介 今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现.由于时间的关系,宏哥这里用代码给小伙伴演示两个模块:注册和登录. 2.业务模块封装 因为现在各种APP的层出不群 ...

随机推荐

  1. C# Socket通信简单示例

    https://files.cnblogs.com/files/mojiejushi/SocketDemo.rar

  2. 在Linux系统中下载`gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu`工具链

    要在Linux系统中下载gcc-linaro-7.2.1-2017.11-x86_64_aarch64-linux-gnu工具链,你可以按照以下步骤进行操作: 点击查看代码 1. **打开终端**:你 ...

  3. python二级 计算生态

    生态地址: https://pypi.python.org/pypi 常用函数:

  4. ADO.NET中SQL绑定变量方式总结

    最近在项目上遇到几个问题,关于ADO.NET中SQL绑定变量 总结一下,分享给大家. 1. 使用 SqlParameter(推荐方式,防止 SQL 注入) ADO.NET 提供 SqlParamete ...

  5. .NET8中gRPC的使用

    在现代分布式系统中,服务之间的通信是一个非常重要的环节.随着微服务架构的流行,服务之间的通信方式也在不断演进.gRPC作为一种高性能.跨语言的RPC框架,逐渐成为了我们的首选. 一.简介 gRPC 是 ...

  6. delphi获取DOS命令行输出函数 运行CMD命令并获取结果

    procedure TForm1.Button4Click(Sender: TObject); var hReadPipe,hWritePipe:THandle; si:STARTUPINFO; ls ...

  7. leetcode每日一题:k-avoiding 数组的最小总和

    引言 ​ 今天是本次开始坚持leetcode每日1题的第10天,也算是迈出了一小步. 题目 2829. k-avoiding 数组的最小总和 给你两个整数 n 和 k . 对于一个由 不同 正整数组成 ...

  8. IDEA构建Maven项目生成的文件说明(.mvn、mvnw、mvnw.cmd、.gitignore、.iml、.idea、pom.xml)

    IDEA构建的maven+springBoot项目结构如下: 1..gitignore:分布式版本控制系统git的配置文件,意思为忽略提交 在 .gitingore 文件中,遵循相应的语法,即在每一行 ...

  9. Go单元测试与报告

    1.编写代码 1)打卡GoLand,新建项目命名为gotest 2)在gotest目录下新建两个go file,如下图所示: 其中CircleArea.go为计算圆面积的待测go程序,代码如下: pa ...

  10. 关于ffmpeg参数里的pcm_s16le

    关于ffmpeg参数里的pcm_s16le,查了很多资料,找到下面这句话: S16LE:S(signed)代表有符号,LE(little endian)为小端存储(先存低字节,再存高字节) ----- ...