设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间12 现在时间12 缓存数据 做人啊,最要紧的是开心 你饿不饿,我去给你煮碗面 其实我不想给你煮面我只是想见你一面

做人啊,最要紧的是开心 你饿不饿,我去给你煮碗面 其实我不想给你煮面我只是想见你一面 -- 问你是否跟我走

查看: 520|回复: 1

Python+Pygame实战之实现小蜜蜂历险记游戏

[复制链接]

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
377
主题
353
精华
0
金钱
1097
积分
738
注册时间
2022-12-29
最后登录
2025-5-31

发表于 2023-2-10 23:04:55 | 显示全部楼层 |阅读模式
导语

亲爱的小可爱们,大家好! 欢迎来到木子的游戏编程空间
经常听到有朋友说,学习编程是一件非常枯燥无味的事情。其实,大家有没有认真想过,可能是我们的学习方法不对?
000635o03dprjvjbp0bar0.jpeg

比方说,你有没有想过,可以通过打游戏来学编程?
今天又又又更新一款新游戏给大家啦,期待不期待呀?教大家如何通过边打游戏边学编程!准备好了吗?我们即将开始激动人心的游戏编程之旅。
或许你之前学习过一点编程,但若是你从没接触过游戏编程,那么你仍然会对游戏程序的运行感到不解。游戏程序不像计算一个公式或谜题,得到答案之后程序就结束了,游戏程序一直是处于运行中的,只要你不主动退出,那么你可以永远呆在游戏之中。这就游戏循环的神奇魔力。下面我们进入今天的主题——制作一款《小蜜蜂历险记》小游戏!
000635bd50x5nab55o5aed.jpeg


一、运行环境

小编使用的环境:Python3、Pycharm社区版、Pygame模块部分自带就不一一 展示啦。
模块安装:pip install -i https://pypi.douban.com/simple/ +pygame

二、素材(图片等)

图片的话可以自己准备,但是要注意的大小尺寸问题还有图片是.png模式的哈。
000636u1n51z6z1t688kn1.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.             

  69.     def fire(self):
  70.         bullet = Bullet()
  71.         bullet.rect.bottom = self.rect.y - 20
  72.         bullet.rect.centerx = self.rect.centerx
  73.         self.bullet_group.add(bullet)



  74. class Bullet(GrameSprite):
  75.     """子弹类"""

  76.     def __init__(self):
  77.         super().__init__('./images/new_arrow.png', -4)

  78.     def __del__(self):
  79.         pass
  80.         # print('子弹销毁')


  81.     def update(self):
  82.         super().update()
  83.         if self.rect.bottom < 0:
  84.             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.         
  49.             
  50.         else:
  51.             self.hero.speed = 0
  52.             self.hero.speed1=0


  53.     def __check_collide(self):
  54.         # 子弹打飞机
  55.         pygame.sprite.groupcollide(self.hero.bullet_group,self.enemy_group,True,True)

  56.         # 敌机撞英雄
  57.         enemies  = pygame.sprite.spritecollide(self.hero,self.enemy_group,True)

  58.         if len(enemies) > 0:
  59.             self.hero.kill()
  60.             #  清空所有的子弹 精灵组的 子弹
  61.             # self.hero.bullet_group.empty()
  62.             #   停止在事件队列上重复创建子弹事件
  63.             # pygame.time.set_timer(HERO_FIRE_EVENT, 0)
  64.             # Restart = pygame.image.load('./images/restart_sel.png')
  65.             # self.screen.blit(Restart, (0, 0))
  66.             # pygame.display.update()

  67.             PlaneGame.__game_over()



  68.     def __update_sprites(self):
  69.         # 精灵组 更新精灵的位置
  70.         self.back_group.update()
  71.         self.enemy_group.update()
  72.         self.hero_group.update()
  73.         self.hero.bullet_group.update()
  74.         # 绘制所有得精灵
  75.         self.back_group.draw(self.screen)
  76.         self.enemy_group.draw(self.screen)
  77.         self.hero_group.draw(self.screen)
  78.         self.hero.bullet_group.draw(self.screen)


  79.     @staticmethod
  80.     def __game_over():
  81.         pygame.quit()
  82.         exit()


  83.     def start_game(self):
  84.         while True:
  85.             # 1.设置刷新帧率
  86.             self.clock.tick(FRAME_PER_SEC)
  87.             # 2.事件监听
  88.             self.__event_handler()
  89.             # 3.碰撞检测
  90.             self.__check_collide()
  91.             # 4.更新/绘制精灵组
  92.             self.__update_sprites()
  93.             # 5.更新显示
  94.             pygame.display.update()



  95. if __name__ == '__main__':
  96.     game = PlaneGame()
  97.     game.start_game()
复制代码
四、效果展示

图片背景优化了一下子的哈,背景更好看啦~小蜜蜂当然是在花丛中啦!
1)随机截图界面
000636fvzzwxie4n3sj496.jpeg

2)击杀敌人(小瓢虫)
000636kkqp7kp7p27p53e6.jpeg

3)随机背景截图
撞击死亡,上下左右移动方向键,空格放箭。
000637ga5gx5m5zmg0c59a.jpeg

以上就是Python+Pygame实战之实现小蜜蜂历险记游戏的详细内容,更多关于Python Pygame小蜜蜂历险记的资料请关注晓枫资讯其它相关文章!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
21
积分
22
注册时间
2022-12-27
最后登录
2022-12-27

发表于 前天 13:20 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表