|
|
@ -3,15 +3,15 @@ import sys
|
|
|
|
|
|
|
|
|
|
|
|
import pygame.time
|
|
|
|
import pygame.time
|
|
|
|
|
|
|
|
|
|
|
|
from settings import *
|
|
|
|
|
|
|
|
from dinosaur import Dinosaur
|
|
|
|
|
|
|
|
from cloud import Cloud
|
|
|
|
|
|
|
|
from bullet import Bullet
|
|
|
|
from bullet import Bullet
|
|
|
|
|
|
|
|
from cloud import Cloud
|
|
|
|
|
|
|
|
from dinosaur import Dinosaur
|
|
|
|
|
|
|
|
from settings import *
|
|
|
|
|
|
|
|
|
|
|
|
pygame.init() # 初始化pygame
|
|
|
|
pygame.init() # 初始化pygame
|
|
|
|
pygame.display.set_caption('谷歌小游戏(小恐龙快跑)') # 设置标题
|
|
|
|
pygame.display.set_caption('谷歌小游戏(小恐龙快跑)') # 设置标题
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Barrier: # 定义一个障碍物基类, 后面的各个障碍物都是Barrier的子类
|
|
|
|
class Barrier: # 定义一个障碍物基类, 后面的各个障碍物都是Barrier的子类
|
|
|
|
def __init__(self, image, type):
|
|
|
|
def __init__(self, image, type):
|
|
|
|
self.image = image
|
|
|
|
self.image = image
|
|
|
@ -20,6 +20,7 @@ class Barrier: # 定义一个障碍物基类, 后面的各个障碍物都是Ba
|
|
|
|
self.rect.x = SCREEN_WIDTH # 先把障碍物放到地图的右下角,然后出来
|
|
|
|
self.rect.x = SCREEN_WIDTH # 先把障碍物放到地图的右下角,然后出来
|
|
|
|
self.game_speed = game_speed
|
|
|
|
self.game_speed = game_speed
|
|
|
|
self.hp = 100 # 血量
|
|
|
|
self.hp = 100 # 血量
|
|
|
|
|
|
|
|
|
|
|
|
def update(self):
|
|
|
|
def update(self):
|
|
|
|
self.rect.x -= self.game_speed # x坐标向左移动,即障碍物向左移动
|
|
|
|
self.rect.x -= self.game_speed # x坐标向左移动,即障碍物向左移动
|
|
|
|
if self.rect.x < -self.rect.width or self.hp <= 0: # 还需要判断障碍物是否移出了边界,如果越界的话我们要把该障碍物释放掉
|
|
|
|
if self.rect.x < -self.rect.width or self.hp <= 0: # 还需要判断障碍物是否移出了边界,如果越界的话我们要把该障碍物释放掉
|
|
|
@ -30,7 +31,7 @@ class Barrier: # 定义一个障碍物基类, 后面的各个障碍物都是Ba
|
|
|
|
|
|
|
|
|
|
|
|
# 头顶显示血量
|
|
|
|
# 头顶显示血量
|
|
|
|
def showHp(self):
|
|
|
|
def showHp(self):
|
|
|
|
font = pygame.font.SysFont(['方正粗黑宋简体','microsoftsansserif'], 30)
|
|
|
|
font = pygame.font.SysFont(['方正粗黑宋简体', 'microsoftsansserif'], 30)
|
|
|
|
text = font.render("Hp: " + str(self.hp), True, (0, 0, 0))
|
|
|
|
text = font.render("Hp: " + str(self.hp), True, (0, 0, 0))
|
|
|
|
SCREEN.blit(text, (self.rect.x, self.rect.y - 20))
|
|
|
|
SCREEN.blit(text, (self.rect.x, self.rect.y - 20))
|
|
|
|
|
|
|
|
|
|
|
@ -38,19 +39,23 @@ class Barrier: # 定义一个障碍物基类, 后面的各个障碍物都是Ba
|
|
|
|
font = pygame.font.SysFont(['方正粗黑宋简体', 'microsoftsansserif'], 30)
|
|
|
|
font = pygame.font.SysFont(['方正粗黑宋简体', 'microsoftsansserif'], 30)
|
|
|
|
text = font.render("┗|`O'|┛", True, (0, 0, 0))
|
|
|
|
text = font.render("┗|`O'|┛", True, (0, 0, 0))
|
|
|
|
SCREEN.blit(text, (self.rect.x, self.rect.y - 70))
|
|
|
|
SCREEN.blit(text, (self.rect.x, self.rect.y - 70))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# barriers的子类
|
|
|
|
# barriers的子类
|
|
|
|
class SmallCactus(Barrier):
|
|
|
|
class SmallCactus(Barrier):
|
|
|
|
def __init__(self, image):
|
|
|
|
def __init__(self, image):
|
|
|
|
self.type = random.randint(0, 2) #随机生成0-2下标,即随机生成3种小仙人掌中的一个
|
|
|
|
self.type = random.randint(0, 2) # 随机生成0-2下标,即随机生成3种小仙人掌中的一个
|
|
|
|
super().__init__(image, self.type) # super调用父类对象的方法
|
|
|
|
super().__init__(image, self.type) # super调用父类对象的方法
|
|
|
|
self.rect.y = 325
|
|
|
|
self.rect.y = 325
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class LargeCactus(Barrier):
|
|
|
|
class LargeCactus(Barrier):
|
|
|
|
def __init__(self, image):
|
|
|
|
def __init__(self, image):
|
|
|
|
self.type = random.randint(0, 2)
|
|
|
|
self.type = random.randint(0, 2)
|
|
|
|
super().__init__(image, self.type)
|
|
|
|
super().__init__(image, self.type)
|
|
|
|
self.rect.y = 300
|
|
|
|
self.rect.y = 300
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Bird(Barrier):
|
|
|
|
class Bird(Barrier):
|
|
|
|
def __init__(self, image):
|
|
|
|
def __init__(self, image):
|
|
|
|
self.type = 0
|
|
|
|
self.type = 0
|
|
|
@ -65,6 +70,7 @@ class Bird(Barrier):
|
|
|
|
self.index = 0
|
|
|
|
self.index = 0
|
|
|
|
SCREEN.blit(self.image[self.index // 5], self.rect)
|
|
|
|
SCREEN.blit(self.image[self.index // 5], self.rect)
|
|
|
|
self.index += 1
|
|
|
|
self.index += 1
|
|
|
|
|
|
|
|
|
|
|
|
def update(self): # 多态实现鸟的上下移动
|
|
|
|
def update(self): # 多态实现鸟的上下移动
|
|
|
|
self.rect.x -= self.game_speed
|
|
|
|
self.rect.x -= self.game_speed
|
|
|
|
if self.rect.x < -self.rect.width or self.hp <= 0: # 还需要判断障碍物是否移出了边界,如果越界的话我们要把该障碍物释放掉
|
|
|
|
if self.rect.x < -self.rect.width or self.hp <= 0: # 还需要判断障碍物是否移出了边界,如果越界的话我们要把该障碍物释放掉
|
|
|
@ -76,14 +82,14 @@ class Bird(Barrier):
|
|
|
|
self.vy = -self.vy
|
|
|
|
self.vy = -self.vy
|
|
|
|
elif self.rect.y >= SCREEN_HEIGHT - 250:
|
|
|
|
elif self.rect.y >= SCREEN_HEIGHT - 250:
|
|
|
|
self.vy = 10
|
|
|
|
self.vy = 10
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def menu(death_cnt):
|
|
|
|
def menu(death_cnt):
|
|
|
|
global points, max_score# 引入points, max_score全局变量
|
|
|
|
global points, max_score # 引入points, max_score全局变量
|
|
|
|
run = True
|
|
|
|
run = True
|
|
|
|
while run:
|
|
|
|
while run:
|
|
|
|
SCREEN.fill((255, 255, 255)) # 背景色设置为白色
|
|
|
|
SCREEN.fill((255, 255, 255)) # 背景色设置为白色
|
|
|
|
font = pygame.font.SysFont('microsoftyahei', 50)# 微软雅黑
|
|
|
|
font = pygame.font.SysFont('microsoftyahei', 50) # 微软雅黑
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if death_cnt == 0:
|
|
|
|
if death_cnt == 0:
|
|
|
|
text = font.render("按任意键开始", True, (0, 0, 0))
|
|
|
|
text = font.render("按任意键开始", True, (0, 0, 0))
|
|
|
@ -104,10 +110,11 @@ def menu(death_cnt):
|
|
|
|
textRect = text.get_rect()
|
|
|
|
textRect = text.get_rect()
|
|
|
|
textRect.center = (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2)
|
|
|
|
textRect.center = (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2)
|
|
|
|
SCREEN.blit(text, textRect)
|
|
|
|
SCREEN.blit(text, textRect)
|
|
|
|
SCREEN.blit(RUNNING[0], (SCREEN_WIDTH // 2 - 50, SCREEN_HEIGHT // 2 - 140)) #把恐龙的图片显示在菜单界面
|
|
|
|
SCREEN.blit(RUNNING[0], (SCREEN_WIDTH // 2 - 50, SCREEN_HEIGHT // 2 - 140)) # 把恐龙的图片显示在菜单界面
|
|
|
|
# 添加作者信息
|
|
|
|
# 添加作者信息
|
|
|
|
author_font = pygame.font.SysFont('microsoftyahei', 30)# 创建一个字体对象,使用 'microsoftyahei' 字体,字号大小为 30
|
|
|
|
author_font = pygame.font.SysFont('microsoftyahei', 30) # 创建一个字体对象,使用 'microsoftyahei' 字体,字号大小为 30
|
|
|
|
author_text = author_font.render("作者: 袁恒", True, (0, 0, 0)) # render 方法的参数依次是:文本内容,是否开启抗锯齿(True 开启),文本颜色(黑色)
|
|
|
|
author_text = author_font.render("作者: 袁恒", True,
|
|
|
|
|
|
|
|
(0, 0, 0)) # render 方法的参数依次是:文本内容,是否开启抗锯齿(True 开启),文本颜色(黑色)
|
|
|
|
author_text_rect = author_text.get_rect()
|
|
|
|
author_text_rect = author_text.get_rect()
|
|
|
|
author_text_rect.center = (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 + 150) # 设置文本矩形的中心位置
|
|
|
|
author_text_rect.center = (SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2 + 150) # 设置文本矩形的中心位置
|
|
|
|
SCREEN.blit(author_text, author_text_rect) # 使用 blit 方法将渲染后的文本表面绘制到屏幕上
|
|
|
|
SCREEN.blit(author_text, author_text_rect) # 使用 blit 方法将渲染后的文本表面绘制到屏幕上
|
|
|
@ -137,7 +144,7 @@ def main():
|
|
|
|
x_ori_bg = 0
|
|
|
|
x_ori_bg = 0
|
|
|
|
y_ori_bg = 380
|
|
|
|
y_ori_bg = 380
|
|
|
|
points = 0
|
|
|
|
points = 0
|
|
|
|
font = pygame.font.SysFont(['方正粗黑宋简体','microsoftsansserif'], 20) # 分数的字体
|
|
|
|
font = pygame.font.SysFont(['方正粗黑宋简体', 'microsoftsansserif'], 20) # 分数的字体
|
|
|
|
|
|
|
|
|
|
|
|
# 设置障碍物列表
|
|
|
|
# 设置障碍物列表
|
|
|
|
barriers = []
|
|
|
|
barriers = []
|
|
|
@ -172,7 +179,6 @@ def main():
|
|
|
|
last_timestamp_barr_hit = 0 # 记录障碍物受到伤害时钟记录的上一个时刻
|
|
|
|
last_timestamp_barr_hit = 0 # 记录障碍物受到伤害时钟记录的上一个时刻
|
|
|
|
flag_barr_hit = 0 # 记录障碍物有没有受得伤害
|
|
|
|
flag_barr_hit = 0 # 记录障碍物有没有受得伤害
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while run:
|
|
|
|
while run:
|
|
|
|
for event in pygame.event.get():
|
|
|
|
for event in pygame.event.get():
|
|
|
|
if event.type == pygame.QUIT:
|
|
|
|
if event.type == pygame.QUIT:
|
|
|
@ -189,9 +195,6 @@ def main():
|
|
|
|
if pygame.time.get_ticks() - last_timestamp_hit > 3000:
|
|
|
|
if pygame.time.get_ticks() - last_timestamp_hit > 3000:
|
|
|
|
flag_hit = 0
|
|
|
|
flag_hit = 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
background() # 画出背景
|
|
|
|
background() # 画出背景
|
|
|
|
|
|
|
|
|
|
|
|
cloud.draw(SCREEN) # 画出云的图像
|
|
|
|
cloud.draw(SCREEN) # 画出云的图像
|
|
|
@ -263,14 +266,15 @@ def main():
|
|
|
|
points += 50
|
|
|
|
points += 50
|
|
|
|
barriers.remove(barrier)
|
|
|
|
barriers.remove(barrier)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 发射子弹, 并且保证每个子弹的发射间隔小于200毫秒
|
|
|
|
# 发射子弹, 并且保证每个子弹的发射间隔小于200毫秒
|
|
|
|
if (userInput[pygame.K_SPACE] and pygame.time.get_ticks() - last_timestamp >= 200) or (userInput[pygame.K_SPACE] and last_timestamp == 0):
|
|
|
|
if (userInput[pygame.K_SPACE] and pygame.time.get_ticks() - last_timestamp >= 200) or (
|
|
|
|
|
|
|
|
userInput[pygame.K_SPACE] and last_timestamp == 0):
|
|
|
|
last_timestamp = pygame.time.get_ticks() # 更新当前时间
|
|
|
|
last_timestamp = pygame.time.get_ticks() # 更新当前时间
|
|
|
|
bullets.append(Bullet(game_speed, player))
|
|
|
|
bullets.append(Bullet(game_speed, player))
|
|
|
|
|
|
|
|
|
|
|
|
pygame.display.update()
|
|
|
|
pygame.display.update()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
if __name__ == '__main__':
|
|
|
|
menu(death_cnt = 0)
|
|
|
|
menu(death_cnt=0)
|
|
|
|
main()
|
|
|
|
main()
|
|
|
|