Python 外星人入侵游戏(一):武装飞船(上)

从这周开始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__()接受两个参数:引用selfscreen,后者指定了要将飞船绘制到什么地方
  • 调用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()
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值