问题描述
在上一章的同游戏元素消除实现过程中,我们发现两次点击同一个游戏元素会造成单个元素的消除,而我们是想在两次点击同一元素时,只保存第一次点击的坐标且只算一次点击。
-MagicBlock.py
import pygame
import random
import numpy as np
TYPE_RECT = 0
TYPE_IMAGE = 1
class Block:
def __init__(self,screen,left,top,width,height,type,image=None,color=None):
self.screen = screen
self.left = left
self.top = top
self.type = type
self.image = image
self.color = color
self.width = width
self.height = height
def draw(self):
if self.type == TYPE_RECT:
position = self.left,self.top,self.width,self.height
pygame.draw.rect(self.screen,self.color,position)
elif self.type == TYPE_IMAGE:
self.screen.blit(self.image,(self.left,self.top))
class GameBlock:
def __init__(self,screen,start_left,start_top,block_height,block_width,row,col,type):
self.row = row
self.col = col
self.screen = screen
self.start_left = start_left
self.start_top = start_top
self.block_width = block_width
self.block_height = block_height
self.type = type
self.blocks=[[0]*self.col for i in range(self.row)]
self.blocks_type = np.zeros((self.row,self.col),dtype=np.int8)
self.click_num = 0
self.click_list = list()
def initMagicBlock(self):
for i in range(0,self.row,1):
for j in range(0,self.col,1):
if self.type == TYPE_IMAGE:
self.blocks_type[i][j] = random.randint(1,5)
self.blocks[i][j] = Block(self.screen,self.start_left+self.block_width*j,self.start_top+self.block_height*i,self.block_width,self.block_height,self.type,image=pygame.image.load('./image/0'+str(self.blocks_type[i][j])+"_hightlight.png"))
self.blocks[i][j].draw()
elif self.type == TYPE_RECT:
self.blocks[i][j] = Block(self.screen,self.start_left+self.block_width*j,self.start_top+self.block_height*i,self.block_width,self.block_height,self.type,color=(random.randint(0,255),random.randint(0,255),random.randint(0,255)))
self.blocks[i][j].draw()
def mouseClick(self,x,y):
i = (y-self.start_top)//self.block_height
j = (x-self.start_left)//self.block_width
if i<0 or i>self.row-1 or j<0 or j >self.col-1 or self.blocks_type[i][j] == 0:
return False
self.click_num += 1
self.click_list.append([i,j])
if self.click_num % 2 == 0:
if self.blocks_type[self.click_list[0][0]][self.click_list[0][1]] == self.blocks_type[self.click_list[1][0]][self.click_list[1][1]]:
self.blocks[self.click_list[0][0]][self.click_list[0][1]].type = TYPE_RECT
self.blocks[self.click_list[0][0]][self.click_list[0][1]].color = (255,255,255)
self.blocks[self.click_list[0][0]][self.click_list[0][1]].draw()#进行重渲染
self.blocks[self.click_list[1][0]][self.click_list[1][1]].type = TYPE_RECT
self.blocks[self.click_list[1][0]][self.click_list[1][1]].color = (255,255,255)
self.blocks[self.click_list[1][0]][self.click_list[1][1]].draw()#进行重渲染
self.click_list = list()
原因分析:
从上面的代码我们可以看到,不管是点击的是什么游戏元素我们都会进行计数和保存坐标。
解决方案:
我们可以在进行偶数计数前,进行判断该游戏元素是否为同一位置的元素,若为同一位置的元素,则不进行计数和保存坐标。
具体代码如下:
if self.click_num %2 == 1 and self.click_list[0][0] == i and self.click_list[0][1] == j:
return False
完整代码如下:
-MagicBlock.py
import pygame
import random
import numpy as np
TYPE_RECT = 0
TYPE_IMAGE = 1
class Block:
def __init__(self,screen,left,top,width,height,type,image=None,color=None):
self.screen = screen
self.left = left
self.top = top
self.type = type
self.image = image
self.color = color
self.width = width
self.height = height
def draw(self):
if self.type == TYPE_RECT:
position = self.left,self.top,self.width,self.height
pygame.draw.rect(self.screen,self.color,position)
elif self.type == TYPE_IMAGE:
self.screen.blit(self.image,(self.left,self.top))
class GameBlock:
def __init__(self,screen,start_left,start_top,block_height,block_width,row,col,type):
self.row = row
self.col = col
self.screen = screen
self.start_left = start_left
self.start_top = start_top
self.block_width = block_width
self.block_height = block_height
self.type = type
self.blocks=[[0]*self.col for i in range(self.row)]
self.blocks_type = np.zeros((self.row,self.col),dtype=np.int8)
self.click_num = 0
self.click_list = list()
def initMagicBlock(self):
for i in range(0,self.row,1):
for j in range(0,self.col,1):
if self.type == TYPE_IMAGE:
self.blocks_type[i][j] = random.randint(1,5)
self.blocks[i][j] = Block(self.screen,self.start_left+self.block_width*j,self.start_top+self.block_height*i,self.block_width,self.block_height,self.type,image=pygame.image.load('./image/0'+str(self.blocks_type[i][j])+"_hightlight.png"))
self.blocks[i][j].draw()
elif self.type == TYPE_RECT:
self.blocks[i][j] = Block(self.screen,self.start_left+self.block_width*j,self.start_top+self.block_height*i,self.block_width,self.block_height,self.type,color=(random.randint(0,255),random.randint(0,255),random.randint(0,255)))
self.blocks[i][j].draw()
def mouseClick(self,x,y):
i = (y-self.start_top)//self.block_height
j = (x-self.start_left)//self.block_width
if i<0 or i>self.row-1 or j<0 or j >self.col-1 or self.blocks_type[i][j] == 0:
return False
if self.click_num %2 == 1 and self.click_list[0][0] == i and self.click_list[0][1] == j:
return False
self.click_num += 1
self.click_list.append([i,j])
if self.click_num % 2 == 0:
if self.blocks_type[self.click_list[0][0]][self.click_list[0][1]] == self.blocks_type[self.click_list[1][0]][self.click_list[1][1]]:
self.blocks[self.click_list[0][0]][self.click_list[0][1]].type = TYPE_RECT
self.blocks[self.click_list[0][0]][self.click_list[0][1]].color = (255,255,255)
self.blocks[self.click_list[0][0]][self.click_list[0][1]].draw()#进行重渲染
self.blocks[self.click_list[1][0]][self.click_list[1][1]].type = TYPE_RECT
self.blocks[self.click_list[1][0]][self.click_list[1][1]].color = (255,255,255)
self.blocks[self.click_list[1][0]][self.click_list[1][1]].draw()#进行重渲染
self.click_list = list()
效果图: