宝石迷阵风格游戏比赛

时间:2013-10-09 15:57:41

标签: python image match

我正在设计一款带有扭曲的珠宝风格游戏。您尝试匹配一对字母,而不是尝试匹配相同形状的所有块。董事会将在董事会上总共有大约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()]

编辑:

自从这篇文章发布以来,很多内容已经发生了变化并且已经更新了游戏。它有声音和背景音乐,新评分系统的基础,新的计时器系统,我可以指定我想在游戏首次开始时在网格上的特定位置出现的罕见形状。但是,我仍然遇到核心游戏的问题。我讨厌拖延和更老的帖子,但我不知道如何让这个工作。我已经搞乱了处理比赛的代码而没有运气。

基本上,rareshapes被分配了数字。因此,红色A为0,红色T为3,一直到黄色T为14.为了使游戏按照我们想要的方式工作,用户需要获得红色A(0),红色T(3)和彼此相邻的2个空白红色方块,因为它是一个有效的匹配并从板上清除。这是您从电路板上清除方块的唯一正确方法。将4个相同颜色的空白方块彼此相邻,不要将它们移除。

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

游戏的目标是在时间用完之前删除所有字母块而不会发生三次打击。因为我们可以指定现在出现的字母块的数量和位置,所以它只能归结为匹配。有没有人知道如何使这项工作?

1 个答案:

答案 0 :(得分:1)

我正在读你发布的代码,我对自己说,看起来很不错 - 一维板表示,命名很好的变量,itertools.groupby的使用 - 这几乎就是我的意思自己写的。 And then I remembered that I had written it myself.不过,我很高兴看到有人在使用我的代码!

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

无论如何,这个匹配查找器使用itertools.groupby来查找序列中相同项目的运行。或者更确切地说,由于给出了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)