我正在开发一款游戏,我需要为列表随机生成类。我使用自制函数randList
来执行此操作。该函数的代码如下所示:
def randList(options, num): #RANDOMLY SELECTS NUM ITEMS FROM LIST OPTIONS
returnVal = [] #CREATE A LIST THAT IT RETURNS
for i in range(num - 1): #FOR DESIRED NUMBER OF RETURN ITEMS
val = r.choice(options) #RANDOMLY SELECT ITEM FROM OPTIONS
returnVal.append(val) #ADD THAT TO RETURNVAL
options.remove(val) #REMOVE IT FROM OPTIONS.
return returnVal #RETURN GENERATED LIST
我正在使用它来随机生成房间里的怪物和物品:
class roomParent: #ROOM CHARACTER FINDS
def __init__(self, entities, floor): #INIT WITH ENEMIES IN ROOM, ITEMS ON FLOOR
self.entities = entities #ENEMIES THERE ARE
self.floor = floor #ON FLOOR THERE IS
def generate(self):
global enemiesBeat
if enemiesBeat >= 500:
self.entities = [dragon]
else:
self.entities = randList([goblin, dwarf, slime, naga, troll, beholder], 1)
self.floor = randList([scrap, scrap, scrap, fireJar, ambrosia, sword, spearhead, armor, potion, slimeball], r.randint(0, 3))
room = roomParent([], [])
您知道,goblin
,dwarf
,slimeball
等在代码中已定义。我不认为他们与这个问题有任何关系。我稍后会像这样生成房间:
def main():
room.generate()
print("Enemies: " + str(room.entities))
main()
我希望它打印出room.generate()
中包含两个随机怪物的列表,但它始终打印Enemies: []
。代码中没有错误,在尝试进行10分钟的故障排除后,我决定咨询他的网络,结果没有结果。提前感谢您提供的任何帮助。
答案 0 :(得分:3)
正如Oliver指出的那样,你得到一个空的entities
数组的原因是因为self.entities
在randList([goblin, dwarf, slime, naga, troll, beholder], 1)
内设置为generate
(我假设全局变量{您的测试中{1}}小于500。
在enemiesBeat
函数中,我在评论中提到了一个错误,这意味着生成的列表将包含的项目少于randList
指定的项目。当您尝试为num
(self.entities
= 1)生成单例列表时,您实际上会将其分配给空列表。
您可以通过将num
功能中的for i in range(num - 1)
更改为for i in range(num)
来解决此问题。
顺便说一句,我认为您不需要将randList
和entities
作为参数传递给floor
构造函数,因为它似乎没有任何效果。相反,您可以修改类定义:
roomParent
并像这样实例化:
class roomParent(object):
def __init__(self):
self.entities = []
self.floor = []
...
答案 1 :(得分:2)
使用the random.sample library function.
此外,您可能需要重新考虑大小写...对于函数名称,snake_case优先于inCaps。