当前位置:   article > 正文

回忆童年游戏,完美利用Python制作飞机大战(爷青回~)

回忆童年游戏,完美利用Python制作飞机大战(爷青回~)

名字:阿玥的小东东

学习:python、C/C++

博客链接:阿玥的小东东的博客_CSDN博客-python&&c++高级知识,过年必备,C/C++知识讲解领域博主

目录

pygame包的安装

添加python环境变量

创建飞机大战窗口

飞机照片

将变量及函数抽取出来

添加多架敌机

本期推荐赠书

小结


今天制作一个大家肯定都玩过的游戏:飞机大战

游戏玩法:玩家操控一架飞机,开始时处于窗口的中下方位置
玩家飞机位置会随鼠标位置移动。
单击鼠标可让玩家飞机发射子弹。
屏幕上方不断出现敌方飞机并向下移动。
如果玩家的子弹打到敌方飞机,则敌方飞机被清除

pygame包的安装

  • 第一种方式:File —> Setting—> Project:工程名—>Python interpret–> 到解释器模块列表下方的+点击—>查询要安装的模块—>点击底下的 Install Package
  • 第二种方式:点击pycharm底下的terminal 打开终端,使用pip list 查看解释器的模块列表,如果有pygame就证明已将安装成功了,如果没有,就输入pip install pygame 进行安装
  • 注意:如果警告pip不是最新版本,不用管他

添加python环境变量

​不是内部或外部命令,也不是可运行的程序 或批处理文件。​​(没有在安装解释器时勾选add to path)

  • 手动添加环境变量流程:
  • 在此电脑中右键点击属性
  • 在属性中选择高级系统设置
  • 点击环境变量按钮
  • 在系统环境变量中双击 Path
  • 找到你的解释器所在的文件夹:(可以使用全局搜索找到python.exe文件)
  • 点击新建,将路径添加到环境变量中
  • 然后找到python.exe所在路径下的Script目录,继续将路径添加到环境变量中
  • 测试 python 和pip 能否正常使用(如果是在终端中执行,需要将终端重启后环境变量才会生效)

创建飞机大战窗口

再刷新窗口时,也要不断获取用户的操作信息,如果我们想要获取可以使用evnet
    获取所有的窗口事件(事件就是用户做出的操作)
    当前方法的返回值是一个列表,内部获取了所有的窗口事件(用户的点击,鼠标移动,关闭按钮的点击等)
    我们可以根据不同的事件做出不同的反馈例如QUIT 可以退出程序

  1. # 创建窗口
  2. window = pygame.display.set_mode((512, 768))
  3. # 为了让窗口不会立即关闭,而是等待我们的操作,需要循环刷新窗口
  4. while True:
  5. # 刷新窗口内容的命令
  6. pygame.display.update()
  7. # print(pygame.event.get())
  8. for event in pygame.event.get():
  9. if event.type == pygame.locals.QUIT:
  10. exit('退出游戏')

飞机照片

你自己去找去!!

将变量及函数抽取出来

