Python MMO Generation&分配

时间:2017-02-15 15:50:21

标签: python random containers

我试图从MMO游戏或类似游戏中创建随机生成的“特权分配”。

规则如下:

  • 必须有5个一个容器,并且只能有1个容器,5个
  • 所有20分必须分发
  • 积分必须由RNG(使用随机)
  • 分发

到目前为止,我们所拥有的只是:

import random

# Variables
cont = [0, 0, 0, 0, 0]
items = 20
maxNum = 5

# Start our first loop
i = 0
while items != 0:
    i = 0
    while i < len(cont) - 1:
        num1 = random.randint(3, maxNum)
        if items < 5:
            if cont[i] = 00:
                cont[i] += items
                items = 0
                break
        cont[i] = num1
        if cont[i] == 5:
            maxNum = 4
        i += 1
        items = items - num1

    print(items)

print(cont)

这有时会结束,但有时它会陷入循环而无法正常工作。

这段代码的正确方式是每次输出时都会打印出来:

  • [5,4,4,4,3]
  • [4,4,4,4,4]
  • [5,4,3,4,4]

请帮我解决为什么它有时会卡在循环中!谢谢!

2 个答案:

答案 0 :(得分:1)

它有时会卡在循环中,因为您的代码可能会生成一个案例,其中已分配了所有5个统计信息,但items仍然不是0。

例如,如果它一直为列表中的每个项目分配3,那么我们最终会得到const = [3,3,3,3,3]items = 5。即使在const = [5,4,4,4,0]的情况下,我们在随机数上滚动4,即使您发现items < 5的情况,并将剩余的值转储到最后的统计数据中,更改也会在下一个数据中被覆盖无论如何,你在哪里使用cont[i] = num1

因此,首先,cont[i] = num1的赋值需要在else语句中。此外,我读这个唯一可能的方式是所有值都是4,或者一个值是5,一个值是3,其余都是4.你正在抓住只有这样的情况是一个5,但反过来也只能有一个3,否则它总共不能达到20.所以为minNum添加一个类似maxNum的捕获。此外,您不需要外部循环,因为我们的逻辑现在确保最终值为20. items < 5检查也需要items <= 5,以便允许转储5进入最终价值。我自己尝试过,似乎工作正常。

最终结果:

import random

# Variables
cont = [0, 0, 0, 0, 0]
items = 20
maxNum = 5
minNum = 3

# Start our first loop
i = 0
while i < len(cont):
    num1 = random.randint(minNum, maxNum)
    if items <= 5:
        cont[i] = items
    else:
        cont[i] = num1
    if cont[i] == 5:
        maxNum = 4
    if cont[i] == 3:
        minNum = 4
    items -= cont[i]
    i += 1

print(cont)

我没有尝试为您创建更有效的答案,而是专注于纠正您现有的解决方案:)

答案 1 :(得分:0)

在开始时将最大点数随机分配到一个容器中会更容易,然后再填充其余容器。

from random import randint 

def assign(num_containers, container_max, max_points):
    containers = [0]*num_containers
    full_container = randint(0, num_containers-1)
    containers[full_container] = container_max
    assigned = container_max

    while assigned < max_points:
       cont = randint(0, num_containers-1)
           if cont is not full_container and containers[cont] < container_max - 1:
               containers[cont] += 1
               assigned += 1

   return containers