为基于文本的 RPG 创建更一致、随机生成的世界空间

Posted

技术标签:

【中文标题】为基于文本的 RPG 创建更一致、随机生成的世界空间【英文标题】:Creating a more consistant, randomly generated, world space for a text-based RPG 【发布时间】:2017-01-08 15:33:42 【问题描述】:

目前,我可以在二维数组中创建一个随机世界。但是,我觉得它太随意了。这是我目前正在使用的课程:

from random import randint, choice, randrange

class WorldSpace(object):
    def __init__(self, row, col, world_array):
        self.row = row  # Number of lists to be created.
        self.col = col  # Number of indexes inside of each row.
        self.world_array = world_array

创建世界的WorldSpace 方法:

@classmethod
def generate(cls, autogen):
    print 'Starting world generation...'
    print
    if autogen is True:
        row_amt = 75
        col_amt = 75

    else:
        row_amt = input('Please specify row length of world array.: ')
        col_amt = input('Please specify column length of world array.: ')
        if (row_amt or col_amt) == 0:
            print 'Invalid world values!'
            cls.generateWorld(False)

    world_array = [[' ']*col_amt for _ in xrange(row_amt)]
    print 'Created world...'

    return cls(row_amt, col_amt, world_array)

一种修改世界的方法——目前只创建forests,尽管在我的完整代码段中,也形成了一系列海洋和山脉:

def modify_world(self, autogen):
    if autogen is True:
        # Forests:
        count = randint(6, 10)
        while count > 0:
            a = randint(1, (self.row / randint(2, 6)))
            b = randint(1, (self.col / randint(2, 6)))
            row_val = randint(5, self.row)
            count_val = randint(5, 15)
            self.genLine_WObj(a, b, row_val, 't', count_val)
            count -=1

    print('\n'.join([''.join([':1'.format(item) for item in row])
      for row in self.world_array]))
    inp = input('')
    if inp != '':
        return

以及实际创建forest 磁贴的方法:

def genLine_WObj(self, a, b, row_val, char, count):
    # 'genLine_WObj' - Generate Line(like) world object.
    # Used to place lines of certain characters with psuedo-randomized
    # width and length onto the world array.
    while count != 0:
        row_col_dict = row_val: (a, b)
        for row in row_col_dict.keys():
            startPos, endPos = row_col_dict[row]

            for i in range(startPos, endPos):
                self.world_array[row][i] = char

        b += choice([0, 1])
        a += choice([0, 0, 0, 0, 1])

        row_val -= 1
        count -= 1

现在实际运行程序:

world = WorldSpace.generate(True)
world.modify_world(True)

但是,虽然在大约 20-30% 的时间里有效,但有时它会生成小森林,或小对 t 字符,而它应该在地图周围创建森林。如何改进我的代码以使随机生成更加一致?

【问题讨论】:

你没有解释目标。有些东西不可能既随机又一致——这在术语上是矛盾的。 “小对”是什么意思?您的代码也有问题:例如,查看 genLine 的 while 循环中的前三行 - 您创建一个单元素字典并对其“迭代”(循环仅运行一次),然后使用键查找您刚刚明确分配给它的值,并将 that 分配给两个新变量。这些代码实际上都没有做任何事情。我建议您将代码发布到 CodeReview 并寻求帮助以清理它。 【参考方案1】:

固定:

    有时您的a 比您的b 大,并且不会生成森林。 您的所有森林都倾向于位于地图的左侧。

为更改的行添加内联 cmets。

def modify_world(self, autogen):
    if autogen is True:
        # Forests:
        count = randint(6, 10)
        while count > 0:
            a = randrange(self.col)           # begin of forest
            width = self.col / randint(2, 6)  # initial width of forest
            b = int(a + width)                # end of forest
            row_val = randint(5, self.row)
            count_val = randint(5, 15)
            self.genLine_WObj(a, b, row_val, 't', count_val)
            count -=1

    print('\n'.join([''.join([':1'.format(item) for item in row])
      for row in self.world_array]))
    inp = input('')
    if inp != '':
        return


def genLine_WObj(self, a, b, row_val, char, count):
    # 'genLine_WObj' - Generate Line(like) world object.
    # Used to place lines of certain characters with psuedo-randomized
    # width and length onto the world array.
    while count != 0:
        row_col_dict = row_val: (a, b)
        for row in row_col_dict.keys():
            startPos, endPos = row_col_dict[row]

            for i in range(startPos, min(self.col, endPos)):  # added min
                self.world_array[row][i] = char

        b += choice([0, 1])
        a += choice([0, 0, 0, 0, 1])

        row_val -= 1
        count -= 1

我会将森林的width 更改为与地图大小无关的东西。例如:

width = randint(2, 15)

但这取决于你的目标。

【讨论】:

以上是关于为基于文本的 RPG 创建更一致、随机生成的世界空间的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中制作基于文本的 RPG 游戏/模板时出现问题 [关闭]

类似西方世界的劫难的魔兽rpg地图 跪求啊

在python中清除基于文本的rpg屏幕

基于 Python 文本的 rpg 类统计

设置 /p 空答案崩溃

马尔科夫链随机文本生成器