2021.2.5 python实战——小游戏

使用Pygame模块来开发一个简单的小游戏,这是一组功能强大而有趣的模块,可用于管理图形、动画乃至声音,可以让人能够更轻松地开发复杂的游戏。通过使用Pygame来处理在屏幕上绘制图像等任务,就不用考虑众多烦琐而艰难的编码工作,而是将重点放在程序的高级逻辑上。

首先了解Pygame模块,使用Pygame编写的游戏的基本基本结构如下:

import sys

import pygame

def run_game():
    # 初始化游戏并创建一个屏幕对象
    pygame.init()
    screen = pygame.display.set_mode((1200, 800))
    pygame.display.set_caption("Alien Invasion")
    #设置背景色
    bg_color=(230,230,230)
    # 开始游戏的主循环
    while True:

        # 监视键盘和鼠标事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
        #每次循环时重绘屏幕
        screen.fill(bg_color)
         # 让最近绘制的屏幕可见
        pygame.display.flip()

run_game()

 

pygame.init()初始化背景设置,让Pygame能够正确地工作。通过调用pygame.display.set_mode()来创建一个名为screen的显示窗口,这个游戏的所有图形元素都将在其中绘制。参数‘(1200,800)’是一个元组,指定了窗口的尺寸。对象screen是一个surface。在Pygame中,surface是屏幕的一部分,用于显示游戏元素。在这个游戏中,每个元素(如外星人或飞船)都是一个surface。display.set_mode()返回的surface表示整个游戏窗口。我们激活游戏的动画循环后,每经过一次循环都将自动重绘这个surface。

为访问Pygame检测到的事件,我们使用方法pygame.event.get()。所有键盘和鼠标事件都将促使for循环运行。在for循环内我们使用if语句来检测并响应相应的事件,如上述代码中的

if event.type == pygame.QUIT:    

sys.exit()

就是点击关闭按钮时会检测到Pygame.QUIT事件,然后通过sys模块退出游戏。

调用了pygame.display.flip(),命令Pygame让最近绘制的屏幕可见。在这里,它在每次执行while循环时都绘制一个空屏幕,并擦去旧屏幕,使得只有新屏幕可见。

设置背景色bg_color,然后在循环中调用方法screen.fill(),用背景色填充屏幕;这个方法只接受一个实参:一种颜色。

如果此时运行这些代码,你将看到一个空的Pygame窗口。如下:2021.2.5 python实战——小游戏

 

 

 

 

每次给游戏添加新功能时,通常也将引入一些新设置。下面来编写一个名为settings的模块,其中包含一个名为Settings的类,用于将所有设置存储在一个地方,以免在代码中到处添加设置。先给出如下settings类用来替换上面代码里的一些参数:

class Settings():
    """存储《外星人入侵》的所有设置的类"""

    def __init__(self):
        """初始化游戏的设置"""
        # 屏幕设置
        self.screen_width = 1200
        self.screen_height = 800
        self.bg_color = (230, 230, 230)

这样的话,已有代码变为:

import sys
from settings import Settings
import pygame

def run_game():
    # 初始化游戏并创建一个屏幕对象
    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:

        # 监视键盘和鼠标事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
        #每次循环时重绘屏幕
        screen.fill(ai_settings.bg_color)
         # 让最近绘制的屏幕可见
        pygame.display.flip()

run_game()

 

 

 其次了解这个小游戏玩法上的具体细节: 在游戏《外星人入侵》中,玩家控制着一艘最初出现在屏幕底部*的飞船。玩家可以使用箭头键左右移动飞船,还可使用空格键进行射击。游戏开始时,一群外星人出现在天空中,他们在屏幕中向下移动。玩家的任务是射杀这些外星人。玩家将所有外星人都消灭干净后,将出现一群新的外星人,他们移动的速度更快。只要有外星人撞到了玩家的飞船或到达了屏幕底部,玩家就损失一艘飞船。玩家损失三艘飞船后,游戏结束。(这应该是一个项目中首先要知道的事)

根据上述描述可以知道我们需要如下模块:

名为ship的模块,其中包含Ship类,它负责管理飞船的大部分行为。

名为game_functions的新模块,它将存储大量让游戏《外星人入侵》运行的函数。

 存储Bullet类的文件bullet.py,负责管理子弹的大部分行为。

每个外星人的行为都由Alien类控制,将像创建Ship类那样创建这个类。

一个用于跟踪游戏统计信息的新类——GameStats,并将其保存为文件game_stats.py

 

----------------------------------------------------------------------------------------未完待续------------------------------------------------------------------------------------------------

ps:

相关内容摘自:《Python编程:从入门到实践》 — 〔美〕埃里克·马瑟斯

 

上一篇:三国志、英雄无敌玩腻了?没关系,我教你开发个战旗游戏玩玩


下一篇:《二十、让医生图片跟随鼠标移动》练习题答案