Python外星人入侵游戏(二):添加设置类

今日任务:

  • 创建一个空的Pygame窗口
  • 添加设置类

1.1:创建 Pygame 窗口以及响应用户输入

alien_invasion.py

import sys
import pygame

def run_game():
    # 初始化游戏并创建一个屏幕对象
    pygame.init()
    screen = pygame.display.set_mode((1200, 800))
    pygame.display.set_caption("外星人入侵")
    # 开始游戏的主循环
    while True:
        # 监视键盘和鼠标事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
        # 让最近绘制的屏幕可见
        pygame.display.flip()

run_game()
理解注释
  • 代码行pygame.init()初始化背景设置
  • 调用pygame.display.set_mode()来创建一个名为screen的显示窗口
  • 实参(1200, 800)是一个元组,指定了游戏窗口的尺寸
  • 对象screen是一个surface。在Pygame中, surface是屏幕的一部分,用于显示游戏元素
  • 我们激活游戏的动画循环后,每经过一次循环都将自动重绘这个surface。
  • 这个游戏由一个while循环控制,其中包含一个事件循环以及管理屏幕更新的代码。
  • 为访问Pygame检测到的事件,我们使用方法pygame.event.get()
  • 玩家单击游戏窗口的关闭按钮时,将检测到pygame.QUIT事件,而我们调用sys.exit()来退出游戏
  • pygame.display.flip(),命令Pygame让最近绘制的屏幕可见,pygame.display.flip()将不断更新屏幕,以显示元 素的新位置,并在原来的位置隐藏元素,从而营造平滑移动的效果。
  • 最后一行调用run_game(),这将初始化游戏并开始主循环

1.2设置背景颜色

alien_invasion.py

--snip--
def run_game():
   --snip--
    pygame.display.set_caption("外星人入侵")
    # 设置背景颜色
    bg_color = (230, 230, 230)
    # 开始游戏的主循环
    while True:
        # 监视键盘和鼠标事件
        --snip--

        # 每次循环时都会重绘屏幕
        screen.fill(bg_color)

        # 让最近绘制的屏幕可见
        pygame.display.flip()

run_game()
理解注释
  • 我们创建了一种背景色,并将其存储在bg_color中
  • 我们调用方法screen.fill(),用背景色填充屏幕

1.3创建设置类

settings.py

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

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

alien_invasion

import sys
import pygame
from settings import Settings

def run_game():
    # 初始化游戏并创建一个屏幕对象
    pygame.init()
    pygame.display.set_caption("外星人入侵")
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    # 开始游戏的主循环
    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()
理解注释

在主程序文件中,我们导入Settings类,调用pygame.init(),再创建一个Settings实例,并将其存储在变量 ai_settings中。创建屏幕时,使用了ai_settings的属性screen_width和screen_height;接下来填充屏幕时,也使用了ai_settings来访问背景色。

知识点

  • 在 python 用 import 或者 from...import 来导入相应的模块
    将整个模块(somemodule)导入,格式为import sys
    从某个模块中导入某个函数,格式为: from setting import Settings

  • Python中单行注释以 # 开头;多行注释可以用多个 # 号,还有 ''' 和 """

  • python保留字
    ['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

  • python最具特色的就是使用缩进来表示代码块,不需要使用大括号 {}

  • 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。

  • 标准数据类型
    Python3 中有六个标准的数据类型:
    Number(数字)
    String(字符串)
    List(列表)
    Tuple(元组)
    Set(集合)
    Dictionary(字典)
    Python3 的六个标准数据类型中:
    不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
    可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。

  • 元组:元组(tuple)与列表类似,不同之处在于元组的元素不能修改。元组写在小括号 () 里,元素之间用逗号隔开。

  • 定义一个函数
    你可以定义一个由自己想要功能的函数,以下是简单的规则:
    函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
    任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
    函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
    函数内容以冒号起始,并且缩进。
    return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

  • 函数调用
    定义一个函数:给了函数一个名称,指定了函数里包含的参数,和代码块结构。
    这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从 Python 命令提示符执行。

  • 不定长参数
    你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述 2 种参数不同,声明时不会命名。基本语法如下:
    加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。

# 可写函数说明
def printinfo( arg1, *vartuple ):
   "打印任何传入的参数"
   print ("输出: ")
   print (arg1)
   print (vartuple)
 
# 调用printinfo 函数
printinfo( 70, 60, 50 )

加了两个星号 ** 的参数会以字典的形式导入

  • 模块:模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 python 标准库的方法。

  • 类对象
    类对象支持两种操作:属性引用和实例化。
    属性引用使用和 Python 中所有的属性引用一样的标准语法:obj.name。
    类对象创建后,类命名空间中所有的命名都是有效属性名。所以如果类定义是这样:

class MyClass:
    """一个简单的类实例"""
    i = 12345
    def f(self):
        return 'hello world'
 
# 实例化类
x = MyClass()
 
# 访问类的属性和方法
print("MyClass 类的属性 i 为:", x.i)
print("MyClass 类的方法 f 输出为:", x.f())

类有一个名为 init() 的特殊方法(构造方法),该方法在类实例化时会自动调用,像下面这样:

    def __init__(self):
        self.data = []

类的方法
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self, 且为第一个参数,self 代表的是类的实例,而非类。

#类定义
class people:
    #定义基本属性
    name = ''
    age = 0
    #定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0
    #定义构造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))
 
# 实例化类
p = people('runoob',10,30)
p.speak()

总结

1.函数的参数没有数据类型,没有IDE提示了
2.不用写大括号了

Python外星人入侵游戏(一)
Python外星人入侵游戏(三)

你可能感兴趣的:(Python外星人入侵游戏(二):添加设置类)