赞
踩
在上一章的同游戏元素消除实现过程中,我们发现两次点击同一个游戏元素会造成单个元素的消除,而我们是想在两次点击同一元素时,只保存第一次点击的坐标且只算一次点击。
-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()
效果图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。