• Python实战项目:打地鼠(源码分享)(文章较短,直接上代码)


     ✌ 作者简介:信年✘ ✌,大家可以叫我 ❤信年❤ ,一位精通五门语言的博主 ✌
    🏆 CSDN博客专家认证、华为云享专家、阿里云专家博主 、掘金创作榜No.1
    📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
    💬 人生格言:没有我不会的语言,没有你过不去的坎儿。💬
    🔥 如果感觉博主的文章还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦

    📌作者主页传送门:点此传送

    🔎系列文章&专栏推荐:暂未开放

    🌐为大家推荐一款刷题网站呀👉点击跳转
    所有编程语言,都可以从此网站中找到并参考学习哟~

    目录

    效果展示:

    准备工作

    库的安装方法

    科普小知识

    完整代码

    最后


    效果展示:

     

    准备工作

    首先,确保你有安装cfg的库和pygame的库,没有安装的看下安装方法

    库的安装方法

    首先,win+r,在运行框里输入cmd或者CMD,进入终端,输入以下两行代码

    1. pip install pygame
    2. pip install cfg

    注:cfg容易安装错误,具体看报错,如有报错评论区留言,我会一一答复

    科普小知识

    1.凡是安装Python的第三方库,只需要输入pip install 库的名字(当然有一些特例)

    2.凡是程序运行不起来,整体代码大部分报错,一般是没安装库,一个Python文件里面引用的库一般在开头:import 库的名字,检查这里有没有报错或者黄色下划线就好了,如果有,就用方法一安装库,如果没有,可能是自身代码的问题了

    完整代码

    1. import cfg
    2. import sys
    3. import pygame
    4. import random
    5. from modules import *
    6. '''游戏初始化'''
    7. def initGame():
    8. pygame.init()
    9. pygame.mixer.init()
    10. screen = pygame.display.set_mode(cfg.SCREENSIZE)
    11. pygame.display.set_caption('打地鼠 —— 九歌')
    12. return screen
    13. '''主函数'''
    14. def main():
    15. # 初始化
    16. screen = initGame()
    17. # 加载背景音乐和其他音效
    18. pygame.mixer.music.load(cfg.BGM_PATH)
    19. pygame.mixer.music.play(-1)
    20. audios = {
    21. 'count_down': pygame.mixer.Sound(cfg.COUNT_DOWN_SOUND_PATH),
    22. 'hammering': pygame.mixer.Sound(cfg.HAMMERING_SOUND_PATH)
    23. }
    24. # 加载字体
    25. font = pygame.font.Font(cfg.FONT_PATH, 40)
    26. # 加载背景图片
    27. bg_img = pygame.image.load(cfg.GAME_BG_IMAGEPATH)
    28. # 开始界面
    29. startInterface(screen, cfg.GAME_BEGIN_IMAGEPATHS)
    30. # 地鼠改变位置的计时
    31. hole_pos = random.choice(cfg.HOLE_POSITIONS)
    32. change_hole_event = pygame.USEREVENT
    33. pygame.time.set_timer(change_hole_event, 800)
    34. # 地鼠
    35. mole = Mole(cfg.MOLE_IMAGEPATHS, hole_pos)
    36. # 锤子
    37. hammer = Hammer(cfg.HAMMER_IMAGEPATHS, (500, 250))
    38. # 时钟
    39. clock = pygame.time.Clock()
    40. # 分数
    41. your_score = 0
    42. flag = False
    43. # 初始时间
    44. init_time = pygame.time.get_ticks()
    45. # 游戏主循环
    46. while True:
    47. # --游戏时间为60s
    48. time_remain = round((61000 - (pygame.time.get_ticks() - init_time)) / 1000.)
    49. # --游戏时间减少, 地鼠变位置速度变快
    50. if time_remain == 40 and not flag:
    51. hole_pos = random.choice(cfg.HOLE_POSITIONS)
    52. mole.reset()
    53. mole.setPosition(hole_pos)
    54. pygame.time.set_timer(change_hole_event, 650)
    55. flag = True
    56. elif time_remain == 20 and flag:
    57. hole_pos = random.choice(cfg.HOLE_POSITIONS)
    58. mole.reset()
    59. mole.setPosition(hole_pos)
    60. pygame.time.set_timer(change_hole_event, 500)
    61. flag = False
    62. # --倒计时音效
    63. if time_remain == 10:
    64. audios['count_down'].play()
    65. # --游戏结束
    66. if time_remain < 0: break
    67. count_down_text = font.render('Time: '+str(time_remain), True, cfg.WHITE)
    68. # --按键检测
    69. for event in pygame.event.get():
    70. if event.type == pygame.QUIT:
    71. pygame.quit()
    72. sys.exit()
    73. elif event.type == pygame.MOUSEMOTION:
    74. hammer.setPosition(pygame.mouse.get_pos())
    75. elif event.type == pygame.MOUSEBUTTONDOWN:
    76. if event.button == 1:
    77. hammer.setHammering()
    78. elif event.type == change_hole_event:
    79. hole_pos = random.choice(cfg.HOLE_POSITIONS)
    80. mole.reset()
    81. mole.setPosition(hole_pos)
    82. # --碰撞检测
    83. if hammer.is_hammering and not mole.is_hammer:
    84. is_hammer = pygame.sprite.collide_mask(hammer, mole)
    85. if is_hammer:
    86. audios['hammering'].play()
    87. mole.setBeHammered()
    88. your_score += 10
    89. # --分数
    90. your_score_text = font.render('Score: '+str(your_score), True, cfg.BROWN)
    91. # --绑定必要的游戏元素到屏幕(注意顺序)
    92. screen.blit(bg_img, (0, 0))
    93. screen.blit(count_down_text, (875, 8))
    94. screen.blit(your_score_text, (800, 430))
    95. mole.draw(screen)
    96. hammer.draw(screen)
    97. # --更新
    98. pygame.display.flip()
    99. clock.tick(60)
    100. # 读取最佳分数(try块避免第一次游戏无.rec文件)
    101. try:
    102. best_score = int(open(cfg.RECORD_PATH).read())
    103. except:
    104. best_score = 0
    105. # 若当前分数大于最佳分数则更新最佳分数
    106. if your_score > best_score:
    107. f = open(cfg.RECORD_PATH, 'w')
    108. f.write(str(your_score))
    109. f.close()
    110. # 结束界面
    111. score_info = {'your_score': your_score, 'best_score': best_score}
    112. is_restart = endInterface(screen, cfg.GAME_END_IMAGEPATH, cfg.GAME_AGAIN_IMAGEPATHS, score_info, cfg.FONT_PATH, [cfg.WHITE, cfg.RED], cfg.SCREENSIZE)
    113. return is_restart
    114. '''run'''
    115. if __name__ == '__main__':
    116. while True:
    117. is_restart = main()
    118. if not is_restart:
    119. break

    最后

    那么完整代码写完后就可以双击运行代码啦,如果有报错记得按我说的方法排查一下,么么哒!

    感谢你们的阅读😆

    后续还会继续更新💓,欢迎持续关注📌哟~

    💫如果有错误❌,欢迎指正呀💫

    ✨如果觉得收获满满,可以点点赞👍支持一下哟~✨

  • 相关阅读:
    【稳定性】秘密武器--功能开关技术
    使命、愿景、价值观到底有什么区别
    Abbkine ExKine总蛋白提取试剂盒的适用性和特点介绍
    StyleGAN 生成 AI 虚拟人脸,再也不怕侵犯肖像权
    Slax Linux 强化了会话管理和引导参数选项
    screen_main.c
    SpringBoot:jsp、容器对象、CommandLineRunner接口使用(动力)
    机器学习sklearn——day02
    【1024】小结最近三个月
    编译原理:语法分析(自下向上)
  • 原文地址:https://blog.csdn.net/xinnian_yyds/article/details/126207528