跳至正文
View Categories

2 min read

主要内容 #

    1. 游戏类reset函数模块
    2. 游戏类主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模块的结构。