# TODO: 抽取常量和变量
# 思考: 变量是统一管理更为方便还是分散管理方便?? 统一管理
# 在代码中出现的数字有没有单位,比如  apples = 5 此时显示的是重量还是个数???  不清楚
# 为了增加代码的可读性,尽量减少程序中出现的魔法数字,可以将魔法数字提取出来作为常量出现.
# 在编程中,一般不可以被修改的变量叫做常量,Python中本身是没有常量的,所以我们使用标识符大写来备注常量
# 但是这个常量可以被修改,只是提醒协同人员或调用模块的人这个是一个常量而已

  1. # 导入pygame模块
  2. import pygame
  3. import pygame.locals
  4. # 抽取常量
  5. WINDOW_WIDTH = 512 # 窗口宽度
  6. WINDOW_HEIGHT = 768 # 窗口高度
  7. # 创建全局变量
  8. background_x = 0
  9. background_y = 0
  10. # 创建窗口
  11. # window = pygame.display.set_mode((512, 768))
  12. window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
  13. # # 加载背景图片
  14. # background_img = pygame.image.load('res/img_bg_level_2.jpg')
  15. # # 将图片添加到窗口中
  16. # window.blit(background_img, (0, 0))
  17. # TODO: 抽取函数
  18. # 函数一般就是一个特定的功能,完整的功能保存到函数中进行调用即可
  19. # 移动背景图片
  20. def move_background():
  21. global background_y
  22. global background_x
  23. # 加载背景图片(自己照照片)
  24. background_img = pygame.image.load('res/img_bg_level_2.jpg')
  25. # 让背景图片进行移动
  26. window.blit(background_img, (background_x, background_y))
  27. # 添加辅助背景
  28. window.blit(background_img, (background_x, background_y - WINDOW_HEIGHT))
  29. # 循环移动
  30. if background_y >= WINDOW_HEIGHT:
  31. background_y = 0
  32. else:
  33. background_y += 1
  34. # 获取窗口事件
  35. def get_window_event():
  36. """获取所有的窗口事件,并且进行处理"""
  37. # 获取关闭窗口事件
  38. for event in pygame.event.get():
  39. if event.type == pygame.locals.QUIT:
  40. exit('退出游戏')
  41. while True:
  42. # # 让背景图片进行移动
  43. # window.blit(background_img, (background_x, background_y))
  44. # # 添加辅助背景
  45. # window.blit(background_img, (background_x, background_y - WINDOW_HEIGHT))
  46. # # 循环移动
  47. # if background_y >= WINDOW_HEIGHT:
  48. # background_y = 0
  49. # else:
  50. # background_y += 1
  51. # TODO: 调用移动背景的方法
  52. move_background()
  53. # 刷新窗口内容的命令
  54. pygame.display.update()
  55. # 获取关闭窗口事件
  56. # for event in pygame.event.get():
  57. # if event.type == pygame.locals.QUIT:
  58. # exit('退出游戏')
  59. # TODO: 调用获取事件的方法
  60. get_window_event()

