在看了上一期节目后,对黑白迭代这个项目的游戏产生了兴趣,也想自己玩玩,奈何没有渠道可以找到这个游戏,于是便自己尝试写了一个关于这个游戏的小程序。
一、游戏的基础设置
因为这个游戏的核心是方块,所以首先是给这个游戏一些基础的设定:背景和方块的大小,颜色等:
Settings.py
class Settings():
""" 存储《黑白迭代》的所有设置的类 """
def __init__(self):
""" 初始化游戏的设置 """
# 屏幕设置
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (230, 230, 230)
# 白色方块设置
self.white_square_width = 80
self.white_square_height = 80
self.white_square_color = 255, 255, 255
二、方块类
接下来就是创建游戏的核心方块,通过精灵(Sprite)建立一个class white_square类,里面包含了这个一个方块的起始位置,颜色等。通过draw_square方法来画出方块。
square.py
import pygame
from pygame.sprite import Sprite
class white_square(Sprite):
""" 表示单个白色方块的类 """
def __init__(self,si_settings, screen):
""" 初始化白色方块并设置其初始位置 """
super(white_square, self).__init__()
self.screen = screen
# 在(0,0)处创建一个表示白色方块的矩形,再设置正确的位置
self.rect = pygame.Rect(0, 0, si_settings.white_square_width,
si_settings.white_square_height)
# self.rect.x = (si_settings.screen_width - 8*si_settings.white_square_width)/2
# self.rect.y = (si_settings.screen_height - 8*si_settings.white_square_height)/2
self.rect.x = 280
self.rect.y = 80
# 存储白色方块的准确位置
self.x = float(self.rect.x)
self.color = si_settings.white_square_color
def draw_square(self):
""" 在屏幕上绘制白色方块 """
pygame.draw.rect(self.screen, self.color, self.rect)
三、游戏中事件发生的函数
紧接着需要创建游戏的核心玩法。
- check_event:检测游戏过程中发生的事件,并且调用相应的函数;
- create_square:为游戏界面创建一行白色方块;
- create_fleet:创建白色方块群(8*8);
- change_color:将方块的颜色变为相反颜色(白->黑;黑->白);
- extend_mouse:当你点击一个白色方块时,将鼠标点击的范围扩大为其相邻方块的范围;
- check_button:检测单击了哪个方块;
- updata_screen:更新每次事件发生后,屏幕显示的方块群。
game_function.py
import sys
import pygame
from pygame.sprite import Group
from square import white_square
def check_events(white_squares):
""" 响应按键和鼠标事件 """
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
mouse_x, mouse_y = pygame.mouse.get_pos()
check_button(white_squares, mouse_x, mouse_y)
def create_square(si_settings, screen, white_squares, square_number, row_number):
""" 创建一个白色方块并将其加入当前行 """
square = white_square(si_settings, screen)
square_width = square.rect.width
square.x = 280 + (square_width + 1) * square_number # 白色方块间距为 1
square.rect.x = square.x
square.rect.y = 80 + (square.rect.height + 1) * row_number
white_squares.add(square)
def create_fleet(si_settings, screen, white_squares):
""" 创建 8*8 的白色方块群 """
number_squares = 8
number_rows = 8
# 创建白色方块群
for row_number in range(number_rows):
for square_number in range(number_squares):
create_square(si_settings, screen, white_squares,
square_number, row_number)
def change_color(square):
""" 将方块自身以及其附近的方块变为相反颜色的方块 """
if square.color == (255, 255, 255):
square.color = 0, 0, 0
elif square.color == (0, 0, 0):
square.color = 255, 255, 255
def extend_mouse(mouse_x, mouse_y):
""" 扩展鼠标单击的位置 """
mouse = [(mouse_x, mouse_y - 81), (mouse_x - 81, mouse_y),
(mouse_x, mouse_y),
(mouse_x, mouse_y + 81), (mouse_x + 81, mouse_y)]
return mouse
def check_button(white_squares, mouse_x, mouse_y):
""" 检查单击了哪个方块及其相邻方块 """
mouse = extend_mouse(mouse_x, mouse_y)
for pos in mouse:
for square in white_squares:
if square.rect.collidepoint(pos[0], pos[1]):
change_color(square)
break
def updata_screen(si_settings, screen, white_squares):
""" 更新屏幕上的图像,并切换到新屏幕 """
# 每次循环时都重绘屏幕
screen.fill(si_settings.bg_color)
# 绘制编组中的每个方块
for square in white_squares.sprites():
square.draw_square()
# 让最近绘制的屏幕可见
pygame.display.flip()
四、游戏运行的主函数
import pygame
from pygame.sprite import Group
from settings import Settings
import game_function as gf
def run_game():
# 初始化游戏并创建一个屏幕对象
pygame.init()
si_settings = Settings()
screen = pygame.display.set_mode((si_settings.screen_width,
si_settings.screen_height))
pygame.display.set_caption("Black and White Iteration")
# 创建白色方块编组
white_squares = Group()
# 创建白色方块群
gf.create_fleet(si_settings, screen, white_squares)
# 开始游戏的主循环
while True:
gf.check_events(white_squares)
gf.updata_screen(si_settings, screen, white_squares)
run_game()
游戏的运行后的一些效果图片
初始界面:
单击其中一个方块后的图片:
节目中的第一题:
!!!转载请注明出处!!!