天天酷跑小游戏
(Python)
目 录
一.选题背景…………………………………………1
二.设计流程…………………………………………2
2.1算法思想……………………………………………………………… 2
2.2类的设计……………………………………………………………… 2
2.3界面设计……………………………………………………………… 3
2.4 pygame安装………………………………………………………… 3
三.测试结果………………………………………… 6
3.1游戏界面……………………………………………………………… 6
3.1一段跳………………………………………………………………… 6
3.2二段跳………………………………………………………………… 6
3.3三段跳………………………………………………………………… 7
四.心得体会………………………………………… 8
五.附录代码………………………………………… 9
六.参考文章…………………………………………16
一、选题背景
互联网的发展使人类进入了一个全新的世界,一个虚拟的网络世界。在虚拟的网络世界里,用户只要使用输入设备便能够向网络世界中发送信息。随着网络的不断发展,‘网络游戏’这个名词进入了我们的视野中,网络游戏可以让用户远隔千里仍然可以像面对面一样玩游戏。
《天天酷跑》是由腾讯旗下工作室“天美艺游工作室”2013年9月16日研发的一款角色扮演类游戏。游戏讲述了主角们的朋友小护士被魔王掳走的故事,玩家将扮演双枪小帅,猫小萌等角色进行奔跑从而从魔王的手中解救小护士。天天酷跑是一款供大家休闲娱乐的网络游戏,游戏通过按键控制双枪小帅跳跃障碍物来获得分数。
游戏背景:
原本安宁的生活被打破,突然出现的大魔王掳走了主角们的朋友小护士。主角双枪小帅,刀锋宝贝,猫小萌等人组成了营救队伍,不惧艰险,一路奔跑,闯过重重难关,战胜各类怪物,踏上了拯救小护士的旅程,最终在朋友的努力下,小护士被成功地从大魔王的手中解救了出来,并加入了主角一行人,向着远方继续奔跑。
二、设计流程
2.1 算法思想
- 创建游戏主界面,确定窗口的坐标;
- 设计游戏开始界面显示信息及信息坐标;
- 设置游戏进行中的信息, Role的移动、跳跃,达到得分的效果;
- 处理游戏进行中的碰上障碍物的条件;
- 设计游戏结束界面显示信息及信息坐标;
- 处理游戏重新开始满足的条件;
- 装载图像;
- 对游戏进行调试和改进,使这个游戏更加完善。
2.2 类的设计
一共有三个类:
1.Role(人物类)
属性:
surface:代表一个矩形的影像,用来绘制在屏幕上, y: Role的坐标, w:人物的宽度, h:Role的高度, currentFrame:当前的位置, state:0代表跑步状态,1代表跳跃状态,2代表连续跳跃,3代表三段跳, g:重力加速度vy:y轴速度, vy_start:起跳开始速度。
方法:init()初始化,getRect()
2.Object(障碍物类)
属性: surface代表一个矩形的影像,用来绘制在屏幕上,x:横坐标,y:纵坐标,w:宽度,h:高度,currentFrame:当前的位置。
方法:getRect(self),collision(self,rect1,rect2):碰撞检测
3.Bg(背景类)
方法:init(self,surface):初始化
一些函数:
initGame() #游戏初始化
addObject() #增加障碍物
updateLogic() #更新
updateView(screen) #更新
judgeState(screen) #判断状态
main()主函数
2.3 界面设计
width = 1200 #窗口宽度
height = 508 #窗口高度
size = width, height #窗口尺寸
score=None #分数
myFont=myFont1=None #字体
surObject=None #障碍物图片
surGameOver=None #游戏结束图片
bg=None #背景对象
role=None #人物对象
object=None #障碍物对象
objectList=[] #障碍物对象数组
clock=None #时钟
gameState=None #游戏状态(0,1)表示(游戏中,游戏结束)
2.4 pygame安装
1.windows安装Python的步骤省略
2.下载并安装pip
打开https://pip.pypa.io/en/stable/installing/,找到红框标记的文件并另存为,进入到下载目录,shift+鼠标右键,点击在此处打开命令窗口,执行 python get-pip.py,一会就安装成功了。
3.下载并安装pygame
由于我的python3.8是32位的,所以也下载的是32位的pygame,python和pygame一定要保持一致,要么都是32位,要么都是64位。打开 https://www.lfd.uci.edu/~gohlke/pythonlibs/#pygame找到Pygame,并下载适应你电脑系统的版本。
下载完之后同样进入到下载目录打开命令窗口,执行pip install pygame-1.9.3-cp36-cp36m-win32.whl进行安装,执行完系统会提示已经安装成功,这时候创建一个python文件,import pygame就可以正常运行了(一定要按照顺序安装,即按照安装Python -> pip -> pygame的顺序)。
三、测试结果
3.1 游戏界面
3.2 一段跳
3.3 二段跳
3.4 三段跳(跳没了)
四、心得体会
通过完成此次天天酷跑小游戏的课程设计,我体会到想要完成一个设计离不开平时的学习、知识积累。平时积累的知识能够转化为设计中的一些小小的点子,python的每一个库的功能都很强大,小游戏最主要使用了python的pygame这个库,想要了解python更强大的功能就必须去深入了解pygame库中各种函数及属性。
其次,通过此次课程设计我学会了关于使用类的一些知识,想要完成很多功能,程序中使用了类。在类中我定义了许多不同功能的函数和属性。当调用不同的函数时,每个函数都完成自己的功能。游戏素材以及开发时间的有限,这个游戏只实现了简单的游戏功能,后续可以进行更多玩法的开发。
最后,我想感谢本学期为我们讲授Python这门课程的曾伟老师,她的课堂诙谐幽默,让我学到了很多编程的知识,课程设计得以完成少不了曾老师的悉心指导也离不开帮助我的同学们。在此,对他们表示衷心的感谢!
五、附录代码
‘’’
游戏介绍:
按up键或W进行游戏,最多可以三段跳,游戏失败后按空格键重新开始
‘’’
import pygame,sys
import random
游戏配置
width = 1200 #窗口宽度
height = 508 #窗口高度
size = width, height
score=None #分数
myFont=myFont1=None #字体
surObject=None #障碍物图片
surGameOver=None #游戏结束图片
bg=None #背景对象
role=None #人物对象
object=None #障碍物对象
objectList=[] #障碍物对象数组
clock=None #时钟
gameState=None #游戏状态(0,1)表示(游戏中,游戏结束)
class Role: #人物
def init(self,surface=None,y=None):
self.surface=surface
self.y=y
self.w=(surface.get_width())/12#人物的宽度为窗口的十二分之一
self.h=surface.get_height()/2
self.currentFrame=-1
self.state=0 #0代表跑步状态,1代表跳跃状态,2代表连续跳跃
self.g=1 #重力加速度
self.vy=0 #y轴速度
self.vy_start=-20 #起跳开始速度
def getRect(self):
return (0,self.y+12,self.w,self.h)
class Object: #障碍物
def init(self,surface,x=0,y=0):
self.surface=surface
self.x=x #障碍物的横坐标
self.y=y #障碍物的纵坐标
self.w=surface.get_width()
self.h=surface.get_height()
self.currentFrame=random.randint(0,6)
self.w = 100
self.h = 100
def getRect(self):
return (self.x,self.y,self.w,self.h)
def collision(self,rect1,rect2):
#碰撞检测
if (rect2[0]>=rect1[2]-20) or (rect1[0]+40>=rect2[2])or (rect1[1]+rect1[3]<rect2[1]+20) or (rect2[1]+rect2[3]<rect1[1]+20):
return False
return True
class Bg: #背景
def init(self,surface):
self.surface=surface
self.dx=-10
self.w=surface.get_width()
self.rect=surface.get_rect()
def initGame(): #游戏初始化
global bg,role,clock,gameState,surObject,surGameOver,score,myFont,myFont1,objectList
#分数初始化
score=0
#初始化
objectList=[]
#加载字体
myFont=pygame.font.Font("./freesansbold.ttf",32)
myFont1=pygame.font.Font("./freesansbold.ttf",48)
# 创建时钟对象 (可以控制游戏循环频率)
clock = pygame.time.Clock()
#初始化游戏状态
gameState=0 #游戏状态0表示游戏中,1表示游戏结束
#游戏背景
surBg=pygame.image.load("image/bg.bmp").convert_alpha() # 載入圖片
bg=Bg(surBg)
#结束画面
surGameOver=pygame.image.load("image/gameover.bmp").convert_alpha()
#人物图片
surRole=pygame.image.load("image/role.png").convert_alpha()
role=Role(surRole,508-85)
#障碍物图片
surObject=pygame.image.load("image/object.png").convert_alpha()
def addObject():
global surObject,object,objectList,object
rate=4 #生成障碍物的频率
#是否生成障碍物
if not random.randint(0,300)<rate:
return
y=random.choice([height,height-100,height-200,height-300,height-400])#随机选择障碍物的高度
object=Object(surObject,width+38,y)
objectList.append(object)
def updateLogic():
global gameState,score
#键盘事件处理
for event in pygame.event.get():#event表示事件,當使用者結束視窗,程式也結束
if event.type == pygame.QUIT:
sys.exit()
elif event.typepygame.KEYDOWN:
#Up键跳跃
if gameState0:#游戏中
if event.keypygame.K_UP or event.keypygame.K_w :
if role.state0:
role.state=1
role.vy=role.vy_start
elif role.state1:
role.state=2
role.vy=role.vy_start
elif role.state2:
role.state=3
role.vy=role.vy_start
elif gameState1:#结束游戏
if event.key==pygame.K_SPACE:
#重新开始游戏
initGame()
if gameState==0:
#背景的移动
bg.dx+=10
if bg.dx==1200:
bg.dx=0
#人物的移动
if role.state==0:
role.currentFrame+=1
if role.currentFrame==12:
role.currentFrame=0
else:
role.y+=role.vy
role.vy+=role.g
if role.y>=508-85:
role.y=508-85
role.state=0
#障碍物的移动
addObject()
for object in objectList:
object.x-=10 #障碍物移动
# 障碍物超出屏幕,移除障碍物
if object.x+object.w<=0:
objectList.remove(object)
score+=10 #避开障碍物,加10分
print("躲开了一个障碍物")
#碰撞检测
if object.collision(role.getRect(),object.getRect()):
if(object.currentFrame==6):
objectList.remove(object)
score+=100 #吃金币加100分
print(score)
print("得到了一个金币")
else:
gameState=1 #游戏失败
print("发生了碰撞!")
def updateView(screen):
#背景的贴图
screen.blit(bg.surface,[-bg.dx,0])
screen.blit(bg.surface,[1200-bg.dx,0])
#分数的贴图
textSur=myFont.render(“score:%d”%score, True, (255, 0, 0))
screen.blit(textSur, (500,20))
del textSur
#人物的贴图
screen.blit(role.surface, [0, role.y], [int(role.currentFrame) * role.w, 0, role.w, role.h])
#障碍物的贴图
for object in objectList:
screen.blit(object.surface, [object.x, object.y], [int(object.currentFrame) * object.w, 0, object.w, object.h])
def judgeState(screen):
global gameState
if gameState0:
updateView(screen)
return
elif gameState1:
screen.blit(surGameOver,[0,0])
textSur = myFont1.render(“GameOver Score:%d”%score, True, (255, 0, 0)) #255表示颜色
screen.blit(textSur, (width/2-350, height/2+150))
def main():
# 音乐的路径
file = r’music.mp3’
# 初始化
pygame.mixer.init()
# 加载音乐文件
track = pygame.mixer.music.load(file)
# 开始播放音乐流
pygame.mixer.music.play()
pygame.init()#模块初始化
screen = pygame.display.set_mode(size)#建立 window 視窗畫布,大小為size
pygame.display.set_caption(‘天天酷跑~WJ’)# 設置視窗標題為天天酷跑
initGame() #游戏初始化
screen.blit(bg.surface,[100,100])
while True:
#设置时钟频率
clock.tick(60)
judgeState(screen)
updateLogic()
pygame.display.flip()
main()
六、参考文章
[1] 小五义.pygame学习笔记(5)——精灵[EB/OL].https://blog.techbridge.cc/2019/10/19/how-to-build-up-game-with-pygame-tutorial/
[2] kdchang.使用 Python 和 PyGame 遊戲製作入門教學[EB/OL].https://blog.techbridge.cc/2019/10/19/how-to-build-up-game-with-pygame-tutorial/