Pygame恐龙跑酷游戏
本文由
创作,已纳入「FreeBuf原创奖励计划」,未授权禁止转载
在谷歌浏览器里,如果没连接互联网,会弹出提示,提示旁的图标是一个小恐龙,点击小恐龙,就会触发一个小游戏,供人游玩
而今天,我们就要来仿制一款这样的小游戏
在代码开干之前,先感谢我的指导老师
不多说了,直接开干
# 首先先导入我们需要的库
import pygame
from pygame.locals import *
from itertools import cycle
import random
#宏
SCREENWIDTH=800
SCREENHEIGHT=260
FPS=30
class Map(): # 地图类
def __init__(self,x,y):
self.bg=pygame.image.load('image/bg.png') # 加载背景图片
self.x=x
self.y=y
def map_rolling(self): # 背景图片的移动
if self.x<-790:
self.x=800
else:
self.x-=5
def map_update(self): # 更新背景图片
SCREEN.blit(self.bg,(self.x,self.y))
class Dinosaur(): # 恐龙类
def __init__(self):
self.rect=pygame.Rect(0,0,0,0) # 申请一个图片矩形空间
self.jumpState=False # 跳跃判断
self.jumpHeight=140 # 跳跃高度
self.lowest_y=140 # 最低高度
self.jumpValue=0 # 每次跳跃高度
self.dinosaurIndex=0 # 恐龙图片的索引(因为有多个图片交替显示)
self.dinosaurIndexGen=cycle([0,1,2]) #遍历索引
self.dinosaur_image=( # 恐龙图片
pygame.image.load('image/dinosaur1.png'),
pygame.image.load('image/dinosaur2.png'),
pygame.image.load('image/dinosaur3.png'),
)
self.jump_audio=pygame.mixer.Sound('audio/jump.wav') #跳跃声音
self.rect.size=self.dinosaur_image[0].get_size() #适应恐龙图片大小
self.x=50
self.y=self.lowest_y
self.rect.topleft=(self.x,self.y)
def jump(self): #跳跃捕获
self.jumpState=True
def move(self): #恐龙移动
if self.jumpState:
if self.rect.y>=self.lowest_y:
self.jumpValue=-5
if self.rect.y<=self.lowest_y-self.jumpHeight:
self.jumpValue=5
self.rect.y+=self.jumpValue
if self.rect.y>=self.lowest_y:
self.jumpState=False
def draw_dinosaur(self): #恐龙显示
dinosaurIndex=next(self.dinosaurIndexGen)
SCREEN.blit(self.dinosaur_image[dinosaurIndex],(self.x,self.rect.y))
class Obstacle(): # 障碍物类
score=0
def __init__(self):
self.rect=pygame.Rect(0,0,0,0) #申请矩形空间
# 有两种障碍物
self.stone=pygame.image.load('image/stone.png')
self.cacti=pygame.image.load('image/cacti.png')
# 分数记录也在障碍物类里面写了
self.numbers=(
pygame.image.load('image/0.png'),
pygame.image.load('image/1.png'),
pygame.image.load('image/2.png'),
pygame.image.load('image/3.png'),
pygame.image.load('image/4.png'),
pygame.image.load('image/5.png'),
pygame.image.load('image/6.png'),
pygame.image.load('image/7.png'),
pygame.image.load('image/8.png'),
pygame.image.load('image/9.png'),
)
self.score_audio=pygame.mixer.Sound('audio/score.wav') # 得分声音
# 障碍物有两种形态,要随机显示
r=random.randint(0,1)
if r==0:
self.image=self.stone
else:
self.image=self.cacti
self.rect.size=self.image.get_size() # 适应障碍物图片的大小
self.width,self.height=self.rect.size # 获取图片长宽
self.x=800
self.y=200-(self.height/2)
self.rect.center=(self.x,self.y)
def obstacle_move(self): #障碍物的移动
self.rect.x-=5
def draw_obstacle(self): #障碍物的显示
SCREEN.blit(self.image,(self.rect.x,self.rect.y))
def getScore(self): # 得分
self.score
tmp=self.score
if tmp==1:
self.score_audio.play()
self.score=0
return tmp
def showScore(self): # 分数显示
self.scoreDigits=[int(x) for x in list(str(self.score))]
totalWidth=0
for digit in self.scoreDigits:
totalWidth+=self.numbers[digit].get_width()
Xoffset=(SCREENWIDTH-totalWidth)/2
for digit in self.scoreDigits:
SCREEN.blit(self.numbers[digit],(Xoffset,SCREENHEIGHT*0.1))
Xoffset+=self.numbers[digit].get_width()
def game_over(): # 游戏结束的工作
bump_audio=pygame.mixer.Sound('audio/bump.wav') # 加载结束音效
bump_audio.play() # 播放结束音效
screen_w=pygame.display.Info().current_w
screen_h=pygame.display.Info().current_h
over_img=pygame.image.load('image/gameover.png')# 加载结束图片
SCREEN.blit(over_img,((screen_w-over_img.get_width())/2,(screen_h-over_img.get_height())/2)) # 显示结束图片
def mainGame(): # 游戏主程序
# 设置和导入需要用到的变量
score=0
over=False
global SCREEN,FPSCLOCK
# 初始化游戏
pygame.init()
# 设置屏幕更新时间以及设置窗口大小和窗口标题
FPSCLOCK=pygame.time.Clock()
SCREEN=pygame.display.set_mode((SCREENWIDTH,SCREENHEIGHT))
pygame.display.set_caption('小恐龙')
# 设置两个背景图片的位置,用于循环展示图片
bg1=Map(0,0)
bg2=Map(800,0)
# 恐龙类示例化
dinosaur=Dinosaur()
addObstacleTime=0
list=[]
while True:
for event in pygame.event.get(): # 捕捉鼠标信息
if event.type==QUIT: # 侦测到要退出
exit()
if event.type==KEYDOWN and event.key==K_SPACE: # 按住空格键跳跃
if dinosaur.rect.y>=dinosaur.lowest_y:
dinosaur.jump()
dinosaur.jump_audio.play()
if over==False:
# 地图切换
bg1.map_update()
bg1.map_rolling()
bg2.map_update()
bg2.map_rolling()
# 恐龙行走
dinosaur.move()
dinosaur.draw_dinosaur()
if addObstacleTime>=1300: # 设置添加障碍物需要等待的时间
r=random.randint(0,100)
if r>40: # 类似几率,数字越小生成障碍物的几率越大
obstacle=Obstacle()
list.append(obstacle) # 往列表里添加障碍物
addObstacleTime=0
for i in range(len(list)): # 遍历列表,生成障碍物
list[i].obstacle_move()
list[i].draw_obstacle()
if pygame.sprite.collide_rect(dinosaur,list[i]): # 判断恐龙是否碰到障碍物
over=True # 如果是,执行函数game_over()
game_over()
else:
if(list[i].rect.x+list[i].rect.width)<dinosaur.rect.x: # 再次判断,如果真正跳过了障碍物,得分
score+=list[i].getScore()
list[i].showScore() # 显示分数
addObstacleTime+=20 # 增加毫秒数
pygame.display.update() # 窗口更新
FPSCLOCK.tick(FPS) # 更新时间
# if over==True:
# mainGame()
# 上面注释语句可写可不写,主要是在游戏结束后能自动重新开始
# 调用 mainGame()函数
if __name__=='__main__':
mainGame()
(注:此文章是从CSDN搬运而来,CSDN账号:爱电摇的小码农,以后的文章都是从CSDN我的账号上搬运而来)
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