20254127汤中凯 实验四 Python综合实践
20254127 2025-2026-2 《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 2541
姓名: 汤中凯
学号:20254127
实验教师:王志强
实验日期:2026年5月14日
必修/选修: 专选课
实验内容:Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
例如:利用公开数据集,开展图像分类、恶意软件检测等
例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
例如:爬取天气数据,实现自动化微信提醒
例如:利用爬虫,实现自动化下载网站视频、文件等。
例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等
注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
一、实验分析
1.实验主题
本次综合实践我选择做一款简易控制台飞机大战小游戏。相比于爬虫、数据分析、网络安全这些难度偏高的项目,控制台小游戏不用安装复杂第三方库,代码通俗易懂,逻辑更加直观,适合我现阶段的编程水平,方便调试修改。
2.实验目的
这学期上完Python课程,我对基础语法有了一定了解,但是平时没有完整做过一个成型的程序。这次小游戏开发,主要是想把课堂上学到的知识结合起来,用到实际项目里,锻炼自己代码逻辑和排错、调试代码的能力。
3.需求分析
我想要做一个操作简单、字符界面的控制台飞机小游戏。游戏需要实现飞机移动、发射子弹、敌机生成、碰撞判定、计分、生命值、游戏重启等功能。程序要能够稳定运行,没有闪退、卡死等问题,操作逻辑通俗易懂,不需要复杂学习就可以上手游玩。
二、实验设计
1.开发环境
本次代码编写使用Windows系统,编译器选用PyCharm,Python版本为3.13。
2.整体设计思路
我把游戏里不同的物体分开编写,主要分为玩家飞机、敌机、子弹三个类。每个类单独写属性和行为,这样代码不会混乱,后期修改也方便。程序采用死循环不断刷新控制台界面、监控键盘输入、判断碰撞逻辑,最后实时展示分数和生命值。
3.功能模块设计
①玩家操控模块:设置 a、d、w、s 按键操控飞机完成上下左右移动,同时增加边界判断,避免飞机移出游戏可视区域。


②子弹射击模块:按下对应按键即可发射子弹,当子弹飞出界面顶部时会自动移除,减少无效数据占用系统资源。



③敌机生成模块:程序会在界面顶部随机刷新敌机,并且为每架敌机设置不同的下落速度,提升游戏的随机性与趣味性。



④碰撞检测模块:增加碰撞判断逻辑,子弹击中敌机、敌机撞上玩家飞机都会触发对应效果,分别完成计分和扣除生命值的操作。



⑤数据显示模块:在控制台界面同步展示实时分数与剩余生命值,能够直观查看当前游戏状态。

⑥游戏重置模块:生命值耗尽时游戏自动结束,按下指定按键可中途退出游戏,结束后需重新运行程序开启新对局。



