我正在开发我的第一个Python游戏,但在开始之前,我正在学习一些教程,并试图修改它们。我发现了一个很棒的“珠光宝气”风格的游戏,我正试图对它做一些改变,但我遇到了一个问题。
这个游戏通常使用七个不同的图像。当游戏开始时,它会以某种随机的顺序放置宝石,但它会检查以确保没有将大量相同的宝石放在一起。
我想要做的是将图像的数量大大增加到17个。所有的图像都能正确加载,但是有些图像我想限制它们出现的次数。例如,我希望gem1到gem3成为更常见的gem,而所有其他的不会经常出现。我正在考虑做一些像使用随机的事情。让它在1-5之间选择一个数字。如果选择1-4,则将选择gem1、gem2或gem3。如果选择5,则会出现任何其他的gem,但它始终需要遵循possibleGems代码,以确保不会有一堆相同的图像相邻出现。有没有关于如何让它工作的想法?
我在一些对gem最重要的地方包含了一些教程代码。你也可以通过在谷歌中搜索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)发布于 2013-10-08 01:01:03
更简单的方法应该是这样。基本上,不是创建像[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。
如果列表太长,可能会消耗大量内存,但通常这就足够了。
或者使用像这样的加权选择:
发布于 2013-10-08 01:04:55
我推荐这样的东西,以保持发行版的整洁和易于修改:
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)你有一个简单的加权平均值。您可以执行所需的任何错误检查,以确保适当的gem不相邻,如果您需要选择另一个随机gem,您可以这样做。
https://stackoverflow.com/questions/19228908
复制相似问题