python小游戏开心消消乐制作3-矩阵游戏元素绘制


前言

上篇文章中我们解决了游戏窗口关闭问题和矩型元素的显示,在这篇文章中我们将解决消消乐(或者说是连连看)的所有元素显示的问题。


一、所有元素显示

1. 元素显示

假设我们的消消乐一共有8*8个元素,那么我们可以使用两层for循环即可显示出所有元素。为了让for循环8次,我们可以使用for i in range(8)
range()是Python中的一个内置函数,它会返回一个可迭代对象,用于生成指定范围内的整数序列。语法如下:range(start, stop[, step]),其中start表示序列的起始值(默认为0),stop表示序列的终止值(返回的对象中不包括该值),step表示序列的步长(默认为1)。
代码如下:

for i in range(8):
    for j in range(8):
        pygame.draw.rect(screen,(255,255,255),(20+20*j,20+20*i,50,50))

完整代码如下:

import pygame
import sys
import time

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

if __name__ == '__main__':
    pygame.init()
    screen = pygame.display.set_mode((SCREEN_HEIGHT,SCREEN_WIDTH))
    pygame.display.set_caption("happy remove")
    screen.fill((124,114,242))
    for i in range(8):
        for j in range(8):
        	#位置的计算公式为left = 起始left位置+元素宽度*j,top=起始top位置+元素高度*i
            pygame.draw.rect(screen,(255,255,255),(20+50*j,20+50*i,50,50))
    #更新窗口
    pygame.display.update()
    while True:
        #获取鼠标响应
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit(0)
        pygame.display.update()
        time.sleep(0.3)
    

这样我们就可以获得8*8的矩阵元素了,效果如下:
在这里插入图片描述

2.颜色随机替换

由上面效果图我们看到,所有元素的颜色值都是一样的无法区分每个矩形元素,故而我们可以使用random库对矩形的颜色进行随机替换。由于random库是系统自带的,故而我们直接引入既可。

import random

为了获得从0-255的随机颜色值,我们可以使用random.randint()来获得0-255的随机值。
random.randint()方法返回指定范围内的整数。语法如下:random.randint(start, stop),start和stop分别代表开始值和结束值,random会返回包含开始值和结束值范围内的随机整数。
随机颜色矩形元素绘制代码如下:

pygame.draw.rect(screen,(random.randint(0,255),random.randint(0,255),random.randint(0,255)),(20+50*j,20+50*i,50,50))

完整代码如下:

import pygame
import sys
import time
import random

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

if __name__ == '__main__':
    pygame.init()
    screen = pygame.display.set_mode((SCREEN_HEIGHT,SCREEN_WIDTH))
    pygame.display.set_caption("happy remove")
    screen.fill((124,114,242))
    for i in range(8):
        for j in range(8):
        	#位置的计算公式为left = 起始left位置+元素宽度*j,top=起始top位置+元素高度*i
            pygame.draw.rect(screen,(random.randint(0,255),random.randint(0,255),random.randint(0,255)),(20+50*j,20+50*i,50,50))
    #更新窗口
    pygame.display.update()
    while True:
        #获取鼠标响应
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit(0)
        pygame.display.update()
        time.sleep(0.3)

效果图如下:
在这里插入图片描述

二、矩形元素绘制封装成类

在后续的开发过程中,类的封装可以使得主文件中的代码更加清晰明了,结构清晰,调用方便,可以支持中大型开发,故而我们先将单个矩形元素的绘制封装成类,使得其可以更好地被其他模块调用。
因而,我们将矩形元素绘制的类放在单独文件MagicBlock.py中,主文件main.py用于程序的主要入口。文件目录结构如下:

-game #主文件夹
	-main.py #程序运行主入口
	-MagicBlock.py #用于存放矩形元素绘制类

1.单个矩形元素绘制类

类的声明可以使用class关键字,每个类中有__init__()函数进行默认初始化,即当调用类时都会自动运行的函数。
我们已经知道了单个矩形元素的绘制需要窗口对象,起始位置(left,top),长宽和颜色值,故而我们可以将其作为私有变量,在调用的时候初始化赋给他们。
我们先声明一个Block类。

class Block:
	def __init__(self):
		pass

我们可以看到这样就声明一个类叫Block。

其次,我们在初始化函数中将元素绘制所需的变量进行赋值。

class Block:
	def __init__(self,screen,left,top,width,height,color):
		self.screen = screen
		self.left = left
		self.top = top
		self.color = color
		self.width = width
		self.height = height

到这里我们就完成了变量的赋值。
在面向对象编程中,我们将世界上的每个具有相同性质和行为的实体抽象为一个类,所以每个类呢都有自身的属性和行为。而我们知道一个矩形元素类还有一个行为那就是绘制到屏幕的行为,故而我们需要定义一个函数来描述这个行为,以便其他的对象可以调用这个行为。

import pygame#使用到了pygame需要提前引入
class Block:
	def __init__(self,screen,left,top,width,height,color):
		self.screen = screen
		self.left = left
		self.top = top
		self.color = color
		self.width = width
		self.height = height
	def draw(self):
		position = self.left,self.top,self.width,self.height
		pygame.draw.rect(self.screen,self.color,position)

这样我们就完成了对单个矩形元素绘制的封装。我们在主文件main.py中导入该类,并调用该类的绘制行为。
导入Block类:

from MagicBlock import Block

我们可以将8*8矩形元素绘制成一个矩阵对象的形式进行存储,在python中可以使用列表推导式的语法糖来初始化一个二维矩阵8*8的矩阵[[0]*8 for i in range(8)]
列表推导式是一种创建列表的简洁方法。
[[0]*8 for i in range(8)]其实就是相当于

x = []
for i in range(8):
	x.append([0]*8)

初始化并调用Block绘制函数:

blocks=[[0]*8 for i in range(8)]
for i in range(8):
        for j in range(8):
            blocks[i][j] = Block(screen,20+50*j,20+50*i,50,50,(random.randint(0,255),random.randint(0,255),random.randint(0,255)))
            blocks[i][j].draw()

完整代码如下:

-main.py
import pygame
import sys
import time
import random
from MagicBlock import Block

SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

if __name__ == '__main__':
    pygame.init()
    screen = pygame.display.set_mode((SCREEN_HEIGHT,SCREEN_WIDTH))
    pygame.display.set_caption("happy remove")
    screen.fill((124,114,242))
        	
	blocks=[[0]*8 for i in range(8)]
	for i in range(8):
        for j in range(8):
        	#位置的计算公式为left = 起始left位置+元素宽度*j,top=起始top位置+元素高度*i
            blocks[i][j] = Block(screen,20+50*j,20+50*i,50,50,(random.randint(0,255),random.randint(0,255),random.randint(0,255)))
            blocks[i][j].draw()
    #更新窗口
    pygame.display.update()
    while True:
        #获取鼠标响应
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit(0)
        pygame.display.update()
        time.sleep(0.3)
-MagicBlock.py
import pygame
class Block:
	def __init__(self,screen,left,top,width,height,color):
		self.screen = screen
		self.left = left
		self.top = top
		self.color = color
		self.width = width
		self.height = height
	def draw(self):
		position = self.left,self.top,self.width,self.height
		pygame.draw.rect(self.screen,self.color,position)

效果图如下:
在这里插入图片描述


总结

本篇文章中解决了消消乐中所有元素显示问题和类封装办法,但我们知道消消乐需要通过点击来消除相对应的矩形元素,故而下一章将介绍怎么通过点击事件消除相对应的矩形元素。

  • 61
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪蜀黍客栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值