主要内容 #
-
- 游戏类中遍历整个界面函数
- 游戏类中检查有无拼图块被选中函数
- 游戏类中的交换拼图函数
1.游戏类中遍历整个界面函数 #
该模块实现的功能为:遍历整个界面,将宝石置放满整个矩形框。
该部分代码如下:
def removeMatched(self, res_match): ''' 消除匹配成功的拼图块:行或列三个一样的拼图块出现即消除 ''' if res_match[0] > 0: # 大于0说明出现行或列有三个一样的块 # self.generateNewGems(res_match) # 将res_match列表信息传给生成函数 self.score += self.reward # 匹配成功增加得分 return self.reward return 0 def dropGems(self, x, y): ''' 新的拼图块出现下落特效 ''' if not self.getGemByPos(x, y).fixed: self.getGemByPos(x, y).move() if x < NUMGRID-1: x += 1 return self.dropGems(x, y) elif y < NUMGRID-1: x = 0 y += 1 return self.dropGems(x, y) else: return self.isFull() def isFull(self): ''' 是否每个位置都有拼图块了 ''' for x in range(NUMGRID): for y in range(NUMGRID): if not self.getGemByPos(x, y).fixed: return False return True
将以上所有代码加入到游戏类代码中,作为成员函数。
接下来需要在各个模块中添加和修改代码,具体如下。
# 在gemGame类中的start()函数中找到如下代码 self.screen.fill((135, 206, 235)) self.drawGrids() # 绘出游戏网格 # 在该句代码前增加如下代码 if overall_moving: # 遍历整个游戏界面更新位置 overall_moving = not self.dropGems(0, 0) # 移动一次可能可以拼出多个3连块 if not overall_moving: res_match = self.isMatch() add_score = self.removeMatched(res_match) if add_score > 0: overall_moving = True
全部修改完之后,运行整体代码,看整体效果,可以看出宝石已经满格置放在矩形框中。
2.游戏类中检查有无拼图块被选中函数 #
我们通过鼠标来操纵拼图块,因此程序需要检查有无拼图块被选中,代码实现如下:
def checkSelected(self, position): ''' 检查有无拼图块被选中 ''' for x in range(NUMGRID): for y in range(NUMGRID): if self.getGemByPos(x, y).rect.collidepoint(*position): # 宝石与当前鼠标位置是否接触,也即是否被选中。 return [x, y] return None
3.游戏类中的交换拼图函数 #
我们需要将鼠标连续选择的拼图块进行位置交换。该函数完成的功能是交换两个宝石位置:
具体实现代码如下:
def swapGem(self, gem1_pos, gem2_pos): ''' 交换拼图函数 ''' margin = gem1_pos[0] - gem2_pos[0] + gem1_pos[1] - gem2_pos[1] if abs(margin) != 1: # 两个块位置不是相邻 return False gem1 = self.getGemByPos(*gem1_pos) gem2 = self.getGemByPos(*gem2_pos) if gem1_pos[0] - gem2_pos[0] == 1: # 宝石1在宝石2的右边,则交换时宝石1需要往左,宝石2需要往右 gem1.direction = 'left' gem2.direction = 'right' elif gem1_pos[0] - gem2_pos[0] == -1: # 宝石1在宝石2的左边,则交换时宝石1需要往右,宝石2需要往左 gem2.direction = 'left' gem1.direction = 'right' elif gem1_pos[1] - gem2_pos[1] == 1: # 宝石1在宝石2的下边,则交换时宝石1需要往上,宝石2需要往下 gem1.direction = 'up' gem2.direction = 'down' elif gem1_pos[1] - gem2_pos[1] == -1: # 宝石1在宝石2的上边,则交换时宝石1需要往下,宝石2需要往上 gem2.direction = 'up' gem1.direction = 'down' gem1.target_x = gem2.rect.left gem1.target_y = gem2.rect.top gem1.fixed = False gem2.target_x = gem1.rect.left gem2.target_y = gem1.rect.top gem2.fixed = False self.all_gems[gem2_pos[0]][gem2_pos[1]] = gem1 # 将宝石1交换到原本宝石2的位置 self.all_gems[gem1_pos[0]][gem1_pos[1]] = gem2 # 将宝石2交换到原本宝石1的位置 return True
将2部分和3部分中的所有代码加入到游戏类代码中,作为成员函数。
接下来需要在各个模块中添加和修改代码,具体如下。
# 在gemGame类中的start()函数中找到如下代码 if event.type == pygame.QUIT or (event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE): pygame.quit() sys.exit() # 在该句代码后增加如下代码 elif event.type == pygame.MOUSEBUTTONUP: if (not overall_moving) and (not individual_moving) and (not add_score): position = pygame.mouse.get_pos() # 获取当前鼠标的位置 if gem_selected_xy is None: # 没有选中 gem_selected_xy = self.checkSelected(position) else: # 选中了第一个宝石,则继续选择第二个宝石 gem_selected_xy2 = self.checkSelected(position) if gem_selected_xy2: # 选中第二个宝石 if self.swapGem(gem_selected_xy, gem_selected_xy2): # 交换两个被选中的宝石 individual_moving = True swap_again = False else: gem_selected_xy = None
# 在gemGame类中的start()函数中找到如下代码 self.screen.fill((135, 206, 235)) self.drawGrids() # 绘出游戏网格 # 在该句代码前增加如下代码 if individual_moving: # 更新特定指定的宝石位置 gem1 = self.getGemByPos(*gem_selected_xy) gem2 = self.getGemByPos(*gem_selected_xy2) gem1.move() gem2.move() if gem1.fixed and gem2.fixed: res_match = self.isMatch() if res_match[0] == 0 and not swap_again: swap_again = True self.swapGem(gem_selected_xy, gem_selected_xy2) self.sounds['mismatch'].play() # 播放匹配失败音效 else: add_score = self.removeMatched(res_match) # 增加得分 overall_moving = True individual_moving = False gem_selected_xy = None gem_selected_xy2 = None
全部修改完之后,运行整体代码,看整体效果,可以看出宝石可以交换。
小结 #
本节主要介绍了消消乐游戏中检查有无拼图块被选中函数,游戏类中的交换拼图函数和游戏类中遍历整个界面函数,并且加到游戏类中作为成员函数。