用Python开发一个飞机大战游戏(附源码教程)

这篇具有很好参考价值的文章主要介绍了用Python开发一个飞机大战游戏(附源码教程)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

python飞机大战代码详解,python,游戏,pygame

点击蓝字 关注我们

Python是一门非常简单的语言,快速入门之后可以做很多事情!比如爬虫啊,数据分析啊,自动化运维啊,机器学习,量化分析等等!但是入门到进阶的过程有时会非常痛苦,如果有一些好玩有趣的例子就好了。

比如通过游戏来学编程是一个非常好的途径,今天强哥就来写一个非常好玩的打飞机游戏,大概就1000多行,非常不错!

python飞机大战代码详解,python,游戏,pygame

1、打飞机的游戏

打飞机的游戏估计很多人都玩过,雷霆战机相信很多80后的小伙伴都玩过!

Python是一门非常简单的语言,快速入门之后可以做很多事情!比如爬虫啊,数据分析啊,自动化运维啊,机器学习,量化分析等等!

但是入门到进阶的过程有时会非常痛苦,如果有一些好玩有趣的例子就好了。比如通过游戏来学编程是一个非常好的途径

2、代码讲解

1.代码的结构

python飞机大战代码详解,python,游戏,pygame

2.游戏的角色文件

gameRole 整个游戏分三个角色,下面我一一来解释一下,思路其实非常清晰的。

1)一个是子弹

python飞机大战代码详解,python,游戏,pygame

初始化子弹的图片,然后得到它在画布上的坐标,并控制它的移动速度

2)敌机

会随机出一堆敌人的飞机,直管往前冲,从屏幕的上方往下方蜂拥而至,不需要考虑其他的行为!

python飞机大战代码详解,python,游戏,pygame

敌机有几个重要的属性,比如它的飞行图片和击落的图片,然后获取的屏幕上的坐标。敌机的行为就一个飞,而且是只会往前飞。

3)我方战机



玩家类class Player(pygame.sprite.Sprite):` `def __init__(self, plane_img, player_rect, init_pos):` `pygame.sprite.Sprite.__init__(self)` `self.image = [] # 用来存储玩家对象精灵图片的列表` `for i in range(len(player_rect)):` `self.image.append(plane_img.subsurface(player_rect[i]).convert_alpha())` `self.rect = player_rect[0] # 初始化图片所在的矩形` `self.rect.topleft = init_pos # 初始化矩形的左上角坐标` `self.speed = 8 # 初始化玩家速度,这里是一个确定的值` `self.bullets = pygame.sprite.Group() # 玩家飞机所发射的子弹的集合` `self.img_index = 0 # 玩家精灵图片索引` `self.is_hit = False # 玩家是否被击中 def shoot(self, bullet_img): bullet = Bullet(bullet_img, self.rect.midtop) self.bullets.add(bullet) ` `def moveUp(self):` `if self.rect.top <= 0:` `self.rect.top = 0` `else:` `self.rect.top -= self.speed def moveDown(self): if self.rect.top >= SCREEN_HEIGHT - self.rect.height: self.rect.top = SCREEN_HEIGHT - self.rect.height else: self.rect.top += self.speed ` `def moveLeft(self):` `if self.rect.left <= 0:` `self.rect.left = 0` `else:` `self.rect.left -= self.speed def moveRight(self): if self.rect.left >= SCREEN_WIDTH - self.rect.width: self.rect.left = SCREEN_WIDTH - self.rect.width else: self.rect.left += self.speed




我方的战机稍微复杂一点,它有这么几个主要的属性,飞行的图片,被击落的图片,屏幕坐标,它的子弹等等!然后我们需要控制它的飞机方向,向上,向下,左边和右边,发射子弹。

完整代码请添加小助手获取哦,有什么不懂的问题也可以随时咨询~

请长按扫码添加小助手

python飞机大战代码详解,python,游戏,pygame

3.主游戏部分文件mainGame

1)先是初始化游戏的界面大小,字体等等,读取声音和图片和基本配置:



