2017-02-15 7 views
-1

Я пытаюсь создать случайно созданное «назначение перков» из игр MMO или игр подобного типа.Python MMO Generation & Distribution

Правилами заключаются в следующем:

  • должен иметь 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, и поэтому чтобы сбросить оставшееся значение в последний стат, изменения будут перезаписаны на следующей строке, где yo uset 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) 

Я не пытался создать более эффективный ответ для Вас и сосредоточившись на исправление существующей попытки найти решение :)

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