3

我正在设计一款带有转折的宝石风格游戏。与其尝试匹配所有相同形状的块,不如尝试匹配一对字母。黑板上总是有大约 10 个字母,而你正试图将它们放在一起。共有三种不同的色块。每种颜色有 1 个空白块,然后是 5 个不同字母的块。目标是在红色“A”块旁边说一个红色“T”块。这是我遇到问题的地方。

现在,代码将从板上清除三个或更多相同颜色和字母。所以,如果我能得到三个相邻的红色“T”块,它们就会清除。该代码基本上扫描每一行以寻找一组三个(或更多)。我试图修改代码,以便它甚至可以清除相同的颜色(无论字母组合如何),但我什至无法让它工作。我认为这与我如何加载图像有关。我已经发布了大部分处理加载图像和查找匹配的代码(没有任何疯狂的修改来尝试让它工作,因为它刚刚破坏了它)。任何人都可以帮我修改代码,以便它至少可以找到一个正确的匹配项。当一个红色的“T”块紧挨着一个红色的“A”块和一个空白的红色块时,它应该被归类为匹配并从棋盘上移除。只要它有效,它就不需要那么复杂。谢谢你的帮助!

查找匹配代码:

def find_matches(self):
    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.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
    return list(matches())

图片加载:

    shapes = 'red blue yellow'
    rareshapes = 'reda redc redg redt redu bluea bluec blueg bluet blueu yellowa yellowc yellowg yellowt yellowu'
    self.shapes = [pygame.image.load('images/{}.png'.format(shape))
                   for shape in shapes.split()]
    self.rareshapes = [pygame.image.load('rareimages/{}.png'.format(shape))
                       for shape in rareshapes.split()]

编辑:

自从这篇文章以来,游戏发生了很多变化和更新。它有声音和背景音乐,新计分系统的基础,新的计时器系统,我可以指定我想在游戏第一次开始时出现在网格上特定位置的稀有形状。但是,我仍然对核心游戏玩法有疑问。我讨厌拖更旧的帖子,但我不知道如何让它发挥作用。我弄乱了处理匹配的代码,但没有运气。

基本上,稀有形状被分配了数字。所以,红色的 A 是 0,红色的 T 是 3,一直到黄色的 T 是 14。为了让游戏按照我们想要的方式工作,用户需要得到一个红色的 A (0),一个红色 T(3) 和 2 个相邻的空白红色方块,使其成为有效匹配并从板上清除。这是您可以从棋盘上清除方块的唯一正确方法。将 4 个相同颜色的空白方块彼此相邻并不会删除它们。

但是,代码还需要检测它们是否也得到了无效的对。例如,如果他们得到一个红色的 A(0)、一个红色的 C(1) 和两个空白的红色方块,它会消失但算作对他们的打击。

游戏的目标是在时间用完之前消除所有字母块,而不会获得三击。由于我们可以指定现在出现的字母块的数量和位置,所以它归结为匹配。有人知道如何进行这项工作吗?

4

1 回答 1

1

我正在阅读您发布的代码,我对自己说,这看起来很不错——一维板表示、命名变量、使用itertools.groupby——这几乎就是我自己编写的方式。 然后我想起了我自己写的。不过,我很高兴看到有人在使用我的代码!

(话虽如此,我注意到您删除了文档字符串。为什么要这样做?马上放回去!

无论如何,此匹配查找器用于itertools.groupby查找序列中相同项目的运行。或者更确切地说,由于key给出了一个函数,所以运行该key函数返回相同结果的项目。

您可以看到编写的键函数只是返回板位置的图像。这意味着只要它们包含相同的图像,板位置就会匹配。但是您想放松一下:您希望棋盘位置匹配,只要它们包含相同颜色的图像。

因此,您需要修改 key 函数,使其返回板位置图像的颜色。例如,当您加载图像时,您可以创建一个字典,将图像映射到它们的颜色:

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

colours = 'red blue yellow'
letters = 'acgtu'

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

然后在关键功能中,您可以查找图像以找到其颜色:

def key(i):
    return self.image_colour.get(self.board[i].image)
于 2013-10-09T17:33:42.643 回答