93
社区成员
发帖
与我相关
我的任务
分享
课程:《Python程序设计》
班级: 2342
姓名: 涂一涵
学号:20234211
实验教师:王志强
实验日期:2024年5月21日
必修/选修: 专选课
1.实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
2. 实验过程及结果
思考过后,我选择尝试开发简单的“贪吃蛇”小游戏,下面将呈现该游戏代码的编写与实现。
注1:在实验过程中本人不会的东西都是在网上学习,在下文不过多阐述。
注2:本报告所有展示图片、代码均为编写完成后的结果。
(1)前期准备
首先我通过查找网上资料,得知开发python游戏前,需配置好pygame操作环境,以保证游戏正常运行
以下为pygame的配置过程:
1.打开终端:在PyCharm中,在底部找到一个终端面板。还可以点击底部工具栏的"Terminal"选项卡,或者使用快捷键(通常是Alt + F12)来打开终端。
2.安装Pygame:在终端中,使用以下命令来安装Pygame:”pip install pygame“
结果展示:

(2)文件编写
1.全局定义:设置x轴与y轴范围

2.编写程序控制“蛇的运动”
设置“移动单位距离”,“蛇的初始属性”
因为在前进过程中,“蛇的前端”向前移动,所以要设置“前端增加蛇块”
又因为"蛇的尾端"也会随之向前移动,所以还需要设置“删除最后一个块”

3.设置游戏结束条件:
即当蛇头碰到墙面时,游戏结束
但是,在我第一次运行的过程中,我发现蛇的运动方向出现了问题,在查找资料后,我找到了原因:
在蛇的运动过程中,由于蛇头面对的方向一直在变化,蛇的左右也会变化。单纯的“左右控制方向”导致蛇的移动与我们的预期不同
因此,此时还要补充设置:当蛇移动时,操作对应的“上下左右”始终不变,即“改变方向,但左右、上下不能被逆向改变”

4.为增添游戏趣味性,我还设置了“分数计算程序”
当蛇在移动时,每一步“+1分”;当蛇吃到“果实”时,“+50分”
我对“吃到果实”的设置条件是:“当食物与蛇头重合,吃掉”
结果如图:


5.检查代码,试运行
检验游戏运行一切正常,无论是“计分系统”,蛇的运动,还是游戏结束的判定一切正常运行。
以下为运行成果展示(附视频展示):


