0

私は最初の Python ゲームに取り組んでいますが、始める前に、いくつかのチュートリアルに取り組み、それらを変更しようとしています。私は素晴らしい「宝石をちりばめた」スタイルのゲームを見つけました。これに変更を加えようとしていますが、1 つの問題が発生しています。

ゲームは通常、7 つの異なる画像を使用しました。ゲームが開始されると、ジェムは多少ランダムな順序で配置されますが、同じジェムが大量に隣り合っていないことを確認しました。

私がやりたいことは、画像の数を 17 に大幅に増やすことです。すべての画像は正しく読み込まれますが、表示される回数を制限したい画像もあります。たとえば、gem1 から gem3 までをより一般的な gem にしたいのですが、他のすべての gem はそれほど頻繁には表示されません。私はランダムを使用するようなことを考えています。1 ~ 5 の数字を選択します。1 ~ 4 を選択すると、gem1、gem2、または gem3 のいずれかが選択されます。5 を選択すると、他の宝石が表示されますが、同じ画像が隣り合って表示されないように、常に possibleGems コードに従う必要があります。これを機能させる方法についてのアイデアはありますか?

gem にとって最も重要な場所にいくつかのチュートリアル コードを含めました。また、Google で gemgem.py を検索して、完全なソース コードを参照することもできます。

possibleGems = list(range(len(GEMIMAGES)))
            for offsetX, offsetY in ((0, -1), (1, 0), (0, 1), (-1, 0)):
                # Narrow down the possible gems we should put in the
                # blank space so we don't end up putting an two of
                # the same gems next to each other when they drop.
                neighborGem = getGemAt(boardCopy, x + offsetX, y + offsetY)
                if neighborGem != None and neighborGem in possibleGems:
                    possibleGems.remove(neighborGem)

            newGem = random.choice(possibleGems)
            boardCopy[x][y] = newGem
            dropSlots[x].append(newGem)

画像を読み込むコード

# Load the images
GEMIMAGES = []
for i in range(1, NUMGEMIMAGES+1):
    gemImage = pygame.image.load('gem%s.png' % i)
    if gemImage.get_size() != (GEMIMAGESIZE, GEMIMAGESIZE):
        gemImage = pygame.transform.smoothscale(gemImage, (GEMIMAGESIZE, GEMIMAGESIZE))
    GEMIMAGES.append(gemImage)
4

2 に答える 2

0

より簡単な方法は次のようなものです。基本的に、 のようなリストを作成する代わりに[0,1,2]、相対確率が必要な回数だけ各要素を繰り返します。

gem_frequency = [10, 8, 7, 3, 1, 1, 1, 1, 1]
gem_lists = []
for index, gf in enumerate(gem_frequency):
    gem_lists.append([index] * gf)

gem_prob = chain(*gem_lists)

gem_prob
[0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,4,5,6,7,8]

len(gem_prob)
33

random.choice(gem_prob)
0
1
0
3
1
3
8
0
2
4

そのため、エントリ 2 は頻度 10 としてリストされました。これは、エントリ 8 (頻度が 1 のみ) の約 10 倍の頻度で表示されるはずです。これらの重みの合計は 33 で、約 10/33 の確率で 0 が選択されます。

リストが長くなりすぎると、大量のメモリが消費される可能性がありますが、通常はこれで十分です。

または、次のような加重選択を使用します。

random.choice の加重バージョン

于 2013-10-07T17:01:03.320 に答える