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