《Python编程:从入门到实践》练习13-1、13-2

练习 13-1:星星 ——找一副星星图像,并在屏幕上显示一系列整齐排列的星星。

1.starsky.py

import pygame
import sys
from random import randint
from star import Star


class StarSky:
    def __init__(self):
        """ 初始化 """
        pygame.init()

        # 创建一个显示窗口,并设置窗口尺寸
        self.screen = pygame.display.set_mode((1500, 800))
        # # 设置背景色
        self.bg_color = (20, 20, 20)

        self.stars = pygame.sprite.Group()
        self._create_starry()

        pygame.display.set_caption("Star Sky")

    def _create_starry(self):
        """ 创建星群 """
        # 创建一个星星并计算一行可容纳多少个星星
        star = Star(self)
        star_width, star_height = star.rect.size
        # 屏幕x方向左右各预留一个星星宽度
        availiable_space_x = self.screen.get_rect().width - (2 * star_width)
        # 星星的间距为星星宽度的3倍
        number_stars_x = availiable_space_x // (4 * star_width) + 1

        # 计算屏幕可容纳多少行星星
        # 屏幕y方向上下各预留一个星星宽度
        availiable_space_y = self.screen.get_rect().height - (2 * star_height)
        # 星星的间距为星星高度的3倍
        number_rows = availiable_space_y // (4 * star_height) + 1

        # 创建星群
        for row_number in range(number_rows):
            for star_number in range(number_stars_x):
                self._create_star(star_number, row_number)

    def _create_star(self, star_number, row_number):
        # 创建一个星星并将其加入到当前行
        star = Star(self)
        star_width, star_height = star.rect.size
        star.rect.x = star_width + 4 * star_width * star_number
        star.rect.y = star_height + 4 * star_height * row_number
        self.stars.add(star)

    def starry(self):
        """ 开始星空展示 """
        while True:
            # 屏幕展示
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()

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

            self.stars.draw(self.screen)

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


if __name__ == '__main__':
    # 创建实例并运行
    sky = StarSky()
    sky.starry()

2.star.py

import pygame
from pygame.sprite import Sprite


class Star(Sprite):
    """ 表示单个星星的类 """

    def __init__(self, ai_game):
        """ 初始化星星并设置其起始位置 """
        super().__init__()
        self.screen = ai_game.screen

        # 加载星星图像并设置其rect属性
        self.image = pygame.image.load('images/stars.bmp')
        self.rect = self.image.get_rect()

        # 每个星星最初都在屏幕左上角附近
        self.rect.x = self.rect.width
        self.rect.y = self.rect.height

        # 存储星星精确水平位置
        self.x = float(self.rect.x)

运行效果如下:

《Python编程:从入门到实践》练习13-1、13-2_第1张图片  

练习 13-2:更逼真的星星 ——为让星星的分布更逼真,可随机地放置星星。在为完成练习 13-1而编写的程序中,随机地调整每颗星星的位置。

随机位置要用到随机函数:

from random import randint
random_number = randint(-10, 10)

在这里随机数可以应用于尺寸x、y坐标的生成

1.starsky.py  将函数_create_starry()与_create_star()进行一些修改

import pygame
import sys
from random import randint
from star import Star


class StarSky:
    def __init__(self):
        """ 初始化 """
        pygame.init()

        # 创建一个显示窗口,并设置窗口尺寸
        self.screen = pygame.display.set_mode((1500, 800))
        # # 设置背景色
        self.bg_color = (20, 20, 20)

        self.stars = pygame.sprite.Group()
        self._create_starry()

        pygame.display.set_caption("Star Sky")

    def _create_starry(self):
        """ 创建星群 """
        # 创建一个星星并计算一行可容纳多少个星星
        star = Star(self)
        star_width, star_height = star.rect.size
        # 屏幕x方向左右各预留一个星星宽度
        self.availiable_space_x = self.screen.get_rect().width - (2 * star_width)
        # 星星的间距为星星宽度的3倍
        number_stars_x = self.availiable_space_x // (4 * star_width) + 1

        # 计算屏幕可容纳多少行星星
        # 屏幕y方向上下各预留一个星星宽度
        self.availiable_space_y = self.screen.get_rect().height - (2 * star_height)
        # 星星的间距为星星高度的3倍
        number_rows = self.availiable_space_y // (4 * star_height) + 1

        # 创建星群
        for row_number in range(number_rows):
            for star_number in range(number_stars_x):
                self._create_star(star_number, row_number)

    def _create_star(self, star_number, row_number):
        # 创建一个星星并将其加入到当前行
        star = Star(self)
        star.rect.x = randint(0, self.availiable_space_x)
        star.rect.y = randint(0, self.availiable_space_y)
        self.stars.add(star)

    def starry(self):
        """ 开始星空展示 """
        while True:
            # 屏幕展示
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()

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

            self.stars.draw(self.screen)

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


if __name__ == '__main__':
    # 创建实例并运行
    sky = StarSky()
    sky.starry()

2.star.py不需要改动

运行效果如下:

《Python编程:从入门到实践》练习13-1、13-2_第2张图片

你可能感兴趣的:(python)