1

Twisted の助けを借りて、Python でゲーム サーバーを作成しています。ゲームのマップを生成する Map クラスがあります。私のゲームでは、中心点があり、外側に一定の距離ごとにアイテムのリングがあります。マップの外側に向かってより一般的になるように、アイテムをランダム化するだけでなく、アイテムに重みを付けたいと考えています。現在、これはマップを構築するための私のコードで、いくつかの変数と関数の名前が変更されています:

def generate():
    centralItem = Item(ITEM_TYPE_GOLD, 0, 0, ITEM_SIZE_GIANT, None)
    self.items.append(centralItem)
    distance = 10000
    numberOfRings = 100
    for ring in range(numberOfRings):
        itemsInRing = (ring + 1) * 100
        distanceToRing = (ring + 1) * distance
        for item in range(itemsInRing):
            angle = math.radians(float(360) / itemsInRing) * item
            xPos = math.cos(angle) * distanceToRing
            yPos = math.sin(angle) * distanceToRing
            # set variable itemSize using method described above (details below)
            # set variable itemType using method described above (details below)

また、アイテムを作成するための初期化子を備えたこのクラスもあります。

class Item:

def __init__(self, type, posX, posY, size, owner):
    self.type = type
    self.posX = float(posX)
    self.posY = float(posY)
    self.size = size
    self.owner = owner

これらは私の定義です。

ITEM_TYPE_FIRE = 0
ITEM_TYPE_ICE = 1
ITEM_TYPE_WIND = 2
ITEM_TYPE_EARTH = 3
ITEM_TYPE_GOLD = 4

ITEM_SIZE_SMALL = 200
ITEM_SIZE_MEDIUM = 350
ITEM_SIZE_LARGE = 500
ITEM_SIZE_GIANT = 1000

generate メソッドの distanceToRing に基づいて、たとえば ITEM_SIZE_SMALL は、distanceToRing が 1,000,000 の場合に最も多く、distanceToRing が 10,000 の場合に最も少なくなるようにしたいと考えています。また、ITEM_SIZE_LARGE はその反対であり、ITEM_SIZE_MEDIUM は中間でより一般的であることも望んでいます。アイテムの種類については、ITEM_TYPE_FIRE と ITEM_TYPE_ICE が 1,000,000 に向かって最も一般的である必要があります。ITEM_TYPE_WIND と ITEM_TYPE_EARTH は 10,000 に向かってより一般的なはずです。

質問が多いのは承知していますが、このような配布の処理方法を提示して説明していただければ、理解できると思います。また、Python のスキルが不足していることをあらかじめお詫び申し上げます。ベストプラクティスやいくつかの基本を理解するのに十分なほど長く使用していません。

お時間をいただきありがとうございます、ブライアン

4

1 に答える 1

2

明らかに、各アイテムのタイプ/サイズの確率が距離にどのように関連するかを正確に決定する必要があります。最も簡単な答えは、次のような、好みの場所にピークがあり、範囲が一貫している三角形(10000〜1000000と言います)を作成することです。

item_sizes = [ITEM_SIZE_SMALL, ITEM_SIZE_MEDIUM, ITEM_SIZE_LARGE]

def get_item_weights(distance):
    return [1010000 - distance, 1000000 - abs((505000-distance)*2), distance]

これにより、ほとんどが10000の小さなアイテム、ほとんどが1000000の大きなアイテム、そして中央で約25/50/25の分割が得られます。たぶんあなたはそれがうまくいく方法が気に入らないかもしれませんが、私にはそれを知る方法がありません。ランダムなプロセスを構築する場合、好きなものを見つけるのに試行錯誤が必要になることがあります。(技術的には、505000は有効な距離ではないため、ミドル級は990000でピークになりますが、特にこの分布が気に入らない可能性があるため、修正する価値があるほど重要ではないと思います。)

重みを指定してアイテムを選択するには、次のようにします。

import random

random.seed()

def get_random_index(weights):
    n = random.randint(1, sum(weights))
    cumsum = 0
    for index, weight in enumerate(weights):
        cumsum += weight
        if n <= cumsum:
            return index

def get_random_size(distance):
    return item_sizes[get_random_index(get_item_weights(distance))]

…</p>

itemSize = get_random_size(distanceToRing)
于 2012-07-23T01:39:05.323 に答える