3

我有一个函数可以构建随机数量的对象实例。为了演示总体思路,我们将假设这是一种构建一系列类似 nethack 的房间的算法。

要求是这样的,我不会提前知道会有多少实例;这些是随机和即时生成的。

作为一个简短的说明:我完全意识到以下代码是非功能性的,但它应该(希望!)证明我的目标。

import random

class Levelbuild(object):

    def __init__(self):
        self.l1 = dict({0:'a',1:'b',2:'c',3:'d',4:'e',5:'f',6:'g',7:'h',8:'i'})
        # Pick a random number between 4 and 9.
        for i in range(random.randint(4,9)):
            self.l1[i] = Roombuilder()

如果我们假设选择的随机整数是 5,理想的结果是 5 个 Roombuilder() 实例;分别标记为 a、b、c、d 和 e。

有没有一种简单的方法可以做到这一点?这个时期有办法吗?

- 编辑 -

对 Nick ODell 的回答表示巨大的“谢谢”。这不是完整的复制/粘贴——但它是一种适合我需要的变体;

import random

class Room(object):
    def __init__(self):
        self.size = (5,5)

class Level(object):

    def __init__(self):
        roomnames = ['a','b','c','d','e','f','g','h','i']
        self.rooms = {}
        for i in range(random.randint(4, 9)):
            self.rooms[roomnames[i]] = Room()

与其手工建造每个“房间”,我现在可以...

test = Level()
print test.rooms['a'].size
>>> (5,5)
4

3 回答 3

3
import string
import random

class Levelbuild(object):

  def __init__(self,min_room_count,max_room_count):

    rooms_temp = [new RoomBuilder() for i in range(random.randint(min_room_count,max_room_count))]
    self.l1 = dict(zip(string.ascii_lowercase, rooms_temp))

注意:如果给定超过 26 个房间,这将静默失败。

于 2012-04-25T20:21:03.207 回答
0

事实上,你已经很接近了。你不需要听写;只需使用一个列表。(而且,顺便说一句,{...}已经是一个 dict,所以将它包装进去dict()并没有任何作用。)

roomnames = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
self.rooms = []
for i in range(random.randint(4, 9)):
    self.rooms.append(Roombuilder(roomnames[i]))

对于它的价值,builder输入一个类的名称有点时髦。对象是房间,对吧?所以类型应该只是Room.

于 2012-04-25T20:17:23.970 回答
0

作为更通用解决方案的另一个答案(主要作为Nick ODell 的答案的伴侣,如果您想处理任意数量的名称,这是一个非常简单的无限生成器解决方案:

import string
import itertools

def generate_names(characters):
    for i in itertools.count(1):
        for name in itertools.product(characters, repeat=i):
            yield "".join(name)

然后,您可以像使用任何其他生成器一样使用它:

>>>print(dict(zip(generate_names(string.ascii_lowercase), range(30))))
{'aa': 26, 'ac': 28, 'ab': 27, 'ad': 29, 'a': 0, 'c': 2, 'b': 1, 'e': 4, 'd': 3, 'g': 6, 'f': 5, 'i': 8, 'h': 7, 'k': 10, 'j': 9, 'm': 12, 'l': 11, 'o': 14, 'n': 13, 'q': 16, 'p': 15, 's': 18, 'r': 17, 'u': 20, 't': 19, 'w': 22, 'v': 21, 'y': 24, 'x': 23, 'z': 25}

如果您需要生成实际名称,那么您有几个选择。如果您需要一个真实的单词,请从字典文件中挑选(大多数 Linux 用户都有一个/usr/share/dict)。如果你需要类似单词的东西,那么我实际上已经编写了一个 Python 脚本来使用 Markov Chains 生成这样的“单词”,它在 GPL 下可用。自然,您必须检查这些的唯一性。

于 2012-04-25T20:32:48.740 回答