Python随机条件

时间:2013-10-07 15:37:43

标签: python random constraints pygame

我正在开发我的第一个Python游戏,但在开始之前,我正在学习一些教程并尝试修改它们。我发现了一个伟大的“宝石迷阵”风格游戏,我试图做一些改变,但是我遇到了一个问题。

游戏通常使用七种不同的图像。当游戏开始时,它会以稍微随机的顺序放置宝石,但它会检查以确保它没有将大量相同的宝石放在彼此旁边。

我想要做的是将图像数量大大增加到十七。所有图像都正确加载,但是我想要限制它们出现的次数。例如,我希望gem1到gem3是更常见的宝石,而其他所有宝石都不常出现。我想做一些像随意使用的东西。它选择1-5之间的数字。如果选择1-4,则将选择gem1,gem2或gem3。如果选择5,则会出现任何其他宝石,但它始终需要遵循可能的Gems代码,以确保一堆相同的图像不会彼此相邻。关于如何使这项工作的任何想法?

我已经在对宝石最重要的地方包含了一些教程代码。您还可以通过在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)

2 个答案:

答案 0 :(得分: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。

如果列表太长,可能会占用大量内存,但通常这就足够了。

或使用这样的加权选择:

A weighted version of random.choice

答案 1 :(得分:0)

我推荐这样的东西,以保持分布整洁,易于修改:

gemOptions = []
gemOptions += ['red'] * 4
gemOptions += ['blue'] * 3
gemOptions += ['green'] * 2

In [6]: gemOptions
Out[6]: ['red', 'red', 'red', 'red', 'blue', 'blue', 'blue', 'green', 'green']

然后你可以简单地做

random.choice(gemOptions)

你有一个简单的加权平均值。你可以做任何你需要的错误检查,以确保适当的宝石不是彼此相邻,如果你需要选择另一个随机宝石,你可以这样做。