2017-02-15 5 views
-1

MMOのゲームやそのようなゲームからランダムに生成された "特典の割り当て"を作成しようとしています。Python MMOの生成と配布

次のように規則がある:

  • は、一つの容器5を有していなければならないだけ全20点が
  • ポイントにより分散する必要が分散されなければならない5
  • と1つの容器を有することができます(ランダムを使用して)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

リストは、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であるか、1つの値が5であり、1つの値が3で残りがすべて4であるということです。逆に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

最初に1つのコンテナに最大数のポイントを無作為に割り当ててから、後で残りのポイントを一杯に割り当てる方が簡単になります。あなたのコードは、すべての5つの統計情報が割り当てられている場合を生成することができますので、それは時々、ループ内で立ち往生だが、それは内のすべての項目に3を代入し続ける場合itemsは、例えば、まだ ない

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 
関連する問題