用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 可以退出程序

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

    飞机照片

    你自己去找去!!

    将变量及函数抽取出来

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

    # 导入pygame模块
    import pygame
    import pygame.locals
    
    
    # 抽取常量
    WINDOW_WIDTH = 512  # 窗口宽度
    WINDOW_HEIGHT = 768  # 窗口高度
    
    # 创建全局变量
    background_x = 0
    background_y = 0
    
    # 创建窗口
    # window = pygame.display.set_mode((512, 768))
    window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
    
    # # 加载背景图片
    # background_img = pygame.image.load('res/img_bg_level_2.jpg')
    # # 将图片添加到窗口中
    # window.blit(background_img, (0, 0))
    
    # TODO: 抽取函数
    # 函数一般就是一个特定的功能,完整的功能保存到函数中进行调用即可
    
    # 移动背景图片
    def move_background():
     
        global background_y
        global background_x
    
        # 加载背景图片(自己照照片)
        background_img = pygame.image.load('res/img_bg_level_2.jpg')
    
        # 让背景图片进行移动
        window.blit(background_img, (background_x, background_y))
        # 添加辅助背景
        window.blit(background_img, (background_x, background_y - WINDOW_HEIGHT))
        # 循环移动
        if background_y >= WINDOW_HEIGHT:
            background_y = 0
        else:
            background_y += 1
    
    # 获取窗口事件
    def get_window_event():
        """获取所有的窗口事件,并且进行处理"""
        # 获取关闭窗口事件
        for event in pygame.event.get():
            if event.type == pygame.locals.QUIT:
                exit('退出游戏')
    
    
    while True:
        # # 让背景图片进行移动
        # window.blit(background_img, (background_x, background_y))
        # # 添加辅助背景
        # window.blit(background_img, (background_x, background_y - WINDOW_HEIGHT))
        # # 循环移动
        # if background_y >= WINDOW_HEIGHT:
        #     background_y = 0
        # else:
        #     background_y += 1
        # TODO: 调用移动背景的方法
        move_background()
    
        # 刷新窗口内容的命令
        pygame.display.update()
        # 获取关闭窗口事件
        # for event in pygame.event.get():
        #     if event.type == pygame.locals.QUIT:
        #         exit('退出游戏')
        # TODO: 调用获取事件的方法
        get_window_event()
    

    添加多架敌机

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

    # 导入pygame模块
    import random
    
    import pygame
    import pygame.locals
    
    # 抽取常量
    WINDOW_WIDTH = 512  # 窗口宽度
    WINDOW_HEIGHT = 768  # 窗口高度
    
    ENEMY_WIDTH = 100  # 敌机宽度
    ENEMY_HEIGHT = 68  # 敌机高度
    
    # 创建全局变量
    background_x = 0
    background_y = 0
    
    
    
    # 创建窗口
    window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
    
    
    # TODO: 初始化敌机的函数
    def init_enemy_list():
        global enemy_list
        # 循环多少次就有多少架敌机
        for i in range(5):
            enemy_list.append(
                {'x': random.randint(0, WINDOW_WIDTH - ENEMY_WIDTH),
                 'y': -ENEMY_HEIGHT,
                 'speed': random.randint(2, 4)
                 }
            )
    
    
    # 移动背景图片
    def move_background():
        """可以滚动显示背景图片"""
        # 如果想要在函数体内部修改全局变量的值,需要声明全局变量才可以
        global background_y
        global background_x
    
        # 加载背景图片
        background_img = pygame.image.load('res/img_bg_level_2.jpg')
        # 让背景图片进行移动
        window.blit(background_img, (background_x, background_y))
        # 添加辅助背景
        window.blit(background_img, (background_x, background_y - WINDOW_HEIGHT))
        # 循环移动
        if background_y >= WINDOW_HEIGHT:
            background_y = 0
        else:
            background_y += 1
    
    
    # 添加并移动敌机
    # TODO: 将每一架敌机数据组成的字典传递进来
    # TODO: 将所有的敌机的x,y,speed 用字典中的数据进行替换
    def move_enemy(enemy_dict):
        """添加敌机并且移动敌机的函数"""
        # 声明全局变量
        # global enemy_x
        # global enemy_y
        # global enemy_speed
        # 加载敌机图片
        # TODO: 随机加载飞机图片
        # 如果想要随机加载敌机图片,就对敌机的路径进行随机从plane1- plane7
        # 课下感兴趣的同学自己完成
        enemy_img = pygame.image.load('res/img-plane_1.png')
        # 在窗口上显示敌机
        window.blit(enemy_img, (enemy_dict['x'], enemy_dict['y']))
    
        if enemy_dict['y'] >= WINDOW_HEIGHT:
            enemy_dict['y'] = -ENEMY_HEIGHT
            # 每次进入屏幕时都会重置x的值
            enemy_dict['x'] = random.randint(0, WINDOW_WIDTH - ENEMY_WIDTH)
            # 每次重新进入屏幕时,重置速度值
            enemy_dict['speed'] = random.randint(2, 4)
        else:
            enemy_dict['y'] += enemy_dict['speed']
        # 思考如果每次敌机都从一个位置出现未免太过死板游戏过于简单,所以要将敌机出现的位置x坐标设置为随机值
    
    
    # 获取窗口事件
    def get_window_event():
        """获取所有的窗口事件,并且进行处理"""
        for event in pygame.event.get():
            # 获取关闭窗口事件
            if event.type == pygame.locals.QUIT:
                exit('退出游戏')
    
    
    if __name__ == '__main__':
        # TODO: 调用函数初始化敌机数据
        init_enemy_list()
        while True:
            # 调用移动背景的方法
            move_background()
            # TODO: 如果想要添加多架敌机,要么在函数中进行循环,要么执行多次添加一架敌机的方法,我们选择后者
            for enemy in enemy_list:
                move_enemy(enemy)
            # 刷新窗口内容的命令
            pygame.display.update()
            # 调用获取事件的方法
            get_window_event()
    

    本期推荐赠书

    Python从入门到精通

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

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

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

    小结

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

    物联沃分享整理
    物联沃-IOTWORD物联网 » 用Python制作飞机大战游戏,重温童年经典

    发表评论