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在项目中创建游戏主函数类并完成该游戏