课程:《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. excel 文件提示已受损 解决方案

    1.打开office excel 2.python 语言save 方法导致,将后缀改为.xls 3.用WPS打开

  2. npm淘宝镜像证书过期

    前言 使用 npm 报错: npm ERR! request to https://registry.npm.taobao.org/xxx failed, reason: certificate ha ...

  3. golang interface 转 string、int、float64

    interface{} interface{} 接口.interface{} 类型很多人都会混淆.interface{} 类型是没有方法的接口.由于没有 implements 关键字,所以说所有的类型 ...

  4. protobuf优缺点及编码原理

    什么是protobuf protobuf(Google Protocol Buffers),官方文档对 protobuf 的定义:protocol buffers 是一种语言无关.平台无关.可扩展的序 ...

  5. Swarm集群部署、集群架构、集群管理 、服务管理

    一.部署swarm集群 #docker swarm简介 Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose ...

  6. 卧槽!C 语言宏定义原来可以玩出这些花样?高手必看!

    大家好啊!我是小康. 今天我们来聊一个听起来枯燥但实际上暗藏玄机的话题 -- C 语言的宏定义. 啥?宏定义?那不就是个简单的替换工具吗? 兄dei,如果你也是这么想的,那可就大错特错了!宏定义在 C ...

  7. 学习unigui【20】unistringGrid

    做成下面效果图: 采用unistringGrid控件. 问题: 1.不同的日期区间如何得到.如: 项目   开始时间时间 -- 终止使用时间 呼吸机  yyyy-mm-dd   yyyy-mm-dd ...

  8. jeecgboot前端按钮角色权限控制(是否隐藏)

    官方文档 http://doc.jeecg.com/2044038 解决办法 首先需要修改前端代码,在想获得权限控制的按钮组件中使用指令 v-has="''". 代码示例: < ...

  9. Mapper.xml配置的几种方法:

    一. 7.4.1. <mapper resource=" " /> 使用相对于类路径的资源(现在的使用方式,UserMapper接口与UserMapper.xml的包路 ...

  10. java基础之数据结构

    一.栈:stack,又称堆栈[出口和入口在同一侧],特点:先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素) 例子:子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当 ...