Python MMO生成与分发

2024-07-08 09:31:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个随机生成的“特权分配”从MMO游戏或类似的游戏。你知道吗

规则如下:

  • 一个容器中必须有5个,并且只能有一个容器中有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]
  • 等等

请帮我解决为什么有时会卡在循环中!谢谢您!你知道吗


Tags: import游戏if规则itemsrandom容器特权
2条回答

它有时会陷入循环中,因为您的代码可以生成这样一种情况:所有5个stats都已分配,但items仍然不是0。你知道吗

例如,如果它一直将3分配给列表中的每个项目,那么我们将得到const = [3,3,3,3,3]items = 5。即使在const = [5,4,4,4,0]的情况下,我们在随机数上掷4,即使您捕捉到items < 5的情况,因此要将剩余的值转储到最后一个stat中,更改仍然会在您使用cont[i] = num1的下一行被覆盖。你知道吗

因此,首先,cont[i] = num1的赋值需要在else语句中。另外,我读这个的方式,唯一的可能性是要么所有的值都是4,要么一个值是5,一个值是3,其余的都是4。你发现只有一个5,但是反过来也只有一个3,否则不可能全部加起来是20。所以为minNum添加一个catch,就像为maxNum添加catch一样。另外,您实际上不需要外循环,因为我们的逻辑现在确保最终值为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)

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

一开始就把最多的点数随机分配到一个容器中,然后再把剩下的填满,这样会更容易些。你知道吗

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

相关问题 更多 >

    热门问题