42
社区成员
发帖
与我相关
我的任务
分享
#课程:《Python程序设计入门》
#班级: 2241
#姓名: Wc
#学号:20224115
#实验教师:wzq
#实验日期:2023年5月31日
#必修/选修: 专选课
##实验内容:
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
##实验要求:
(1)程序能运行,功能丰富。(需求提交源代码,并建议录制程序运行的视频)
(2)综合实践报告,要体现实验分析、设计、实现过程、结果等信息,格式规范,逻辑清晰,结构合理。
(3)实验4的遇到的问题以及感想体会。
(4)对全课进行总结,并写课程感想体会、意见和建议等。
##实验过程:
编写小游戏:贪吃蛇




源代码:
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()
效果展示

四、实验遇到的问题以及感想
1.代码掌握不熟练,常常忘记怎么编。需要经常查找网络与鼠标
2.细节注意不到位,编写代码时总出现一楼,导致代码不能正常运行
3.对pygame了解不熟,最初编写的时候总是出问题,还在有同学的帮助。
#实验总结&课程总结
1.一定不要以为自己可以解决所有问题,学习python是很抽象的,尤其是在刚开始学的时候,很多时候都会感到无从下手。
所以我学会一定要懂得借力,找一些身边学得好的同学,或者你认识的朋友带带你,有人指引会事半功倍,效率更高。
2.学python就与学数学一样,是不能只看书不做题的,直接看步骤和答案会让人误以为自己全都掌握了,但是碰到生题的时候还是会一筹莫展。
因此在学习python的过程中一定要记得多动手写代码,旨在课堂上听老师讲是没多大用的,自己实际操作时该不会还是不会,一定要多上机实验
3.王志强老师讲的也很好,是我见过最厉害的python老师,课堂生动有趣,也是少数提问不会也不惩罚的老师,使我们的学习热情提高,二十多个小白在经历半年后已经能独立编写小游戏了,有好的老师指引在专业学习中真的是一件很有用的事。
总结起来,学习Python是一段有趣而充实的旅程。通过不断学习和实践,我在半年的时间里建立了坚实的编程基础,并且对Python的小游戏应用领域有了更深入的了解。我相信,只要保持热情和持续学习,我会在Python编程领域不断成长。