【问题标题】:Python Random ConditionsPython 随机条件
【发布时间】:2013-10-07 15:37:42
【问题描述】:

我正在开发我的第一个 Python 游戏,但在开始之前,我正在研究一些教程并尝试修改它们。我发现了一个很棒的“宝石迷阵”风格的游戏,我正在尝试对其进行一些更改,但是我遇到了一个问题。

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

我想要做的是将图像数量大幅增加到 17 个。所有图像都正确加载,但是有些图像我想限制它们出现的次数。例如,我希望 gem1 到 gem3 成为更常见的 gem,而所有其他的都不会出现。我正在考虑做一些类似使用随机的事情。让它选择一个 1-5 之间的数字。如果选择 1-4,则会选择 gem1、gem2 或 gem3。如果选择 5,任何其他 gem 都会出现,但它始终需要遵循 possibleGems 代码,以确保一堆相同的图像不会出现在彼此旁边。关于如何使这项工作的任何想法?

我在对 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)

【问题讨论】:

    标签: python random constraints pygame


    【解决方案1】:

    更简单的方法是这样的。基本上,您无需创建像 [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

    【讨论】:

      【解决方案2】:

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

      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)
      

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

      【讨论】:

      • 我喜欢这种方法,但我对 python 完全陌生,对整个编程也很陌生,所以我不知道这样的代码是否属于我正在尝试修改的教程。看起来代码将每个 gem 图像存储到 GEMIMAGES 列表中,并为每个图像分配一个数字。然后它使用这些数字来验证是否发生了三个(或更多)的正确匹配。我无法弄清楚如何采用这种方法并将其添加到教程游戏中,而无需进行大量更改,这些更改很可能以我破坏某些东西而告终。关于如何将此代码放入教程中以便运行的任何建议?
      猜你喜欢
      • 1970-01-01
      • 2019-04-25
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 2016-02-16
      相关资源
      最近更新 更多