1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 谷歌小恐龙游戏实现

谷歌小恐龙游戏实现

时间:2024-03-10 16:06:07

相关推荐

谷歌小恐龙游戏实现

谷歌小恐龙游戏的实现

import pygame

from pygame.locals import*

from itertools import cycle #导入迭代工具

import random

SCREENWIDTH = 822 #窗体宽度

SCREENHEIGHT = 260 #窗体高度

FPS = 30 #更新画面时间

#定义一个滚动循环地图类

class MyMap():

def __init__(self,x,y):# 加载图片背景self.bg = pygame.image.load("image/bg.png").convert_alpha()self.x = xself.y = ydef map_rolling(self):if self.x < -790: #小于-790证明地图移动完毕self.x = 800 #给地图一个新的坐标点else:self.x-=5 #5个像素向左移动# 创建一个map_update()方法,在该方法中实现地图无限滚动的效果def map_update(self):SCREEN.blit(self.bg,(self.x,self.y))

恐龙类

class Dinosaur():

definit(self):

#初始化小恐龙矩形

self.rect = pygame.Rect(0,0,0,0)

self.jumpState = False #跳跃的状态

self.jumpHeight = 130 #跳跃的高度

self.lowest_y = 140 #最低坐标

self.jumpValue = 0 #跳跃增变量

# 小恐龙动图索引

self.dinosaurIndex = 0

self.dinosaurIndexGen = cycle([0,1,2])

# 小恐龙图片

self.dinosaur_img = (

pygame.image.load(“E:/dinosaur1.png”).convert_alpha(),

pygame.image.load(“image/dinosaur2.png”).convert_alpha(),

pygame.image.load(“image/dinosaur3.png”).convert_alpha(),

)

self.jump_audio = pygame.mixer.Sound(‘audio/jump.wav’)

self.rect.size = self.dinosaur_img[0].get_size()

self.x = 50 #绘制恐龙的x坐标

self.y = self.lowest_y # 绘制恐龙的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 #以5个像素值向上移动

if self.rect.y <= self.lowest_y - self.jumpHeight: #恐龙达到顶部回落

self.jumpValue = 5 #以5个像素值向下回落

self.rect.y += self.jumpValue #通过循环改变恐龙的y坐标

if self.rect.y >= self.lowest_y: #如果恐龙回到地面

self.jumpState = False #关闭跳跃状态

# 绘制恐龙

def draw_dinosaur(self):

# 匹配恐龙动图

dinosaurIndex = next(self.dinosaurIndexGen)

# 绘制小恐龙

SCREEN.blit(self.dinosaur_img[dinosaurIndex],

(self.x, self.rect.y))

障碍物类

class Obstacle():

score=1 #分数

definit(self):

# 初始化障碍物矩形

self.rect = pygame.Rect(0,0,0,0)

# 加载障碍物图片

self.stone = pygame.image.load(“image/stone.png”).convert_alpha()

self.cacti = pygame.image.load(“image/cacti.png”).convert_alpha()

# 加载分数图片

self.numbers = (pygame.image.load(“image/0.png”).convert_alpha(),

pygame.image.load(“image/1.png”).convert_alpha(),

pygame.image.load(“image/2.png”).convert_alpha(),

pygame.image.load(“image/3.png”).convert_alpha(),

pygame.image.load(“image/4.png”).convert_alpha(),

pygame.image.load(“image/5.png”).convert_alpha(),

pygame.image.load(“image/6.png”).convert_alpha(),

pygame.image.load(“image/7.png”).convert_alpha(),

pygame.image.load(“image/8.png”).convert_alpha(),

pygame.image.load(“image/9.png”).convert_alpha(),

)

# 加载加分音效

self.score_audio = pygame.mixer.Sound(‘audio/score.wav’)

# 0和1随机数

r = random.randint(0,1)

if r == 0: #如果随机是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 obstaccl_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, score):

“”“在窗体顶部中间的位置显示分数”""

self.scoreDigits = [int(x) for x in list(str(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_ing = pygame.image.load(‘image/gameover.png’)

#将游戏结束的图片绘制在窗体的中间位置

SCREEN.blit(over_ing,((screen_w - over_ing.get_width()) / 2,(screen_h - over_ing.get_height())/2))

def mainGame():

score = 0 #得分

over = False

global SCREEN,FPSCLOCK

pygame.init() #经过初始化以后我们就可以尽情使用pygamele

FPSCLOCK = pygame.time.Clock()

#使用pygame时钟前,必须创建Clock对象的一个实例

#控制每个循环多长时间运行一次

SCREEN = pygame.display.set_mode((SCREENWIDTH,SCREENHEIGHT))

pygame.display.set_caption(‘小恐龙’) #设置窗体标题

# 创建地图对象bg1 = MyMap(0,0)bg2 = MyMap(800,0)# 创建恐龙对象dinosaur = Dinosaur()addObstacleTimer = 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 == True: # 判断游戏结束的开关是否开启mainGame() # 如果开启将调用mainGame方法重新启动游戏if over == False:#绘制地图起到更新地图的作用bg1.map_update()# 地图移动bg1.map_rolling()bg2.map_update()bg2.map_rolling()#恐龙移动dinosaur.move()# 绘制恐龙dinosaur.draw_dinosaur()# 计算障碍物间隔时间if addObstacleTimer >= 1300:r = random.randint(0, 100)if r > 40:# 创建障碍物对象obstacle = Obstacle()# 将障碍物对象添加到列表list.append(obstacle)# 重置障碍物事件addObstacleTimer = 0#循环遍历障碍物for i in range(len(list)):# 障碍物移动list[i].obstaccl_move()# 绘制障碍物list[i].draw_obstacle()#判断恐龙与障碍物是否碰撞if pygame.sprite.collide_rect(dinosaur, list[i]):over = True #碰撞后开启结束开关game_over() #调用游戏结束的方法else:# 判断恐龙是否跳过障碍物if (list[i].rect.x + list[i].rect.width) < dinosaur.rect.x:#加分score += list[i].getScore()#显示分数list[i].showScore(score)addObstacleTimer += 20#增加障碍物时间pygame.display.update()#更新整个窗体FPSCLOCK.tick(FPS)#循环应该多长时间运行一次

ifname==‘main’:

mainGame()

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。