110
社区成员
发帖
与我相关
我的任务
分享课程:《Python程序设计》
班级: 2312
姓名: 范云炅
学号:20231219
实验教师:王志强
实验日期:2023年5月26日
必修/选修: 公选课
1.实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全、计算器、信息收集与处理等。
我的实验内容:贪吃蛇
实验过程及结果
调用函数库
import sys
import random
import pygame
游戏代码:
定义了一个蛇
class Snake(object):
def __init__(self):
self.direction = 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.direction == pygame.K_LEFT:
node.left -= 25
elif self.direction == pygame.K_RIGHT:
node.left += 25
elif self.direction == pygame.K_UP:
node.top -= 25
elif self.direction == 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.direction in LR):
return
if(curkey in UD) and (self.direction in UD):
return
self.direction = curkey
定义了一个随机出现的食物
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 = []
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)
进行分数显示以及死亡展示和处理食物
```
if not isdead:
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,200),'press space to try again',(0,0,27),False,30)
#处理食物
if food.rect == snake.body[0]:
scores += 50
food.remove()
snake.addnode()
food.set()
pygame.draw.rect(screen,(136,0,24),food.rect,0)
#显示分数文字
show_text(screen,(50,500),'Scores:' + str(scores),(223,223,223))
pygame.display.update() #更新
clock.tick(10)
3.完整代码
import sys
import random
import pygame
#全局定义
SCREEN_X = 800
SCREEN_Y = 800
#蛇
class Snake(object):
def init(self):
self.direction = 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.direction == pygame.K_LEFT:
node.left -= 25
elif self.direction == pygame.K_RIGHT:
node.left += 25
elif self.direction == pygame.K_UP:
node.top -= 25
elif self.direction == 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.direction in LR):
return
if(curkey in UD) and (self.direction in UD):
return
self.direction = curkey
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 = []
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('贪吃猪猪')
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)
if event.key == pygame.K_SPACE and isdead:
return main()
screen.fill((255,255,255))
if not isdead:
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,200),'press space to try again',(0,0,27),False,30)
#处理食物
if food.rect == snake.body[0]:
scores += 50
food.remove()
snake.addnode()
food.set()
pygame.draw.rect(screen,(136,0,24),food.rect,0)
#显示分数文字
show_text(screen,(50,500),'Scores:' + str(scores),(223,223,223))
pygame.display.update() #更新
clock.tick(10)
main()
```
介绍视频
解答:通过观看视频,查找教程,了解到可以通过调用PYGAME来做游戏界面
2.问题:开始不了解怎么控制蛇的移动?
解答:可以用键盘输入数据继而接受信号,达到效果。
3.问题:不知道如何设置游戏字体与颜色?
解答:通过观看视频调用函数进而实现
4.问题:不知道如何进行难度升级?
解答:通过进行分数的判断从而改变蛇的移动速度
5.课程总结及感想
1.从一开始的基础语句,紧接着就学习了流程控制语句,包括if、elif、else和for语句,while等等。然后就是序列,有列表、元组、集合、字典,还讲解它们之间的区别,每种之间修改的在答题与细节上的差别,同时有无改变元数据之间的关系。后来就学了字符串以及正则表达式,还学了函数。然后就学习了面向对象,了解到PYTHON是一个使用面向对象思想的环境。了解类和属性,虽然现在还有点不太懂。后面还学了模块、异常处理及程序调试。学习了SOCKET(IP+端口),实现了对话。最后学习了爬虫与反爬虫技术。
2.在学习了python这门课后,相较于之前的c语言来说感到真的简单且好用,PYTHON用于做一些游戏与程序的思想与C语言的差别不同,同时也感觉到使用PYTHON带来的方便与简捷。PYthon 的很多库使用起来可以节约很多的时间,但是同时也不能过于依赖库函数,要形成编程的逻辑思想与代码实现,代码要落地实践,要真的学懂,而不是做一个人工爬虫。
3.人生苦短,我用python!!