从这周开始Python的实践学习,首先来开发一个外星人入侵游戏,这样可以对之前的概念有更深入的理解,对交互式项目有更深入的认识
来源:《Python编程:从入门到实践》
注意:游戏《外星人入侵》将包含很多不同的文件,因此需要在系统中新建一个文件夹,并命名为
alien_invasion
。务必将这个项目的所有文件都存储在这个文件夹中,这样相关的import
语句才能正确地工作
文章目录
1 规划项目
- 开发大型项目,做好规划后再动手编写项目很重要
- 规划可确保你不偏离轨道,从而提高项目成功的可能性
在游戏《外星人入侵》中,玩家控制着一艘最初出现在屏幕底部中央的飞船。玩家可以使用箭头键左右移动飞船,还可使用空格键进行射击。游戏开始时,一群外星人出现在天空中,他们在屏幕中向下移动。玩家的任务是射杀这些外星人。玩家将所有外星人都消灭干净后,将出现一群新的外星人,他们移动的速度更快。只要有外星人撞到了玩家的飞船或到达了屏幕底部,玩家就损失一艘飞船。玩家损失三艘飞船后,游戏结束。
- 在第一个开发阶段,将创建一艘可左右移动的飞船,这艘飞船在用户按空格键时能够开火
2 安装Pygame
- 我的系统win-64bit,Python版本3.7,只要找到与版本匹配的安装程序就ok了。
如果安装Pygame遇到困难,推荐看这篇文章:python3.7 window 64bit安装pygame
3 开始游戏项目
- 首先创建一个空的Pygame窗口,供后面用来绘制游戏元素,如飞船和外星人
- 还将让这个游戏响应用户输入、设置背景色以及加载飞船图像
3.1 创建Pygame窗口以及响应用户输入
- 首先,创建一个空的Pygame窗口。使用Pygame编写的游戏的基本结构如下:
alien_invasion.py
import sys
import pygame
def run_game():
# 初始化游戏并创建一个屏幕对象
pygame.init()
screen = pygame.display.set_mode((1200, 800))
pygame.display.set_caption("Alien Invasion")
# 开始游戏的主循环
while True:
# 监视键盘和鼠标事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# 让最近绘制的屏幕可见
pygame.display.flip()
run_game()
导入模块sys和pygame
。模块pygame
包含开发游戏所需的功能;玩家退出时,将使用模块sys
来退出游戏pygame.init()
初始化背景设置,让Pygame能够正确地工作- 调用
pygame.display.set_mode()
来创建一个名为screen
的显示窗口,这个游戏的所有图形元素都将在其中绘制 - 实参(1200, 800)是一个元组,指定游戏窗口的尺寸
对象screen是一个surface
。在Pygame中,surface是屏幕的一部分,用于显示游戏元素- 在这个游戏中,每个元素(如外星人或飞船)都是一个surface
- display.set_mode()返回的surface表示整个游戏窗口
- 我们激活游戏的动画循环后,每经过一次循环都将自动重绘这个surface
- 这个游戏由一个
while循环
控制,其中包含一个事件循环以及管理屏幕更新的代码- 事件是用户玩游戏时执行的操作,如按键或移动鼠标
- 为让程序响应事件,编写一个事件循环(for循环),以侦听事件,根据发生的事件执行相应的任务
- 使用
方法pygame.event.get()
访问Pygame检测到的事件 - 在
for循环中编写一系列的if语句来检测并响应特定的事件
。例如,玩家单机游戏窗口的关闭按钮时,将检测到pygame.QUIT事件,而我们调用sys.exit()来退出游戏 - 调用
pygame.display.flip()
,命令Pygame让最近绘制的屏幕可见- 它每次执行while循环时都绘制一个空屏幕,并擦去旧屏幕,使得只有新屏幕可见
- 在移动游戏元素时,
pygame.display.flip()将不断更新屏幕, 以显示元素的新位置,并在原来的位置隐藏元素,从而营造平滑移动的效果
- 最后一行调用run_game(),这将初始化游戏并开始主循环
- 此时运行代码,将看到一个空的Pygame窗口
3.2 设置背景色
- Pygame默认创建的黑色,下面来设置另一种背景颜色:
alien_invasion.py
--snip--
def run_game():
# 初始化游戏并创建一个屏幕对象
--snip--
pygame.display.set_caption("Alien Invasion")
# 设置背景色
bg_color = (230, 230, 230)
# 开始游戏的主循环
while True:
# 监视键盘和鼠标事件
--snip--
# 每次循环时都重绘屏幕
screen.fill(bg_color)
# 让最近绘制的屏幕可见
pygame.display.flip()
run_game()
- 创建了一种背景色,将其存储在
bg_color
中 - 调用
方法screen.fill()
,用背景色填充屏幕;该方法只接受一个实参:一种颜色
3.3 创建 设置类
- 编写一个名为
settings的模块
,其中包含一个名为Settings的类,用于将所有设置存储在一个地方,以免在代码中到处添加设置
settings.py
class Settings():
"""存储该游戏的所有设置的类"""
def __init__(self):
"""初始化游戏的设置"""
# 屏幕设置
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (230, 230, 230)
- 创建Settings实例 并使用它来访问设置,下面修改alien_invasion.py:
alien_invasion.py
--snip--
from settings import Settings
def run_game():
# 初始化Pygame、设置和屏幕对象
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode(
(ai_settings.screen_width, ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion")
# 开始游戏的主循环
while True:
--snip--
# 每次循环时都重绘屏幕
screen.fill(ai_settings.bg_color)
# 让最近绘制的屏幕可见
pygame.display.flip()
run_game()
- 主程序文件中,导入
Settings类
,调用pygame.init(),再创建一个Settings实例
,将其存储在变量ai_settings
中
4 添加飞船图像
- 将飞船加入到游戏中
- 在屏幕上绘制飞船,我们将加载一副图像,再使用Pygame方法blit()绘制它
为游戏选择素材时,务必要注意许可。最安全、最不费钱的方式是使用 http://pixabay.com/ 等网站提供的图形,这些图形无需许可,可以对其进行修改
- 在
主项目文件夹(alien_invasion)
中新建一个文件夹,将其命名为images
,并将文件ship.bmp
保存到这个文件夹中- 文件ship.bmp在这本书的配套资源:ituring.cn/book/1861
4.1 创建Ship类
- 创建一个
ship模块
,其中包含Ship类
,它负责管理飞船的大部分行为
ship.py
import pygame
class Ship():
def __init__(self, screen):
"""初始化飞船并设置其初始位置"""
self.screen = screen
# 加载飞船图形并获取其外界矩形
self.image = pygame.image.load('images/ship.bmp')
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
# 将每艘新飞船放在屏幕底部中央
self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom
def blitme(self):
"""在指定位置绘制飞船"""
self.screen.blit(self.image, self.rect)
- 首先,导入
模块pygame
Ship的方法__init__()
接受两个参数:引用self
和screen
,后者指定了要将飞船绘制到什么地方- 调用
pygame.image.load()
加载图像,它返回一个表示飞船的surface,将这个surface存储到self.image
中 使用get_rect()获取相应surface的属性rect
- 使用
rect对象
时,可使用矩形四角和中心的x和y坐标。通过设置这些值可以指定矩形的位置 - 将游戏元素
居中
,可设置相应rect对象的属性center、centerx、centery
- 将游戏元素与
屏幕边缘对齐
,可使用属性top、bottom、left、right
- 调整游戏元素的
水平或垂直位置
,可使用属性x和y
,它们分别是矩形左上角的x和y坐标
注意:在Pygame中,原点(0,0)位于屏幕左上角,向右下方移动时,坐标值将增大。1200*800的屏幕,右下角的坐标就是(1200,800)
- 定义
方法blitme()
,它根据self.rect
指定的位置将飞船绘制到屏幕上
4.2 在屏幕上绘制飞船
- 更新alien_invasion.py来创建一艘飞船:
alien_invasion.py
--snip--
from ship import Ship
def run_game():
--snip--
pygame.display.set_caption("Alien Invasion")
# 创建一艘飞船
ship = Ship(screen)
# 开始游戏的主循环
while True:
--snip--
# 每次循环时都重绘屏幕
screen.fill(ai_settings.bg_color)
ship.blitme()
# 让最近绘制的屏幕可见
pygame.display.flip()
run_game()
导入Ship类
,在创建屏幕后创建一个名为ship
的Ship实例- 填充背景后,调用
ship.blitme()
绘制飞船,确保它出现在背景前面 - 现在运行alien_invasion.py,将看到飞船位于屏幕底部中央
- Python 外星人入侵游戏(一):武装飞船(下)