名字:阿玥的小东东
学习: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基础知识的一次综合运用。