提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Python开心消消乐实现过程基础1
前言
前几天,用Python学会利用pygame实现图形的简单绘制,现在将面向过程的思路改成面向对象。利用两个类,Block(具体绘制小方块)和MagicBlock(控制绘制小方块)来实现对整个游戏的绘制,添加一个类,Tool(游戏工具类)来加载整个游戏的地图资源、进度条资源等。
提示:以下是本篇文章正文内容,下面案例可供参考
一、Block类
Block类包含五个参数,left、top分别表示绘制图形左上角的XY坐标,screen、blocktype表示绘制的屏幕和小方块的类型(记录下当前小方块的类型)、isUse、randomIndex表示方块是否有用、绘制图片时的随机下标,记录下图片的标号,以便后序交换小方块做铺垫。
成员函数:changeColor(),实现颜色随机。drawBlock(screen,width,height)实现绘制小方块,
其中利用if-else对小方块的类型进行判断,需要什么图形就绘制什么图形。mouseClicked(x,y)用来处理鼠标点击事件。
代码如下:
class Block:
def __init__(self, type, screen):
self.left = 0
self.top = 0
self.screen = screen
self.blockType = type
self.isUse = random.randint(0, 1)#判断方块是否有用
self.randomIndex = random.randint(0, 5) # 保存图片 为后面选择时候可以直接读取到是哪个图片
#随机颜色
def changeColor(self):
r = random.randint(0, 255)
g = random.randint(0, 255)
b = random.randint(0, 255)
return r, g, b
#绘制小方块
def drawBlock(self, screen, width, height):
rect_pos = self.left, self.top, width, height
if self.blockType == DRAW_TYPE_RECT: # 绘制矩形
pygame.draw.rect(screen, self.changeColor(), rect_pos)
elif self.blockType == DRAW_TYPE_CIRCLE and self.isUse == BLOCK_ISUSE: # 绘制圆形
pygame.draw.circle(screen, self.changeColor(), (self.left + width / 2, self.top + height / 2),
width / 2)
elif self.blockType == DRAW_TYPE_IMAGE and self.isUse == BLOCK_ISUSE: # 绘制自己的图片
screen.blit(img_list[self.randomIndex], (self.left, self.top))
#处理鼠标点击事件
def mouseClicked(self, x, y):
if (x > self.left and x < self.left + 50 and y > self.top and y < self.top + 50):
# self.screen.blit(img_list[random.randint(0, 5)], (self.left, self.top))
pygame.draw.rect(self.screen, self.changeColor(), (self.left, self.top, 50, 50))
print('这是img' + str(self.randomIndex + 1))
二、MagicBlock类
MagicBlock类表示大矩形,包含一个个小方块,包括九个参数screen_x、screen_y表示大矩形的左上角坐标,row、col表示要绘制小方块的行列,block_width、block_height表示绘制矩形的长宽,type表示类型,screen表示屏幕。
代码如下(示例):
class MagicBlock:
def __init__(self,screen_x,screen_y,row,col,block_width,block_height,type,screen):
self.startX = screen_x
self.startY = screen_y
self.row = row
self.col = col
self.screen = screen
self.blocks = [[0] * self.col for i in range(0,row)]
self.block_width = block_width
self.block_height = block_height
self.block_type = type
def initMagicblock(self):
#两层for语句给二维数组blocks赋值
for i in range(0,self.row):
for j in range(0,self.col):
self.blocks[i][j] = Block(self.block_type,self.screen)
def drawMagic(self):
for i in range(0,self.row,1):
for j in range(0,self.col,1):
self.blocks[i][j].drawBlock()
def mouseClicked(self, MouseX,MouseY):
for i in range(0,self.row):
for j in range(0,self.col):
self.blocks[i][j].mouseClicked(MouseX,MouseY)
三、Tool类
包含两个方法 初始化进度条和背景图片,drawprocess是进度条的绘制。要确保在./image文件目录下要有process和background两个图片
class Tool:
def init_resource(self,screen,processlen):
process = pygame.image.load('./image/process.png')
background = pygame.image.load('./image/background.jpg')
screen.blit(background, (0, 0))
screen.blit(process, (50, 750))
pygame.draw.rect(screen, (0, 255, 38), (63.5, 761, processlen, 31))
def drawprocess(self,screen,processlen):
pygame.draw.rect(screen, (0, 0, 0), (63.5, 761, 673, 31))
pygame.draw.rect(screen, (0, 255, 38), (63.5, 761, processlen, 31))