回忆童年游戏,完美利用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基础知识的一次综合运用。
 

你可能感兴趣的:(pygame,python)