添加多架敌机

    # 移动敌机
    # 为了让敌机有一个俯冲的效果,所以让敌机移动速度大于背景图片的移动速度
    # enemy_y += 2
    # 当敌机移动到屏幕之外我们就不需要再去显示他了,为了让敌机变量复用
    # 当敌机超出屏幕范围时,将敌机恢复原位(如果我们想让敌机有一个进入到屏幕的效果,
    # 我们需要将敌机的初始位置设置到屏幕外边,此时初始位置左边y值应该为负的敌机的高度)

  1. # 导入pygame模块
  2. import random
  3. import pygame
  4. import pygame.locals
  5. # 抽取常量
  6. WINDOW_WIDTH = 512 # 窗口宽度
  7. WINDOW_HEIGHT = 768 # 窗口高度
  8. ENEMY_WIDTH = 100 # 敌机宽度
  9. ENEMY_HEIGHT = 68 # 敌机高度
  10. # 创建全局变量
  11. background_x = 0
  12. background_y = 0
  13. # 创建窗口
  14. window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
  15. # TODO: 初始化敌机的函数
  16. def init_enemy_list():
  17. global enemy_list
  18. # 循环多少次就有多少架敌机
  19. for i in range(5):
  20. enemy_list.append(
  21. {'x': random.randint(0, WINDOW_WIDTH - ENEMY_WIDTH),
  22. 'y': -ENEMY_HEIGHT,
  23. 'speed': random.randint(2, 4)
  24. }
  25. )
  26. # 移动背景图片
  27. def move_background():
  28. """可以滚动显示背景图片"""
  29. # 如果想要在函数体内部修改全局变量的值,需要声明全局变量才可以
  30. global background_y
  31. global background_x
  32. # 加载背景图片
  33. background_img = pygame.image.load('res/img_bg_level_2.jpg')
  34. # 让背景图片进行移动
  35. window.blit(background_img, (background_x, background_y))
  36. # 添加辅助背景
  37. window.blit(background_img, (background_x, background_y - WINDOW_HEIGHT))
  38. # 循环移动
  39. if background_y >= WINDOW_HEIGHT:
  40. background_y = 0
  41. else:
  42. background_y += 1
  43. # 添加并移动敌机
  44. # TODO: 将每一架敌机数据组成的字典传递进来
  45. # TODO: 将所有的敌机的x,y,speed 用字典中的数据进行替换
  46. def move_enemy(enemy_dict):
  47. """添加敌机并且移动敌机的函数"""
  48. # 声明全局变量
  49. # global enemy_x
  50. # global enemy_y
  51. # global enemy_speed
  52. # 加载敌机图片
  53. # TODO: 随机加载飞机图片
  54. # 如果想要随机加载敌机图片,就对敌机的路径进行随机从plane1- plane7
  55. # 课下感兴趣的同学自己完成
  56. enemy_img = pygame.image.load('res/img-plane_1.png')
  57. # 在窗口上显示敌机
  58. window.blit(enemy_img, (enemy_dict['x'], enemy_dict['y']))
  59. if enemy_dict['y'] >= WINDOW_HEIGHT:
  60. enemy_dict['y'] = -ENEMY_HEIGHT
  61. # 每次进入屏幕时都会重置x的值
  62. enemy_dict['x'] = random.randint(0, WINDOW_WIDTH - ENEMY_WIDTH)
  63. # 每次重新进入屏幕时,重置速度值
  64. enemy_dict['speed'] = random.randint(2, 4)
  65. else:
  66. enemy_dict['y'] += enemy_dict['speed']
  67. # 思考如果每次敌机都从一个位置出现未免太过死板游戏过于简单,所以要将敌机出现的位置x坐标设置为随机值
  68. # 获取窗口事件
  69. def get_window_event():
  70. """获取所有的窗口事件,并且进行处理"""
  71. for event in pygame.event.get():
  72. # 获取关闭窗口事件
  73. if event.type == pygame.locals.QUIT:
  74. exit('退出游戏')
  75. if __name__ == '__main__':
  76. # TODO: 调用函数初始化敌机数据
  77. init_enemy_list()
  78. while True:
  79. # 调用移动背景的方法
  80. move_background()
  81. # TODO: 如果想要添加多架敌机,要么在函数中进行循环,要么执行多次添加一架敌机的方法,我们选择后者
  82. for enemy in enemy_list:
  83. move_enemy(enemy)
  84. # 刷新窗口内容的命令
  85. pygame.display.update()
  86. # 调用获取事件的方法
  87. get_window_event()


本期推荐赠书

Python从入门到精通

参与方式:点赞+关注+评论:人生苦短,我用Python!(否则无效)

截止时间:6月16日晚上20:00

《Python从入门到精通(微课精编版)》使用通俗易懂的语言、丰富的案例,详细介绍了Python语言的编程知识和应用技巧。全书共24章,内容包括Python开发环境、变量和数据类型、表达式、程序结构、序列、字典和集合、字符串、正则表达式、函数、类、模块、异常处理和程序调试、进程和线程、文件操作、数据库操作、图形界面编程、网络编程、Web编程、网络爬虫、数据处理等,还详细介绍了多个综合实战项目。其中,第24章为扩展项目在线开发,是一章纯线上内容。全书结构完整,知识点与示例相结合,并配有案例实战,可操作性强,示例源代码大都给出详细注释,读者可轻松学习,快速上手。本书采用O2O教学模式,线下与线上协同,以纸质内容为基础,同时拓展更多超值的线上内容,读者使用手机微信扫一扫即可快速阅读,拓展知识,开阔视野,获取超额实战体验。 

小结

在本章中,我们学习了Python中用来开发游戏的 pygame模块,了解了2D游戏的常见代码逻辑并演示了如何开发一个“飞机大战”游戏。在此游戏中,我们用到了之前学习过的知识,如条件判断、循环、列表、函数、模块、面向对象等,也学习了 pygame 开发时的主循环、事件响应等写法可以说是对Python基础知识的一次综合运用。
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/811888
推荐阅读
相关标签
  

闽ICP备14008679号