class HeroPlane(BasePlane): global supply_size ` `def __init__(self, screen_temp):` `BasePlane.__init__(self, 3, screen_temp, 210, 728, "./feiji/hero1.png", 4, HP_list[3]) # super().__init__()` `BasePlane.crate_images(self, "hero_blowup_n")` `self.key_down_list = [] # 用来存储键盘上下左右移动键` `self.space_key_list = [] # 保存space键` `self.is_three_bullet = False` `self.barrel_2 = [] # 2号炮管(左)` `self.barrel_3 = [] # 3号炮管(右)` `self.three_bullet_stock = 50 # 三管齐发子弹初始值为50 # 单键移动方向 def move_left(self): self.x -= 7 ` `def move_right(self):` `self.x += 7 def move_up(self): self.y -= 6 ` `def move_down(self):` `self.y += 6 # 双键移动方向 def move_left_and_up(self): self.x -= 5 self.y -= 6 ` `def move_right_and_up(self):` `self.x += 5` `self.y -= 6 def move_lef_and_down(self): self.x -= 5 self.y += 6 ` `def move_right_and_down(self):` `self.x += 5` `self.y += 6 # 控制飞机左右移动范围s def move_limit(self): if self.x < 0: self.x = -2 elif self.x + 100 > 480: self.x = 380 if self.y > 728: self.y = 728 elif self.y < 350: self.y += 6 ` `# 键盘按下向列表添加按键` `def key_down(self, key):` `self.key_down_list.append(key) # 键盘松开向列表删除按键 def key_up(self, key): if len(self.key_down_list) != 0: # 判断是否为空 try: self.key_down_list.remove(key) except Exception: pass ` `# 控制hero的持续移动` `def press_move(self):` `if len(self.key_down_list) != 0:` `if len(self.key_down_list) == 2: # 两个键` `if (self.key_down_list[0] == K_LEFT and self.key_down_list[1] == K_UP) or (` `self.key_down_list[1] == K_LEFT and self.key_down_list[` `0] == K_UP): # key_down_list列表存在按键为left,up 或 up,left时调用move_left_and_up()方法` `self.move_left_and_up()` `elif (self.key_down_list[0] == K_RIGHT and self.key_down_list[1] == K_UP) or (` `self.key_down_list[1] == K_RIGHT and self.key_down_list[0] == K_UP):` `self.move_right_and_up()` `elif (self.key_down_list[0] == K_LEFT and self.key_down_list[1] == K_DOWN) or (` `self.key_down_list[1] == K_LEFT and self.key_down_list[0] == K_DOWN):` `self.move_lef_and_down()` `elif (self.key_down_list[0] == K_RIGHT and self.key_down_list[1] == K_DOWN) or (` `self.key_down_list[1] == K_RIGHT and self.key_down_list[0] == K_DOWN):` `self.move_right_and_down()` `else: # 一个键` `if self.key_down_list[0] == K_LEFT:` `self.move_left()` `elif self.key_down_list[0] == K_RIGHT:` `self.move_right()` `elif self.key_down_list[0] == K_UP:` `self.move_up()` `elif self.key_down_list[0] == K_DOWN:` `self.move_down() # 自爆 def bomb(self): self.hitted = True self.HP = 0 ` `# 键盘按下向列表添加space` `def space_key_down(self, key):` `self.space_key_list.append(key) # 键盘松开向列表删除space def space_key_up(self, key): if len(self.space_key_list) != 0: # 判断是否为空 try: self.space_key_list.pop(0) except Exception: raise ` `# 按键space不放,持续开火` `def press_fire(self):` `if len(self.bullet_list) == 0 and len(self.space_key_list):` `self.fire()` `else:` `if len(self.space_key_list) != 0:` `if self.bullet_list[len(self.bullet_list) - 1].y < self.y - 14 - 60:` `self.fire() # 开火 def fire(self): global plane_maximum_bullet hero_fire_music.play() if not self.is_three_bullet: if len(self.bullet_list) < plane_maximum_bullet[self.plane_type]: # 单发炮台子弹限制为8 self.bullet_list.append(Bullet(self.screen, self.x + 40, self.y - 14, self)) else: # 没有子弹限制 # 主炮管 self.bullet_list.append(Bullet(self.screen, self.x + 40, self.y - 14, self)) # 创建2,3号炮管子弹 self.barrel_2.append(Bullet(self.screen, self.x + 5, self.y + 20, self)) self.barrel_3.append(Bullet(self.screen, self.x + 75, self.y + 20, self)) self.three_bullet_stock -= 1 # 三管炮弹弹药余量-1 if not self.three_bullet_stock: # 三管齐发弹药用完 self.is_three_bullet = False`` # 是否吃到补给 def supply_hitted(self, supply_temp, width, height): # widht和height表示范围 if supply_temp and self.HP: # 更加精确的判断是否吃到补给 supply_temp_left_x = supply_temp.x + supply_size[supply_temp.supply_type][“width”] * 0.15 supply_temp_right_x = supply_temp.x + supply_size[supply_temp.supply_type][“width”] * 0.85 supply_temp_top_y = supply_temp.y + supply_size[supply_temp.supply_type][“height”] * 0.4 supply_temp_bottom_y = supply_temp.y + supply_size[supply_temp.supply_type][“height”] * 0.9 if supply_temp_left_x > self.x + 0.05 * width and supply_temp_right_x < self.x + 0.95 * width and supply_temp_top_y < self.y + 0.95 * height and supply_temp_bottom_y > self.y + 0.1 * height: if supply_temp.supply_type == 0: # 0为血量补给,吃到血量补给 self.HP -= supply_temp.supply_HP # 血量-(-3) if self.HP > 41: # 血量最大值为41 self.HP = 41 show_score_HP() else: # 吃到弹药补给 self.is_three_bullet = True self.three_bullet_stock += 20 # 三管炮弹余量+20 del_supply(supply_temp)