三、实验实现过程
(1)最开始我没有使用任何第三方库,直接利用Python自带库搭建游戏框架,自定义游戏界面大小,设置基础字符图案。之后我依次编写玩家、敌机、子弹三个类,给每个物体设置坐标、位置、移动速度等基础属性。
(2)代码编写中期,我写了死循环主结构,用来不断刷新控制台页面、监听键盘输入。一开始我遇到不少问题,比如飞机越界、子弹堆积、敌机生成错乱等。我通过添加坐标边界判断、自动删除超出范围物体、随机刷新敌机的方式解决了这些bug。
(3)后期我加入碰撞检测、计分系统和生命值系统,设置玩家一共3条命,撞击敌机就扣除生命。最后添加游戏结束提示和重置功能,反复运行调试,优化刷新卡顿问题,保证程序运行流畅稳定。
四、实验结果
(1)操作说明:
运行代码,控制台会生成游戏界面,玩家通过键盘按键完成游戏操作。游戏内操作按键规则如下:按下w键控制飞机向上移动,s键控制飞机向下移动,a键控制飞机向左移动,d键控制飞机向右移动;按下j键可以发射子弹攻击敌机;若想要提前结束游戏,按下q键即可退出程序。
游戏中玩家操控的飞机标识为▲,敌方飞机标识为●,子弹标识为|。每击落一架敌机获得10积分,界面上方实时显示当前分数和剩余生命值,玩家初始拥有3点生命值,触碰敌机将会扣除生命值,生命值归零则判定游戏结束。由于是控制台程序,每输入一次按键需要按下回车键确认操作,界面会自动刷新,属于正常运行机制,不影响游戏体验与程序使用。
(2)代码如下:
# 飞机大战
import random
import time
import os
# 清空控制台
def clear():
os.system("cls")
# 游戏基础设置
WIDTH = 20
HEIGHT = 15
# 玩家飞机类
class Player:
def __init__(self):
self.x = WIDTH // 2
self.y = HEIGHT - 2
self.hp = 3
def move(self, direction):
# 边界限制
if direction == "left" and self.x > 0:
self.x -= 1
elif direction == "right" and self.x < WIDTH - 1:
self.x += 1
elif direction == "up" and self.y > 0:
self.y -= 1
elif direction == "down" and self.y < HEIGHT - 1:
self.y += 1
# 子弹类
class Bullet:
def __init__(self, x, y):
self.x = x
self.y = y - 1
def update(self):
self.y -= 1
# 敌机类
class Enemy:
def __init__(self):
self.x = random.randint(0, WIDTH - 1)
self.y = 0
self.speed = random.uniform(0.3, 0.8)
def update(self):
self.y += self.speed
# 游戏主类
class Game:
def __init__(self):
self.player = Player()
self.bullets = []
self.enemies = []
self.score = 0
self.game_over = False
# 绘制游戏界面
def draw(self):
map_data = [[" " for _ in range(WIDTH)] for _ in range(HEIGHT)]
# 绘制玩家
map_data[self.player.y][self.player.x] = "▲"
# 绘制子弹
for b in self.bullets:
if 0 <= b.y < HEIGHT:
map_data[int(b.y)][b.x] = "|"
# 绘制敌机
for e in self.enemies:
if 0 <= int(e.y) < HEIGHT:
map_data[int(e.y)][e.x] = "●"
# 打印界面
for line in map_data:
print("".join(line))
print(f"分数:{self.score} 生命值:{self.player.hp}")
# 碰撞检测
def is_collide(self, x1, y1, x2, y2):
return int(x1) == int(x2) and int(y1) == int(y2)
# 游戏运行
def run(self):
while not self.game_over:
clear()
self.draw()
# 随机生成敌机
if random.random() < 0.2:
self.enemies.append(Enemy())
# 更新子弹
for b in self.bullets[:]:
b.update()
if b.y <= 0:
self.bullets.remove(b)
# 更新敌机
for e in self.enemies[:]:
e.update()
# 子弹击中敌机
for b in self.bullets[:]:
if self.is_collide(e.x, e.y, b.x, b.y):
self.enemies.remove(e)
self.bullets.remove(b)
self.score += 10
break
# 敌机撞击玩家
if self.is_collide(e.x, e.y, self.player.x, self.player.y):
self.enemies.remove(e)
self.player.hp -= 1
if self.player.hp <= 0:
self.game_over = True
# 操作指令
print("操作:a左 d右 w上 s下 j发射 q退出")
op = input("请输入操作:")
if op == "a":
self.player.move("left")
elif op == "d":
self.player.move("right")
elif op == "w":
self.player.move("up")
elif op == "s":
self.player.move("down")
elif op == "j":
self.bullets.append(Bullet(self.player.x, self.player.y))
elif op == "q":
break
clear()
print("==========游戏结束==========")
print(f"最终得分:{self.score}")
print("按回车退出游戏")
input()
# 程序入口
if __name__ == "__main__":
game = Game()
game.run()


- (3)程序运行演示视频:点击查看B站视频
五、课程总结、心得体会与建议
1.课程总结
这学期选择Python课,我真的是从零基础起步,逐步掌握了变量、循环、列表、函数、等知识。前三次实验报告自己在做的时候,虽有困难卡壳,但还算圆满吧。这次综合实践我选择了设计飞机大战游戏,用Python实现。我把玩家、敌机、子弹分别写成类,自己处理移动、射击、碰撞检测、计分和生命值等逻辑。写完能跑起来的那一刻,挺有成就感的。这个过程让我对基础语法和面向对象编程理解得更扎实了。
2.课程感想体会
(1)我对Python的基础知识有了更深入的理解,能够简单运用和设计了。比如写猜拳游戏时,我要用随机数决定电脑出拳,用条件判断比较双方出拳,再用循环让玩家玩多轮。这一套做下来,基础语法算是彻底搞明白了,也理解了编程的逻辑是怎么回事。
(2)Python教会了我怎么认真做好一件事。写代码时,我经常犯一些小错误,比如拼写不对、缩进有问题,甚至漏掉冒号。虽然每次实验都会遇到各种问题,代码跑不起来,但经过无数次的修改调试,最终运行成功的那一刻,特别有成就感和满足感。
(3)最后,Python在以后的工作和生活中用处真的很多。未来工作中,像数据分析、统计信息这些,Python能快速处理,提高效率。生活中,我喜欢玩游戏,以后想自己做个小游戏和朋友分享,现在学到的知识就能把想法变成现实。
(4)总的来说,学了Python之后,我的收获还是蛮大的。非常感谢老师和同学的帮助,我和同伴做实验报告三卡住的时候问学得比较好的同学,同学拿他的电脑给我们演示了一下,然后我自己再操作一遍,慢慢就会了。同时我也学会了自己去查资料解决问题,有时不能只等着别人救。
3.意见和建议
(1)意见:赞赞赞,老师讲得清楚,节奏也适合我们零基础的同学。
(2)建议(希望能让以后的课程更更好,学弟学妹们受大益)
鉴于每个人的学习能力与接受新事物的能力不同,我觉得Python课程可以分小组,组长为Python能力较强的,一个组长带几位组员,做实验报告的时候可以让组长给有困难的组员教一下,期末给优秀的组长适当加分。如果可以的话,还能布置一些团队作业,让大家一起做项目或者是游戏之类的。
以上就是我的一些真实感受和想法。这门课让我收获很大,不仅学到了知识,也让我对编程有了兴趣。谢谢老师一学期的耐心讲解!咱有缘再会!
参考资料
- 《Python程序设计》