1

我正在开发一款具有宝石迷阵感觉的益智游戏。游戏开始时,棋盘上布满了三种不同颜色的随机空白方块。在某些位置,字母方块将再次取代三种不同颜色的空白方块。这些字母方块被称为稀有形状,每个都分配有一个数字。例如,“红色 A”方块被指定为 0。“蓝色 C”被指定为 6。总共有 15 (0-14) 个指定颜色/字母方块。

现在,棘手的部分。目前,当 4 个相同颜色的方块(无论方块上的字母如何)彼此相邻时,它们就像在宝石迷阵游戏中一样消失。但是,这不是我们希望它工作的方式。

对于我们的游戏,将任意数量的空白彩色方块彼此相邻并不会为棋盘清除它们。为了使“匹配”有效,它必须有两个相邻的字母方格和两个相同颜色的空白方格。

为了使事情变得更加复杂,代码需要检查它是否是有效的匹配。我已经包含了一些有效的匹配项。我觉得这需要很多 if 语句,所以一旦我知道它是如何工作的,我就可以创建其余的。有效和无效的比赛都需要从棋盘上删除,但无效的比赛将计入玩家。

有效匹配:

2 blank red squares + 1 "Red C" (assigned to rareshapes[1]) + 1 "Red G" (assigned to rareshapes[2])

2 blank blue squares + 1 "blue A" (assigned to rareshapes[5]) + 1 "Blue T " (assigned to rareshapes[8])

2 blank Yellow squares + 1 "Yellow A" (assigned to rareshapes[10]) + 1 "Yellow U" (assigned to rareshapes[14])

无效匹配:

2 blank red squares + 1 "Red C" (assigned to rareshapes[1]) + 1 "Red T" (assigned to rareshapes[3])

我尝试了一些更改,但我对编程和 python 还很陌生。我很难让它工作。我在 python 中找到了一个 Bejeweled 游戏的惊人示例。它使用intertools.groupby和其他元素来检查匹配项,我不知道如何修改密钥以使其工作。尝试了一些 if 语句并更改了密钥本身,它要么给我一个错误,要么在循环中清除板上的所有内容。

有人可以提供一些带有上述有效匹配项之一的代码示例,以便我了解如何执行此操作。我已经发布了图像加载代码(以防需要)以及 find_matches 代码。

图片加载:

    self.image_color = {}
    self.shapes = []
    self.rareshapes = []

    colors = 'red blue yellow'
    letters = 'acgtu'

    for c in colors.split():
        im = pygame.image.load('images/{}.png'.format(c))
        self.shapes.append(im)
        self.image_color[im] = c
        for l in letters:
            im = pygame.image.load('rareimages/{}{}.png'.format(c, l))
            self.rareshapes.append(im)
            self.image_color[im] = l

查找匹配代码:

def find_matches(self):
    """
    Search for matches (lines of cells with identical images) and
    return a list of them, each match being represented as a list
    of board positions.
    """
    def lines():
        for j in range(self.h):
            yield range(j * self.w, (j + 1) * self.w)
        for i in range(self.w):
            yield range(i, self.size, self.w)
    def key(i):  
        return self.image_color.get(self.board[i].image)
    def matches():
        for line in lines():
            for _, group in itertools.groupby(line, key):
                match = list(group)
                if len(match) >= MINIMUM_MATCH:
                    yield match
                    if self.strikes <= 2:
                        self.strikes = self.strikes + 1
    return list(matches())

处理罢工的代码位于“占位符”位置,这样我就可以确保它正常工作。如果发生无效比赛,则罢工计数将增加,而不是像现在这样的每场比赛。

4

0 回答 0