课程:《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. 【Python-Json】自定义类输入json序列化、json的读取与写入

    AI 问答 Question json支持numpy数组么 Answer 不幸的是,标准的 JSON格式 不直接支持 NumPy 数组.JSON是一种用于存储和交换数据的文本格式,它有限的数据类型只包 ...

  2. Selenium KPI接口 屏幕截图

    屏幕截图功能常用的有两种: savescreenshot()及 getscreenshotasfile(). 使用格式 self.driver.save_screenshot('baidu.png') ...

  3. STM32 学习方法

    前言 学习知识要掌握有效的学习方法,学习技术也是一样,本篇分享关于我学习 STM32 后总结的学习方法. 推荐的学习方法 系统学习 在网上购买一款开发板,使用开发板+开发板配套视频教程+开发板配套源码 ...

  4. Go new函数 例子解析答疑

    package main import "fmt" func main() { p1 :=new(int) *p1 =1 fmt.Println("p1",p1 ...

  5. g2o优化库实现曲线拟合

    g2o优化库实现曲线拟合 最近学习了一下g2o优化库的基本使用,尝试着自己写了一个曲线拟合的函数,也就是下面这个多项式函数: \[y = ax^3 + bx^2 + cx + d \] 我们以 \(a ...

  6. [源码系列:手写spring] AOP第一节:切点表达式

    在本专栏之前的文章中已经带大家熟悉了Spirng中核心概念IOC的原理以及手写了核心代码,接下来将继续介绍Spring中另一核心概念AOP.         AOP即切面编程是Spring框架中的一个 ...

  7. dxSpreadSheet的报表demo-关于设计报表模板问题

    学习 dxSpreadSheetReportDesigner过程中发现: dxSpreadSheet通过dxSpreadSheetReportDesigner点击右键出现弹出菜单,自动生成如图的菜单和 ...

  8. 推荐Linux命令行运维工具: Wowkey--实现自动化批量化标准化

    WowKey命令行运维工具,Linux设备的自动化.批量化.标准化的运维解决方案,解放运维人,提升企业运维效率和质量. 有人能理解做设备的运营维护工作的痛苦所在吗? 如果你的运维工作中,只维护个位数数 ...

  9. Electron 开发:获取当前客户端 IP

    Electron 开发:获取当前客户端 IP 一.背景与需求 1. 项目背景 客户端会自启动一个服务,Web/后端服务通过 IP + port 请求以操作客户端接口 2. 初始方案与问题 2.1. 初 ...

  10. Java 单元测试简单扫盲

    前言 仔细回想起来,上次认真编写单元测试已经是两年前的事了.那时候觉得写单元测试是种负担. 为了应付代码覆盖率要求,常常依赖工具自动生成测试用例,有时需要启动Spring容器,有时又不需要(当时还分不 ...