我正在开发一款具有宝石迷阵感觉的益智游戏。游戏开始时,棋盘上布满了三种不同颜色的随机空白方块。在某些位置,字母方块将再次取代三种不同颜色的空白方块。这些字母方块被称为稀有形状,每个都分配有一个数字。例如,“红色 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())
处理罢工的代码位于“占位符”位置,这样我就可以确保它正常工作。如果发生无效比赛,则罢工计数将增加,而不是像现在这样的每场比赛。