私は宝石をちりばめた感じのパズルゲームに取り組んでいます。ゲームが始まると、ボードは 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())
ストライキを処理するコードは、「プレースホルダー」の場所にあるので、機能することを確認できます。無効な一致が発生した場合、現在のようにすべての一致ではなく、ストライク カウントが増加します。