• 【Pygame实战】强烈推荐:教你用百行代码编写一款《小蜜蜂历险记》不信?来看看(玩儿嗨了~)


    导语

    亲爱的小可爱们,大家好! 欢迎来到木子的游戏编程空间👇

    经常听到有朋友说,学习编程是一件非常枯燥无味的事情。其实,大家有没有认真想过,可能

    是我们的学习方法不对?

    所有文章完整的素材+源码都在👇👇

    粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。

    比方说,你有没有想过,可以通过打游戏来学编程?

    今天又又又更新一款新游戏给大家啦,期待不期待呀?教大家如何通过边打游戏边学编程!

    或许你之前学习过一点编程,但若是你从没接触过游戏编程,那么你仍然会对游戏程序的运行

    感到不解。游戏程序不像计算一个公式或谜题,得到答案之后程序就结束了,游戏程序一直是

    处于运行中的,只要你不主动退出,那么你可以永远呆在游戏之中。这就游戏循环的神奇魔

    力。下面我们进入今天的主题——制作一款《小蜜蜂历险记》小游戏!

    准备好了吗?我们即将开始激动人心的游戏编程之旅👇

    正文

    一、运行环境

    小编使用的环境:Python3、Pycharm社区版、Pygame模块部分自带就不一一 展示啦。

     模块安装:pip install -i https://pypi.douban.com/simple/ +pygame

    二、素材(图片等)

    图片的话可以自己准备,但是要注意的大小尺寸问题还有图片是.png模式的哈。

    三、代码展示

    这款小游戏主要分为两大块代码:plame_sprites.py、主程序plane_main.py。

    1)plame_sprites.py(屏幕的大小、背景、敌机等类的设置)

    1. import random
    2. import pygame
    3. # 屏幕大小的常量
    4. SCREEN_RECT = pygame.Rect(0, 0, 480, 650)
    5. # 刷新的帧率
    6. FRAME_PER_SEC = 60
    7. # 创建敌机定时器常量
    8. CREATE_ENEMY_EVENT = pygame.USEREVENT
    9. # 创建子弹定时器常量
    10. HERO_FIRE_EVENT = pygame.USEREVENT + 1
    11. class GrameSprite(pygame.sprite.Sprite):
    12. """"飞机大战游戏精灵类"""
    13. def __init__(self, image_name, speed=1,speed1=1):
    14. # 调用父类方法
    15. super().__init__()
    16. pygame.image.load(image_name).convert_alpha()
    17. self.image = pygame.image.load(image_name).convert_alpha()
    18. self.rect = self.image.get_rect()
    19. self.speed = speed
    20. self.speed1=speed1
    21. def update(self):
    22. self.rect.y += self.speed
    23. class Background(GrameSprite):
    24. """背景类"""
    25. def __init__(self, is_flag=False):
    26. super().__init__('./images/background1.jpeg')
    27. if is_flag:
    28. self.rect.y = -self.rect.height
    29. def update(self):
    30. super().update()
    31. if self.rect.y >= SCREEN_RECT.height:
    32. self.rect.y = -SCREEN_RECT.height
    33. class Enemy(GrameSprite):
    34. """"敌机类"""
    35. def __init__(self):
    36. super().__init__('./images/enemy0.png')
    37. self.speed = random.randint(2, 3)
    38. max_x = SCREEN_RECT.width - self.rect.width
    39. self.rect.x = random.randint(0, max_x)
    40. self.rect.bottom = 0
    41. def __del__(self):
    42. # print('敌机挂了%s' % self.rect)
    43. pass
    44. def update(self):
    45. super().update()
    46. if self.rect.y >= SCREEN_RECT.height:
    47. # kill方法可以将精灵从精灵组中移除,精灵就会被销毁
    48. self.kill()
    49. class Hero(GrameSprite):
    50. """英雄类"""
    51. def __init__(self):
    52. super().__init__('./images/hero1.png', 0)
    53. self.rect.centerx = SCREEN_RECT.centerx
    54. self.rect.bottom = SCREEN_RECT.bottom - 120
    55. # 创建子弹精灵组
    56. self.bullet_group = pygame.sprite.Group()
    57. def update(self):
    58. self.rect.x += self.speed
    59. self.rect.y += self.speed1
    60. if self.rect.x < 0:
    61. self.rect.x = 0
    62. elif self.rect.right > SCREEN_RECT.right:
    63. self.rect.right = SCREEN_RECT.right
    64. if self.rect.y>SCREEN_RECT.height:
    65. self.rect.bottom=SCREEN_RECT.height
    66. elif self.rect.y<0:
    67. self.rect.bottom=0
    68. def fire(self):
    69. bullet = Bullet()
    70. bullet.rect.bottom = self.rect.y - 20
    71. bullet.rect.centerx = self.rect.centerx
    72. self.bullet_group.add(bullet)
    73. class Bullet(GrameSprite):
    74. """子弹类"""
    75. def __init__(self):
    76. super().__init__('./images/new_arrow.png', -4)
    77. def __del__(self):
    78. pass
    79. # print('子弹销毁')
    80. def update(self):
    81. super().update()
    82. if self.rect.bottom < 0:
    83. self.kill()

    2)主程序plane_main.py

    1. import pygame
    2. from plame_sprites import *
    3. class PlaneGame(object):
    4. def __init__(self):
    5. # 1.创建游戏窗口
    6. self.screen = pygame.display.set_mode(SCREEN_RECT.size)
    7. # 2.创建时钟对象
    8. self.clock = pygame.time.Clock()
    9. # 3.创建精灵组
    10. self.__create_speites()
    11. # 4.设置定时器
    12. pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)
    13. pygame.time.set_timer(HERO_FIRE_EVENT, 500)
    14. def __create_speites(self):
    15. bg1 = Background()
    16. bg2 = Background(True)
    17. self.back_group = pygame.sprite.Group(bg1, bg2)
    18. # 创建敌机精灵组
    19. self.enemy_group = pygame.sprite.Group()
    20. # 创建英雄
    21. self.hero = Hero()
    22. self.hero_group = pygame.sprite.Group( self.hero )
    23. def __event_handler(self):
    24. for event in pygame.event.get():
    25. # 退出
    26. if event.type == pygame.QUIT:
    27. PlaneGame.__game_over()
    28. # 判断事件是不是定时器
    29. elif event.type == CREATE_ENEMY_EVENT:
    30. enemy = Enemy()
    31. self.enemy_group.add(enemy)
    32. if event.type==pygame.KEYDOWN:
    33. if event.key==pygame.K_SPACE:
    34. self.hero.fire()
    35. # elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:
    36. # print('按下向右')
    37. # 获取按下的键盘被按下的键
    38. keys_pressd = pygame.key.get_pressed()
    39. # 判断用户按下的方向
    40. if keys_pressd[pygame.K_RIGHT]:
    41. self.hero.speed = 3
    42. elif keys_pressd[pygame.K_LEFT]:
    43. self.hero.speed = -3
    44. elif keys_pressd[pygame.K_UP]:
    45. self.hero.speed1 =-3
    46. elif keys_pressd[pygame.K_DOWN]:
    47. self.hero.speed1 = 3
    48. else:
    49. self.hero.speed = 0
    50. self.hero.speed1=0
    51. def __check_collide(self):
    52. # 子弹打飞机
    53. pygame.sprite.groupcollide(self.hero.bullet_group,self.enemy_group,True,True)
    54. # 敌机撞英雄
    55. enemies = pygame.sprite.spritecollide(self.hero,self.enemy_group,True)
    56. if len(enemies) > 0:
    57. self.hero.kill()
    58. # 清空所有的子弹 精灵组的 子弹
    59. # self.hero.bullet_group.empty()
    60. # 停止在事件队列上重复创建子弹事件
    61. # pygame.time.set_timer(HERO_FIRE_EVENT, 0)
    62. # Restart = pygame.image.load('./images/restart_sel.png')
    63. # self.screen.blit(Restart, (0, 0))
    64. # pygame.display.update()
    65. PlaneGame.__game_over()
    66. def __update_sprites(self):
    67. # 精灵组 更新精灵的位置
    68. self.back_group.update()
    69. self.enemy_group.update()
    70. self.hero_group.update()
    71. self.hero.bullet_group.update()
    72. # 绘制所有得精灵
    73. self.back_group.draw(self.screen)
    74. self.enemy_group.draw(self.screen)
    75. self.hero_group.draw(self.screen)
    76. self.hero.bullet_group.draw(self.screen)
    77. @staticmethod
    78. def __game_over():
    79. pygame.quit()
    80. exit()
    81. def start_game(self):
    82. while True:
    83. # 1.设置刷新帧率
    84. self.clock.tick(FRAME_PER_SEC)
    85. # 2.事件监听
    86. self.__event_handler()
    87. # 3.碰撞检测
    88. self.__check_collide()
    89. # 4.更新/绘制精灵组
    90. self.__update_sprites()
    91. # 5.更新显示
    92. pygame.display.update()
    93. if __name__ == '__main__':
    94. game = PlaneGame()
    95. game.start_game()

    四、效果展示

    图片背景优化了一下子的哈,背景更好看啦~小蜜蜂当然是在花丛中啦!

    1)随机截图界面

    2)击杀敌人(小瓢虫)

    3)随机背景截图

    撞击死亡,上下左右移动方向键,空格放箭。

    总结

    好啦!一款简单的《小蜜蜂历险记》到这里正式结束,很多游戏的话都是可以自己改变背景跟

    人物的,那将是完全不同的新游戏了!嘻嘻,期待下一期更新嘛?那赶快关注木木子叭

    老规矩,木子的文章汇总可以看到分类好的各种不同类型的文章,滴滴我大部分源码都在滴。

    🎯完整的免费源码领取处:找我吖!文末公众hao可自行领取,滴滴我也可!

    🔨推荐往期文章——

    项目1.1  扑克牌游戏

    【Pygame实战】打扑克牌嘛?赢了输了?这款打牌游戏,竟让我废寝忘食。

    项目1.2  英文单词猜猜看小游戏

    【Pygame实战】再次祭出舍不得分享的学习小技巧,用游戏玩出英文能力(O基础也能轻松get)

    项目8.3 泡泡机游戏

    【Pygame实战】超有趣的泡泡游戏来袭——愿你童心不泯,永远快乐简单哦~

    项目8.4  宇宙激战射击游戏

    【Pygame实战】飞机射击大作:宇宙激战一触即发...这款超经典的射击游戏也该拿出来重启了~

    🎄文章汇总——

    汇总合集  Python—2022 |已有文章汇总 | 持续更新,直接看这篇就够了

    (更多内容+源码都在✨文章汇总哦!!欢迎阅读喜欢的文章🎉~)

  • 相关阅读:
    vscode支持c++编译
    C++笔记之遍历vector的所有方式
    LeetCode——1636.按照频率将数组升序排序
    iOS事件传递链与响应链
    1688-阿里巴巴批发网(获取商品的名称,价格,图片)
    uniapp 开发App 网络异常如何处理
    vite配置本地的sdk---引入本地的sdk文件(秒懂)
    Welcome to YARP - 4.限流 (Rate Limiting)
    JVM GC与频繁GC
    mybatis逆向工程(pom文件和generatorConfig.xml)的配置
  • 原文地址:https://blog.csdn.net/weixin_55822277/article/details/126291394