• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

来打地鼠不咯

武飞扬头像
九叔敲代码
帮助1

开发工具

python版本:3.6.4

相关模块:

pygame;以及一些python自带的模块。

环境搭建

安装python并添加到环境变量,pip安装需要的相关模块即可。

原理简介

打地鼠的游戏规则相信大家都知道,这里就不多介绍了,反正就是不停地拿锤子打洞里钻出来的地鼠呗~首先,让我们确定一下游戏中有哪些元素。打地鼠打地鼠,地鼠当然得有啦,那我们就写个地鼠的游戏精灵类呗 显然,地鼠有被锤子击中和未被锤子击中这两种状态,所以需要加载两张图,当地鼠被击中时从未被击中的地鼠状态图切换到被击中后的地鼠状态图(我找的图可能不太像地鼠,请各位老哥见谅)。然后我们再来定义一下锤子这个游戏精灵类,和地鼠类似,锤子也有未锤下去和已锤下去两种状态,只不过锤下去之后需要迅速恢复回未锤下去的状态,具体而言,代码实现如下:

游戏初始化

  1.  
    def initGame():
  2.  
    pygame.init()
  3.  
    pygame.mixer.init()
  4.  
    screen = pygame.display.set_mode(cfg.SCREENSIZE)
  5.  
    pygame.display.set_caption('PythonQQ交流群:932574150')
  6.  
    return screen

 ok,将准备工作都做好啦,我们就可以开始写主程序啦。首先当然是我们的游戏初始化呀:

初始化

screen = initGame()

然后我们就要加载一下我们必要的游戏素材和必要的游戏变量 

  1.  
    # 加载背景音乐和其他音效
  2.  
    pygame.mixer.music.load(cfg.BGM_PATH)
  3.  
    pygame.mixer.music.play(-1)
  4.  
    audios = {
  5.  
    'count_down': pygame.mixer.Sound(cfg.COUNT_DOWN_SOUND_PATH),
  6.  
    'hammering': pygame.mixer.Sound(cfg.HAMMERING_SOUND_PATH)
  7.  
    }
  8.  
    # 加载字体
  9.  
    font = pygame.font.Font(cfg.FONT_PATH, 40)
  10.  
    # 加载背景图片
  11.  
    bg_img = pygame.image.load(cfg.GAME_BG_IMAGEPATH)
  12.  
    # 开始界面
  13.  
    startInterface(screen, cfg.GAME_BEGIN_IMAGEPATHS)
  14.  
    # 地鼠改变位置的计时
  15.  
    hole_pos = random.choice(cfg.HOLE_POSITIONS)
  16.  
    change_hole_event = pygame.USEREVENT
  17.  
    pygame.time.set_timer(change_hole_event, 800)
  18.  
    # 地鼠
  19.  
    mole = Mole(cfg.MOLE_IMAGEPATHS, hole_pos)
  20.  
    # 锤子
  21.  
    hammer = Hammer(cfg.HAMMER_IMAGEPATHS, (500, 250))
  22.  
    # 时钟
  23.  
    clock = pygame.time.Clock()
  24.  
    # 分数
  25.  
    your_score = 0
  26.  
    flag = False
学新通

 我注释了大家可以看看

下面就到我们的游戏主循环啦

  1.  
    # 游戏主循环
  2.  
    while True:
  3.  
    # --游戏时间为60s
  4.  
    time_remain = round((61000 - pygame.time.get_ticks()) / 1000.)
  5.  
    # --游戏时间减少, 地鼠变位置速度变快
  6.  
    if time_remain == 40 and not flag:
  7.  
    hole_pos = random.choice(cfg.HOLE_POSITIONS)
  8.  
    mole.reset()
  9.  
    mole.setPosition(hole_pos)
  10.  
    pygame.time.set_timer(change_hole_event, 650)
  11.  
    flag = True
  12.  
    elif time_remain == 20 and flag:
  13.  
    hole_pos = random.choice(cfg.HOLE_POSITIONS)
  14.  
    mole.reset()
  15.  
    mole.setPosition(hole_pos)
  16.  
    pygame.time.set_timer(change_hole_event, 500)
  17.  
    flag = False
  18.  
    # --倒计时音效
  19.  
    if time_remain == 10:
  20.  
    audios['count_down'].play()
  21.  
    # --游戏结束
  22.  
    if time_remain < 0: break
  23.  
    count_down_text = font.render('Time: ' str(time_remain), True, cfg.WHITE)
  24.  
    # --按键检测
  25.  
    for event in pygame.event.get():
  26.  
    if event.type == pygame.QUIT:
  27.  
    pygame.quit()
  28.  
    sys.exit()
  29.  
    elif event.type == pygame.MOUSEMOTION:
  30.  
    hammer.setPosition(pygame.mouse.get_pos())
  31.  
    elif event.type == pygame.MOUSEBUTTONDOWN:
  32.  
    if event.button == 1:
  33.  
    hammer.setHammering()
  34.  
    elif event.type == change_hole_event:
  35.  
    hole_pos = random.choice(cfg.HOLE_POSITIONS)
  36.  
    mole.reset()
  37.  
    mole.setPosition(hole_pos)
  38.  
    # --碰撞检测
  39.  
    if hammer.is_hammering and not mole.is_hammer:
  40.  
    is_hammer = pygame.sprite.collide_mask(hammer, mole)
  41.  
    if is_hammer:
  42.  
    audios['hammering'].play()
  43.  
    mole.setBeHammered()
  44.  
    your_score = 10
  45.  
    # --分数
  46.  
    your_score_text = font.render('Score: ' str(your_score), True, cfg.BROWN)
  47.  
    # --绑定必要的游戏元素到屏幕(注意顺序)
  48.  
    screen.blit(bg_img, (0, 0))
  49.  
    screen.blit(count_down_text, (875, 8))
  50.  
    screen.blit(your_score_text, (800, 430))
  51.  
    mole.draw(screen)
  52.  
    hammer.draw(screen)
  53.  
    # --更新
  54.  
    pygame.display.flip()
  55.  
    clock.tick(60)
学新通

 逻辑很简单的,我就不多废话了,大家看看我写的注释60秒之后,游戏结束,我们就可以将分数统计起来然后和历史最高分做一下 对比:

  1.  
    # 读取最佳分数(try块避免第一次游戏无.rec文件)
  2.  
    try:
  3.  
    best_score = int(open(cfg.RECORD_PATH).read())
  4.  
    except:
  5.  
    best_score = 0
  6.  
    # 若当前分数大于最佳分数则更新最佳分数
  7.  
    if your_score > best_score:
  8.  
    f = open(cfg.RECORD_PATH, 'w')
  9.  
    f.write(str(your_score))
  10.  
    f.close()

然后我们来让我们的游戏看着正式一点,整点仪式感,就添加一个开始界面和结束界面呗:

  1.  
    # 结束界面
  2.  
    score_info = {'your_score': your_score, 'best_score': best_score}
  3.  
    is_restart = endInterface(screen, cfg.GAME_END_IMAGEPATH, cfg.GAME_AGAIN_IMAGEPATHS, score_info, cfg.FONT_PATH, [cfg.WHITE, cfg.RED], cfg.SCREENSIZE)
  4.  
    return is_restart

最后添加运行代码

  1.  
    if __name__ == '__main__':
  2.  
    while True:
  3.  
    is_restart = main()
  4.  
    if not is_restart:
  5.  
    break

 如果喜欢就点个关注把 ,有啥问题可以进我的交流群哈932574150


 

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggegae
系列文章
更多 icon
同类精品
更多 icon
继续加载