运行视频:
最后,附上源代码
import pygame
import sys
import random
# 全局定义
SCREEN_X = 600
SCREEN_Y = 600
# 蛇类
# 点以25为单位
class Snake(object):
# 初始化各种需要的属性 [开始时默认向右/身体块x5]
def __init__(self):
self.dirction = pygame.K_RIGHT
self.body = []
for x in range(5):
self.addnode()
# 无论何时 都在前端增加蛇块
def addnode(self):
left,top = (0,0)
if self.body:
left,top = (self.body[0].left,self.body[0].top)
node = pygame.Rect(left,top,25,25)
if self.dirction == pygame.K_LEFT:
node.left -= 25
elif self.dirction == pygame.K_RIGHT:
node.left += 25
elif self.dirction == pygame.K_UP:
node.top -= 25
elif self.dirction == pygame.K_DOWN:
node.top += 25
self.body.insert(0,node)
# 删除最后一个块
def delnode(self):
self.body.pop()
# 死亡判断
def isdead(self):
# 撞墙
if self.body[0].x not in range(SCREEN_X):
return True
if self.body[0].y not in range(SCREEN_Y):
return True
# 撞自己
if self.body[0] in self.body[1:]:
return True
return False
# 移动!
def move(self):
self.addnode()
self.delnode()
# 改变方向 但是左右、上下不能被逆向改变
def changedirection(self,curkey):
LR = [pygame.K_LEFT,pygame.K_RIGHT]
UD = [pygame.K_UP,pygame.K_DOWN]
if curkey in LR+UD:
if (curkey in LR) and (self.dirction in LR):
return
if (curkey in UD) and (self.dirction in UD):
return
self.dirction = curkey
# 食物类
# 方法: 放置/移除
# 点以25为单位
class Food:
def __init__(self):
self.rect = pygame.Rect(-25,0,25,25)
def remove(self):
self.rect.x=-25
def set(self):
if self.rect.x == -25:
allpos = []
# 不靠墙太近 25 ~ SCREEN_X-25 之间
for pos in range(25,SCREEN_X-25,25):
allpos.append(pos)
self.rect.left = random.choice(allpos)
self.rect.top = random.choice(allpos)
print(self.rect)
def show_text(screen, pos, text, color, font_bold = False, font_size = 60, font_italic = False):
#获取系统字体,并设置文字大小
cur_font = pygame.font.SysFont("宋体", font_size)
#设置是否加粗属性
cur_font.set_bold(font_bold)
#设置是否斜体属性
cur_font.set_italic(font_italic)
#设置文字内容
text_fmt = cur_font.render(text, 1, color)
#绘制文字
screen.blit(text_fmt, pos)
def main():
pygame.init()
screen_size = (SCREEN_X,SCREEN_Y)
screen = pygame.display.set_mode(screen_size)
pygame.display.set_caption('Snake')
clock = pygame.time.Clock()
scores = 0
isdead = False
# 蛇/食物
snake = Snake()
food = Food()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if event.type == pygame.KEYDOWN:
snake.changedirection(event.key)
# 死后按space重新
if event.key == pygame.K_SPACE and isdead:
return main()
screen.fill((255,255,255))
# 画蛇身 / 每一步+1分
if not isdead:
scores+=1
snake.move()
for rect in snake.body:
pygame.draw.rect(screen,(20,220,39),rect,0)
# 显示死亡文字
isdead = snake.isdead()
if isdead:
show_text(screen,(100,200),'YOU DEAD!',(227,29,18),False,100)
show_text(screen,(150,260),'press space to try again...',(0,0,22),False,30)
# 食物处理 / 吃到+50分
# 当食物rect与蛇头重合,吃掉 -> Snake增加一个Node
if food.rect == snake.body[0]:
scores+=50
food.remove()
snake.addnode()
# 食物投递
food.set()
pygame.draw.rect(screen,(136,0,21),food.rect,0)
# 显示分数文字
show_text(screen,(50,500),'Scores: '+str(scores),(223,223,223))
pygame.display.update()
clock.tick(10)
if __name__ == '__main__':
main()
3.实验过程中遇到的问题和解决过程
在实验过程中,我也遇到了许多问题:
编写的程序运行不了,显示找不到所需要的文件
贪吃蛇的运动方向有时候和控制的方向不一样
我和同学在这个问题上讨论很久,并查找了相关资料,知识,最终找到了以下解决方法
编写的程序运行不了是缺少了pygame,在下载,更新pygame后,程序得以运行
贪吃蛇运动方向不一致是因为:第一次编写程序时,未设置“左右、上下不能被逆向改变”,因为如果是单纯的“左右控制方向”,那么当蛇头面对的方向变化,蛇自己的左右方向就会随之变化,导致蛇的移动与我们的预期不同。在了解问题成因之后,我添设了一个限制:即“改变方向,但左右、上下不能被逆向改变”,蛇的运动恢复正常
4.实验4的感想与体会
在此次实验过程中,我体会到了python编程的乐趣与强大功能。当然,没有一帆风顺的事情:在此次程序编写中,我遇到了很多困难,也学习到了很多新知识。看到游戏正常运行后,我体验到了很强的成就感,对python的喜爱之情油然而生。后续我将继续深入学习,学有余力的情况下尝试开发其他趣味小游戏,深入学习python的相关功能。
5.全课总结
非常感谢王志强老师一个学期的倾情教导,细心地教授,不厌其烦地一次又一次解答同学们在学习中遇到的问题。尤其是结课时,送给我们的临别赠语,充满了对教学事业的热爱以及对同学们倾注的热情。作为一名文科生,我对Python由最初的陌生与好奇变成了熟悉与喜爱,在学习这门课程前,我无法想象自己可以独立制作一个游戏或者进行爬虫,进步之大令人震惊。这门课不仅仅提高了我的动手操作能力,更是培养了我勇于探索、勤于动手、善于思考的精神。
体会:在报名选修课时,由于选择太多,我的备选课程迟迟未敲定,但是唯一确定的一门选修课便是python程序设计,虽然这门编程语言没有纳入必修课中,但我认为python对专业后期的学习有很大帮助,它在游戏开发、网站制作等方面比其他编程语言更为强大,也更多被使用。
这学期刚开始的几节课是学习基本语法,我听得十分投入认真,害怕基础打得不牢而跟不上后续学习进度,所以我都有认真记笔记与阅读相关教材。但后来学习socket编程技术后,我渐渐开始感到吃力,于是我在下课后经常去找老师答疑解惑,老师讲得很好,循循善诱,给我很大的启发,同时我还花更多的课下时间学习相关知识。虽然牺牲了很多课余时间,但是我确实学到了很多。包括课程最后的大作业实践,能让我在亲身实践过程中体验python编程的趣味。本课程还有一点优势,让我收获很大,便是平时的英语打卡,这一点很创新,并且很有效果,将编程语言与英语同步学习,事半功倍。
意见和建议:志强老师的课真的非常有趣,虽然后期的python学习我比较吃力,但是上课时并不会让我觉得枯燥乏味,非常感谢志强老师的付出!感觉课程后期稍微进度稍微有些快,对于编程与理解能力较差的同学来说相对吃力;同时希望该课程能够出一套自编教材讲义,供同学们学习使用,统一购买的教材太笨重,使用率低,可以根据课程具体情况适当简化、总结等等。
最后,再次感谢王志强老师。在未来的日子里我会继续学习Python知识,始终保持对未知世界的探索热情,希望有机会可以再参与王老师的课堂。