20244104陈思淼 实验四 Python综合实践
课程:《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综合实践的更多相关文章
- 实验四 Python综合实践
课程:<Python程序设计> 班级:1843 姓名:章森洋 学号:20184307 实验教师:王志强 实验日期:2020年5月16日 必修/选修: 公选课 1.实验内容 此处填写实验的具 ...
- 20211306 实验四 Python综合实践
学号 20211306 <Python程序设计>实验四报告 课程:<Python程序设计> 班级: 2113 姓名: 丁文博 学号:20211306 实验教师:王志强 实验日期 ...
- 20193314白晨阳《Python程序设计》实验四 Python综合实践
课程:<Python程序设计> 班级: 1933 姓名: 白晨阳 学号:20193314 实验教师:王志强老师 实验日期:2021年6月13日 必修/选修: 公选课 实验内容: Pytho ...
- 20203412马畅若《Python程序设计》实验四Python综合实践报告
作为初次接触程序设计的我在看到云班课中用python进行游戏编程后感到很有意思,所以我决定这次做一个最经典的小鸟管道游戏.虽然网上许多大佬都说这是最基础的一项游戏编码,但我还是用了许多时间去做成这个游 ...
- 20201123 《python程序设计》实验四报告
20201123 2020-2021-2 <python程序设计>实验三报告 课程:<Python程序设计>班级:2011姓名:晏鹏捷学号:20201123实验教师:王志强实验 ...
- 20184302 2019-2020-2 《Python程序设计》实验四报告
20184302 2019-2020-2 <Python程序设计>实验四报告 课程:<Python程序设计> 班级: 1843 姓名: 李新锐 学号:184302 实验教师:王 ...
- 20212115朱时鸿 《python程序设计》实验四报告
课程:<Python程序设计>班级: 2121姓名: 朱时鸿学号:20212115实验教师:王志强实验日期:2022年5月28日必修/选修: 公选课 1.实验内容 Python综合应用:爬 ...
- Appium+python自动化(四十二)-Appium自动化测试框架综合实践- 寿终正寝完结篇(超详解)
1.简介 按照上一篇的计划,今天给小伙伴们分享执行测试用例,生成测试报告,以及自动化平台.今天这篇分享讲解完.Appium自动化测试框架就要告一段落了. 2.执行测试用例&报告生成 测试报告, ...
- Appium+python自动化(四十一)-Appium自动化测试框架综合实践 - 即将落下帷幕(超详解)
1.简介 今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现.到今天为止,大功即将告成:框架所需要的代码实现都基本完成. 2.data数据封装 2.1使用背景 在实际项目过程 ...
- Appium+python自动化(四十)-Appium自动化测试框架综合实践 - 代码实现(超详解)
1.简介 今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现.由于时间的关系,宏哥这里用代码给小伙伴演示两个模块:注册和登录. 2.业务模块封装 因为现在各种APP的层出不群 ...
随机推荐
- 【Python-Json】自定义类输入json序列化、json的读取与写入
AI 问答 Question json支持numpy数组么 Answer 不幸的是,标准的 JSON格式 不直接支持 NumPy 数组.JSON是一种用于存储和交换数据的文本格式,它有限的数据类型只包 ...
- Selenium KPI接口 屏幕截图
屏幕截图功能常用的有两种: savescreenshot()及 getscreenshotasfile(). 使用格式 self.driver.save_screenshot('baidu.png') ...
- STM32 学习方法
前言 学习知识要掌握有效的学习方法,学习技术也是一样,本篇分享关于我学习 STM32 后总结的学习方法. 推荐的学习方法 系统学习 在网上购买一款开发板,使用开发板+开发板配套视频教程+开发板配套源码 ...
- Go new函数 例子解析答疑
package main import "fmt" func main() { p1 :=new(int) *p1 =1 fmt.Println("p1",p1 ...
- g2o优化库实现曲线拟合
g2o优化库实现曲线拟合 最近学习了一下g2o优化库的基本使用,尝试着自己写了一个曲线拟合的函数,也就是下面这个多项式函数: \[y = ax^3 + bx^2 + cx + d \] 我们以 \(a ...
- [源码系列:手写spring] AOP第一节:切点表达式
在本专栏之前的文章中已经带大家熟悉了Spirng中核心概念IOC的原理以及手写了核心代码,接下来将继续介绍Spring中另一核心概念AOP. AOP即切面编程是Spring框架中的一个 ...
- dxSpreadSheet的报表demo-关于设计报表模板问题
学习 dxSpreadSheetReportDesigner过程中发现: dxSpreadSheet通过dxSpreadSheetReportDesigner点击右键出现弹出菜单,自动生成如图的菜单和 ...
- 推荐Linux命令行运维工具: Wowkey--实现自动化批量化标准化
WowKey命令行运维工具,Linux设备的自动化.批量化.标准化的运维解决方案,解放运维人,提升企业运维效率和质量. 有人能理解做设备的运营维护工作的痛苦所在吗? 如果你的运维工作中,只维护个位数数 ...
- Electron 开发:获取当前客户端 IP
Electron 开发:获取当前客户端 IP 一.背景与需求 1. 项目背景 客户端会自启动一个服务,Web/后端服务通过 IP + port 请求以操作客户端接口 2. 初始方案与问题 2.1. 初 ...
- Java 单元测试简单扫盲
前言 仔细回想起来,上次认真编写单元测试已经是两年前的事了.那时候觉得写单元测试是种负担. 为了应付代码覆盖率要求,常常依赖工具自动生成测试用例,有时需要启动Spring容器,有时又不需要(当时还分不 ...