python开发打地鼠8 #
- 游戏主函数类的创建1
- 游戏主函数类的创建2
收获 #
掌握python类的使用方法,通过PyGame实践学会独立建立和更新项目,完成打地鼠游戏开发。
游戏主函数类的创建1 #
本小节为游戏主函数类的构造函数和游戏运行函数的定义。
class WhacAMoleGame(PygameBaseGame):
def __init__(self, **kwargs):
self.cfg = Config
super(WhacAMoleGame, self).__init__(config=self.cfg, **kwargs)
'''运行游戏'''
def run(self):
# 初始化
screen, resource_loader, cfg = self.screen, self.resource_loader, self.cfg
while True:
is_restart = self.GamingInterface(screen, resource_loader, cfg)
if not is_restart:
break
游戏主函数类的创建2 #
本小节为主函数类中游戏进行界面的函数定义,包括资源的加载、游戏主循环规则等。
##############################在WhacAMoleGame类下,run()函数后面,添加下列新的功能函数###################
'''游戏进行界面'''
def GamingInterface(self, screen, resource_loader, cfg):
# 播放背景音乐
resource_loader.playbgm()
audios = resource_loader.sounds
# 加载字体
font = pygame.font.Font(cfg.FONT_PATH, 40)
# 加载背景图片
bg_img = resource_loader.images['background']
# 开始界面
startInterface(screen, resource_loader.images['begin'])
# 地鼠改变位置的计时
hole_pos = random.choice(cfg.HOLE_POSITIONS)
change_hole_event = pygame.USEREVENT
pygame.time.set_timer(change_hole_event, 800)
# 地鼠
mole = Mole(resource_loader.images['mole'], hole_pos)
# 锤子
hammer = Hammer(resource_loader.images['hammer'], (500, 250))
# 时钟
clock = pygame.time.Clock()
# 分数
your_score = 0
flag = False
# 初始时间
init_time = pygame.time.get_ticks()
# 游戏主循环
while True:
# --游戏时间为60s
time_remain = round((61000 - (pygame.time.get_ticks() - init_time)) / 1000.)
# --游戏时间减少, 地鼠变位置速度变快
if time_remain == 40 and not flag:
hole_pos = random.choice(cfg.HOLE_POSITIONS)
mole.reset()
mole.setPosition(hole_pos)
pygame.time.set_timer(change_hole_event, 650)
flag = True
elif time_remain == 20 and flag:
hole_pos = random.choice(cfg.HOLE_POSITIONS)
mole.reset()
mole.setPosition(hole_pos)
pygame.time.set_timer(change_hole_event, 500)
flag = False
# --倒计时音效
if time_remain == 10:
audios['count_down'].play()
# --游戏结束
if time_remain < 0: break
count_down_text = font.render('Time: '+str(time_remain), True, cfg.WHITE)
# --按键检测
for event in pygame.event.get():
if event.type == pygame.QUIT:
QuitGame()
elif event.type == pygame.MOUSEMOTION:
hammer.setPosition(pygame.mouse.get_pos())
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
hammer.setHammering()
elif event.type == change_hole_event:
hole_pos = random.choice(cfg.HOLE_POSITIONS)
mole.reset()
mole.setPosition(hole_pos)
# --碰撞检测
if hammer.is_hammering and not mole.is_hammer:
is_hammer = pygame.sprite.collide_mask(hammer, mole)
if is_hammer:
audios['hammering'].play()
mole.setBeHammered()
your_score += 10
# --分数
your_score_text = font.render('Score: '+str(your_score), True, cfg.BROWN)
# --绑定必要的游戏元素到屏幕(注意顺序)
screen.blit(bg_img, (0, 0))
screen.blit(count_down_text, (875, 8))
screen.blit(your_score_text, (800, 430))
mole.draw(screen)
hammer.draw(screen)
# --更新
pygame.display.flip()
clock.tick(60)
# 读取最佳分数(try块避免第一次游戏无.rec文件)
try:
best_score = int(open(cfg.RECORD_PATH).read())
except:
best_score = 0
# 若当前分数大于最佳分数则更新最佳分数
if your_score > best_score:
f = open(cfg.RECORD_PATH, 'w')
f.write(str(your_score))
f.close()
# 结束界面
score_info = {'your_score': your_score, 'best_score': best_score}
is_restart = endInterface(screen, resource_loader.images['end'], resource_loader.images['again'], score_info, cfg.FONT_PATH, [cfg.WHITE, cfg.RED], cfg.SCREENSIZE)
return is_restart
运行主函数程序:
if __name__ == '__main__':
Game = WhacAMoleGame()
Game .run()
小结 #
本节介绍了游戏主函数类的创建过程和功能函数的实现
需要掌握并实现如何使用pygame在项目中创建游戏主函数类并完成该游戏