2017-02-15 71 views
-1

我正在尝试从MMO游戏或类似的游戏中创建一个随机生成的“津贴分配”。蟒蛇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

修正现有的尝试你说这工作“有时” 。这表明随机语句有时会产生一个导致错误的数字。尝试在每次生成时打印“num1”,并查看循环是否总是从相同的数字中失败。如果你自己没有解决的话,把结果编辑成你的答案。 – tburrows13

+0

你是什么意思的循环“卡住”?它会崩溃吗?如果是这样,请将完整的错误跟踪发回。 – tburrows13

+0

@Gloin我们已经这样做了,它最终创建了一个数字更大的项目,并减去更大的数字,并使其进入负面并无限重复。 –

回答

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.因此,像maxNum那样添加一个minNum。此外,您并不需要外部循环,因为我们的逻辑现在确保最终值为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) 

我没有尝试,并为您创造一个更有效的答案,而不是集中在一个解决方案:)

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