2)游戏的逻辑部分



函数def del_outWindow_bullet(plane):` `"""删除plane的越界子弹"""` `bullet_list_out = [] # 越界子弹` `for bullet in plane.bullet_list:` `bullet.display()` `bullet.move()` `if bullet.judge(): # 判断子弹是否越界` `bullet_list_out.append(bullet)` `# 删除越界子弹` `if bullet_list_out:` `for bullet in bullet_list_out:` `plane.bullet_list.remove(bullet)` `# 如果为hero并且为三管齐发则判断炮管23的子弹是否越界` `if plane.plane_type == 3 and (plane.barrel_2 or plane.barrel_3):` `barrel2_bullet_out = [] # 越界子弹` `barrel3_bullet_out = [] # 越界子弹` `# 判断炮管2` `for bullet in plane.barrel_2:` `bullet.display()` `bullet.move()` `if bullet.judge(): # 判断子弹是否越界` `barrel2_bullet_out.append(bullet)` `# 删除越界子弹` `if barrel2_bullet_out:` `for bullet in barrel2_bullet_out:` `plane.barrel_2.remove(bullet)` `# 判断炮管3` `for bullet in plane.barrel_3:` `bullet.display()` `bullet.move()` `if bullet.judge(): # 判断子弹是否越界` `barrel3_bullet_out.append(bullet)` `# 删除越界子弹` `if barrel3_bullet_out:` `for bullet in barrel3_bullet_out:` `plane.barrel_3.remove(bullet)` `def del_plane(plane):` `"""回收被击中的敌机的对象"""` `global hero` `global hit_score` `global enemy0_list` `global enemy1_list` `global enemy2_list` `if plane in enemy0_list: # 回收对象为enemy0` `enemy0_list.remove(plane)` `elif plane in enemy1_list:` `enemy1_list.remove(plane)` `elif plane in enemy2_list:` `enemy2_list.remove(plane)` `elif plane == hero: # 回收对象为hero` `hit_score = 0` `show_score_HP()` `hero = None` `def del_supply(supply):` `"""回收补给"""` `global blood_supply` `global bullet_supply` `if supply == blood_supply: # 回收对象为血量补给` `blood_supply = None` `elif supply == bullet_supply:` `bullet_supply = None` `def reborn():` `"""Hero重生"""` `global hero` `global window_screen` `global hit_score` `hero = HeroPlane(window_screen)` `show_score_HP()` `hit_score = 0` `# 将最高分写入到文件def max_score_2_file(): global hit_score file = None try: file = open(“./飞机大战得分榜.txt”, ‘r+’) except Exception: file = open(“./飞机大战得分榜.txt”, ‘w+’) finally: if file.read(): # 判断文件是否为空 file.seek(0, 0) # 定位到文件开头 file_score = eval(file.read()) if hit_score > file_score: file.seek(0, 0) # 定位到文件开头 file.truncate() # 清空文件内容 file.write(str(hit_score)) else: file.write(str(hit_score)) file.close() def create_enemy_plane(): “”“生成敌机”“” global window_screen global hit_score global enemy0_list global enemy0_maximum global enemy1_list global enemy1_maximum global enemy2_list global enemy2_maximum global HP_list if hit_score < 40: random_num = random.randint(1, 70) HP_list = [1, 20, 100, 20] elif hit_score < 450: random_num = random.randint(1, 60) HP_list = [1, 20, 120, 20] elif hit_score < 650: random_num = random.randint(1, 60) HP_list = [1, 30, 140, 20] elif hit_score < 850: random_num = random.randint(1, 55) HP_list = [2, 36, 160, 20] else: random_num = random.randint(1, 50) HP_list = [2, 40, 180, 20] random_appear_boss1 = random.randint(18, 28) random_appear_boss2 = random.randint(80, 100) # enemy0 if (random_num == 20 or random == 40) and len(enemy0_list) < enemy0_maximum: enemy0_list.append(Enemy0Plane(window_screen)) # enemy1 if (hit_score >= random_appear_boss1 and (hit_score % random_appear_boss1) == 0) and len( enemy1_list) < enemy1_maximum: enemy1_list.append(Enemy1Plane(window_screen)) # enemy2 if (hit_score >= random_appear_boss2 and (hit_score % random_appear_boss2) == 0) and len( enemy2_list) < enemy2_maximum: enemy2_list.append(Enemy2Plane(window_screen))


