1

私は宝石をちりばめた感じのパズルゲームに取り組んでいます。ゲームが始まると、ボードは 3 つの異なる色のランダムな空白の正方形で満たされます。特定の場所では、文字の四角形が空白の四角形の代わりに 3 つの異なる色で表示されます。これらの文字の正方形はレアシェイプと呼ばれ、それぞれに番号が割り当てられています。たとえば、「赤の A」の四角には 0 が割り当てられます。「青の C」には 6 が割り当てられます。合計 15 (0 ~ 14) の色/文字の四角が割り当てられます。

さて、トリッキーな部分です。現在、同じ色の正方形 (正方形の文字に関係なく) が 4 つ隣接すると、Bejeweled のゲームのように消えます。ただし、これは私たちが望んでいる方法ではありません。

私たちのゲームでは、空白の色付きの正方形がいくつでも隣り合っていても、それらはボードからクリアされません。「一致」が有効であるためには、2 つの文字付きの四角形と、同じ色の 2 つの空白の四角形が隣り合っている必要があります。

事態をさらに複雑にするために、コードは有効な一致かどうかをチェックする必要があります。いくつかの有効な一致を含めました。これには多くの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 で宝石をちりばめたゲームの素晴らしい例を見つけました。およびその他の要素を使用intertools.groupbyして一致をチェックしますが、キーを変更して機能させる方法がわかりません。いくつかのifステートメントを試してキー自体を変更すると、エラーが発生するか、ループでボードからすべてがクリアされます。

誰かが上記の有効な一致の1つを含むコード例を提供して、これを行う方法についてのアイデアを得ることができます. 画像読み込みコード (必要な場合) と 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