主要内容 #
-
- 游戏类reset函数模块
- 游戏类主start函数模块
1.游戏类reset函数模块 #
该模块实现的功能为:随机生成各个块(即初始化游戏地图各个元素)。
该部分代码如下:
def isMatch(self): ''' 有无行列三个拼图块相同判断:是否有连续一样的三个块(无--返回0/水平--返回1/竖直--返回2) ''' for x in range(NUMGRID): for y in range(NUMGRID): if x + 2 < NUMGRID: if self.getGemByPos(x, y).type == self.getGemByPos(x+1, y).type == self.getGemByPos(x+2, y).type: # 水平方向三个连续相同块 return [1, x, y] if y + 2 < NUMGRID: if self.getGemByPos(x, y).type == self.getGemByPos(x, y+1).type == self.getGemByPos(x, y+2).type: # 竖直方向三个连续相同块 return [2, x, y] return [0, x, y] def getGemByPos(self, x, y): ''' 根据坐标获取对应位置的拼图对象 ''' return self.all_gems[x][y] def reset(self): ''' 随机生成各个块(即初始化游戏地图各个元素) ''' while True: self.all_gems = [] self.gems_group = pygame.sprite.Group() # 用到sprite模块的Group()函数方法 for x in range(NUMGRID): self.all_gems.append([]) for y in range(NUMGRID): gem = gemSprite(img_path=random.choice(self.gem_imgs), size=(GRIDSIZE, GRIDSIZE), position=[XMARGIN+x*GRIDSIZE, YMARGIN+y*GRIDSIZE-NUMGRID*GRIDSIZE], downlen=NUMGRID*GRIDSIZE) # 每个gem就是每个宝石 self.all_gems[x].append(gem) self.gems_group.add(gem) if self.isMatch()[0] == 0: break # 得分 self.score = 0 # 拼出一个的奖励 self.reward = 10 # 时间 self.remaining_time = 300
将以上所有代码加入到游戏类代码中,作为成员函数。
接下来需要在各个模块中添加和修改代码,具体如下。
# 在gemGame类中的__init__()函数的最后添加如下代码| self.reset() # 在main()函数的最后一行的代码打开 game.reset() # 后续打开该函数
全部修改完之后,运行整体代码,看整体效果,这里无宝石是因为这个只是后台生成了宝石类,还未刷新到界面上。
2.游戏类主start函数模块 #
实现游戏主循环逻辑其实很简单,就是不断检测是否有鼠标点击事件发生,如果有,则判断鼠标点击时的位置是否在某拼图块的位置区域内,若在,则选中该拼图块,否则不选中。
当有第二块拼图块被选中时,则判断两个拼图块是否满足拼图交换的条件,若满足,则交换拼图块,并获得奖励,否则不交换并取消选这两个拼图块的选中状态。
代码如下所示:
def start(self): ''' 开始游戏函数:游戏开始主循环 ''' clock = pygame.time.Clock() # 遍历整个游戏界面更新位置 overall_moving = True # 指定某些对象个体更新位置 individual_moving = False # 定义一些必要的变量 gem_selected_xy = None gem_selected_xy2 = None swap_again = False add_score = 0 add_score_showtimes = 10 time_pre = int(time.time()) # 游戏主循环 while True: for event in pygame.event.get(): if event.type == pygame.QUIT or (event.type == pygame.KEYUP and event.key == pygame.K_ESCAPE): pygame.quit() sys.exit() self.screen.fill((135, 206, 235)) self.gems_group.draw(self.screen) if add_score: if add_score_showtimes == 10: random.choice(self.sounds['match']).play() # 随机选中匹配成功的音效 add_score_showtimes -= 1 if add_score_showtimes < 1: add_score_showtimes = 10 add_score = 0 self.remaining_time -= (int(time.time()) - time_pre) # 剩余时间 time_pre = int(time.time()) if self.remaining_time <= 0: # 时间结束,返回得分 return self.score pygame.display.update() clock.tick(FPS)
将以上所有代码加入到上一课创建的项目文件中(该代码请置放在游戏类中,作为成员函数)。
接下来需要在各个模块中添加和修改代码,具体如下。
# 在main()函数找到如下代码 score = 0 # score = game.start() # 后续打开该函数 # 将如上两行代码修改为如下 # score = 0 score = game.start() # 后续打开该函数
全部修改完之后,运行整体代码,看整体效果。
小结 #
- 本节主要介绍了消消乐游戏的随机生成模块和主循环start模块的结构。