`   `


上面这一堆代码其实就是干下面几个事情:

  • 先绘制出背景幕布

  • 再绘制出玩家的战机,敌机

  • 绑定战机和敌机的鼠标和键盘响应事件

  • 发射子弹,通过坐标来判断子弹和敌机的碰撞,以及敌机和玩家战机的碰撞

  • 最后还要计算得分

点击下方安全链接前往获取

CSDN大礼包:《Python入门&进阶学习资源包》免费分享

👉Python实战案例👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

python飞机大战代码详解,python,游戏,pygame

python飞机大战代码详解,python,游戏,pygame

👉Python书籍和视频合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

python飞机大战代码详解,python,游戏,pygame

👉Python副业创收路线👈

python飞机大战代码详解,python,游戏,pygame

这些资料都是非常不错的,朋友们如果有需要《Python学习路线&学习资料》,点击下方安全链接前往获取

CSDN大礼包:《Python入门&进阶学习资源包》免费分享

本文转自网络,如有侵权,请联系删除。文章来源地址https://www.toymoban.com/news/detail-851354.html

到了这里,关于用Python开发一个飞机大战游戏(附源码教程)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Python3+pygame实现有趣好玩的飞机大战游戏(附源码及素材)

    Python3+pygame实现有趣好玩的飞机大战游戏(附源码及素材)

    版权声明:原创不易,本文禁止抄袭、转载,侵权必究! 开发环境 :Windows10 Python3.6.4 第三方库 :Pygame1.9.6 IDE :PyCharm/Sublime Text 素材模块 游戏图片素材: BGM及音效素材: 字体素材: 源码模块 子弹模块 普通子弹部分源码: 超级子弹部分源码: 敌机子弹部分源码: 敌机模

    2024年02月11日
    浏览(15)
  • 第一篇【传奇开心果系列】Python的游戏库pygame技术点案例示例:深度解读实战开发飞机大战经典游戏案例

    第一篇【传奇开心果系列】Python的游戏库pygame技术点案例示例:深度解读实战开发飞机大战经典游戏案例

    开发飞机大战游戏不仅能满足广大玩家的娱乐需求,提供寓教于乐的学习机会,也是技术实践、创新实验和商业探索的重要载体,具有多维度的社会与经济价值。 开发飞机大战游戏具有多方面的意义,涵盖娱乐、教育、技术实践与创新等多个层面: 娱乐价值 : 休闲娱乐 :

    2024年04月23日
    浏览(50)
  • Python飞机大战小游戏

    Python飞机大战小游戏

    游戏规则:键盘上下左右键控制飞机移动 游戏展示图片: 源码: 第一个py命名为:plane_main.py 第二py命名为:plane_sprites.py 素材图片image关注私信我获取!!!

    2024年02月10日
    浏览(17)
  • python——飞机大战小游戏

    python——飞机大战小游戏

    目录 1、导入模块 2、窗口操作 3、事件操作 4、长按事件 5、添加游戏背景 6、添加英雄飞机 7、获取飞机的图片矩形 8、基本游戏窗口 9、添加游戏窗口图片 10、英雄飞机登场 11、英雄飞机装备子弹并发射 1、enemy_plane 2、game_main 3、game_map 4、game_score 5、hero_plane 6、plane_bullet 先安

    2024年02月03日
    浏览(12)
  • python---简单游戏制作(飞机大战)

    python---简单游戏制作(飞机大战)

    1.开发软件 pycharm 编程软件 pygame 第三方库 sprite Group 2.技术介绍      pycharm: PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供

    2024年02月12日
    浏览(13)
  • 用python写(飞机大战小游戏)

    用python写(飞机大战小游戏)

    w\\\'cwc下面我们进入详细教程:   一、首先我们先建一个文件夹 planewars(名字随便取):  然后用我们python中的pycharm打开这个文件,我们飞机大战的项目就在这进行 二、我们要写这个小游戏要用到pygame模         补充: Pygame是一个利用SDL库的写就的游戏库,Pygame就是Python中使用

    2024年02月09日
    浏览(12)
  • Python利用pygame实现飞机大战游戏

    Python利用pygame实现飞机大战游戏

    文章目录: 一:运行效果 1.演示 2.思路和功能 二:代码 文件架构 Demo 必备知识:python图形化编程pygame游戏模块 效果图 ◕‿◕✌✌✌ Python利用pygame实现飞机大战游戏运行演示 参考:【Python游戏】1小时开发飞机大战游戏-Pygame版本(1小时40分钟) 博主提取资源: 提取

    2024年04月09日
    浏览(18)
  • Python课程设计 飞机大战小游戏

    Python课程设计 飞机大战小游戏

    目录 飞机大战小游戏 1.概述 1.1 开发环境及技术 1.2 实现功能描述 1.2.1主要的工作内容 1.2.2 实现功能 1.2.3 功能完善 1.2.4 参考项目 2.项目介绍 2.1 项目内容介绍 2.2 项目介绍 2.2.1 项目代码逻辑 2.2.2 涉及到的知识 2.2.3 遇到的问题 2.3 最终运行效果​编辑 3.附件 3.1 Bullet。py 3.

    2024年01月17日
    浏览(45)
  • 使用Python制作的小游戏---飞机大战

    1.pygame模块 1. 熟悉Python面向对象编程的方法和套路 1.敌机模块 2. 地图模块 3. 得分模块 4 .英雄飞机模块 5. 子弹模块 6. 主模块

    2024年02月03日
    浏览(16)
  • 基于Python的飞机大战游戏的设计与实现

    基于Python的飞机大战游戏的设计与实现

    收藏关注不迷路    飞机大战是一种非常传统的电脑游戏,也是非常经典的游戏之一,经常可以在电脑,手机,以及各类便携式游戏机中见到。传统的老式飞行游戏以平面,灰白画面为主。而现在,随着计算机性能的飞速发展,我们目前可以在计算机上见到种类更加繁多的

    2024年02月04日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包