1

私はゲームを作成していますが、方法の 1 つは、スキル値に基づいてキャラクターの基本ヒット数を計算します。各スキルは近距離、中距離、遠距離で使用できるため、この方法では現在、各値を個別に計算しています。

私は当初、スキルを組み合わせてタプルにし、それを繰り返し処理して、各ヒット数を動的に作成できると考えていました。しかし、現在、各ヒット番号を独自の変数に割り当てているため、実際に可能かどうかはわかりません。

また、範囲ごとにメソッドを作成し、タプルを引数として渡すことも考えました。結果の値を使用して新しいタプルまたはリストを作成し、それらを個々の変数に割り当てることもできますが、コピーして貼り付けたように見えないことを除いて、この方法よりも優れているとは思いません.

これが私が現在持っているものです:

    def calcBaseHitNumbers(self, dict):
        """Calculate character's base hit numbers depending on skill level."""

        self.skill_dict = dict

        self.rifle = self.skill_dict.get('CRM', 0)
        self.pistol = self.skill_dict.get('PST', 0)
        self.big_gun = self.skill_dict.get('LCG', 0)
        self.heavy_weapon = self.skill_dict.get('HW', 0)
        self.bow = self.skill_dict.get('LB', 0)
        #self.skill_tuple = (self.rifle, self.pistol, self.big_gun, self.heavy_weapon,
        #    self.bow)

#---Short range
##        for skill in self.skill_tuple:
##            self.base_hit_short = skill * 0.6
        self.charAttribs.bhCRM_short = self.rifle * 0.6
        self.charAttribs.bhPST_short = self.pistol * 0.6
        self.charAttribs.bhHW_short = self.heavy_weapon * 0.6
        self.charAttribs.bhLCG_short = self.big_gun * 0.6
        self.charAttribs.bhLB_short = self.bow * 0.6
#---Med range
        self.charAttribs.bhCRM_med = self.rifle * 0.3
        self.charAttribs.bhPST_med = self.pistol * 0.3
        self.charAttribs.bhHW_med = self.heavy_weapon * 0.3
        self.charAttribs.bhLCG_med = self.big_gun * 0.3
        self.charAttribs.bhLB_med = self.bow * 0.3
#---Long range
        self.charAttribs.bhCRM_long = self.rifle * 0.1
        self.charAttribs.bhPST_long = self.pistol * 0.1
        self.charAttribs.bhHW_long = self.heavy_weapon * 0.1
        self.charAttribs.bhLCG_long = self.big_gun * 0.1
        self.charAttribs.bhLB_long = self.bow * 0.1

これをより動的にするためにどのようにリファクタリングしますか?


編集:私がやりたいことは次のようなものだと思います:タプル(コメントアウトしたものなど)を持ち、それを3回繰り返し、そのたびに(スキルごとに)特定の修飾子に基づいて新しい値を作成します範囲。結果の値は、それぞれの変数に自動的に割り当てられます。

私の頭では、それは理にかなっています。でも、実際にコーディングしようとすると、迷ってしまいます。問題は、これが私が書いた最初の「本物の」プログラムだということです。私が以前に行ったのは小さなスクリプトだけです。

これは私のプログラムの 0.1 バージョンにすぎないので、今すぐリファクタリングする必要はありません。ただし、これを手動で行うのは非常にPythonicではないように思われます。また、将来的に状況が変化した場合に備えて、これを「将来的に保証」したいと考えています。

4

5 に答える 5

6

本当に欲しいのは、基本値を処理し、さまざまな修飾子でヒット値を計算するための属性を持つ、武器を表すクラスのようです。簡単な例を次に示します。

SHORT_RANGE = 'S'
MEDIUM_RANGE = 'M'
LONG_RANGE = 'L'
SHORT_RANGE_MODIFIER = 0.6
MEDIUM_RANGE_MODIFIER = 0.3
LONG_RANGE_MODIFIER = 0.1

class Weapon(object):
    def __init__(self, code_name, full_name, base_hit_value,
                 short_range_modifier=None, medium_range_modifier=None,
                 long_range_modifier=None):
        self.code_name, self.full_name = code_name, full_name
        self.base_hit_value = base_hit_value
        self.range_modifiers = {
            SHORT_RANGE: short_range_modifier or SHORT_RANGE_MODIFIER,
            MEDIUM_RANGE: medium_range_modifier or MEDIUM_RANGE_MODIFIER,
            LONG_RANGE: long_range_modifier or LONG_RANGE_MODIFIER,
        }

    def hit_value(self, range, modifier=1):
        return self.base_hit_value * self.range_modifiers[range] * modifier

そこから、次のように Character オブジェクト内に Weapon のインスタンスを作成できます。

    self.rifle = Weapon('CRM', 'rifle', 5)
    self.pistol = Weapon('PST', 'pistol', 10)

そして、たとえば、キャラクターが短距離でピストルを発射した場合:

    hit_value = self.pistol.hit_value(SHORT_RANGE)

hit_value() メソッドへの追加の引数を使用して、文字または状況固有の変更を渡すことができます。

もちろん、これを超える次のステップは、武器を武器のサブクラスとして直接モデル化し (おそらく、銃、弓、手榴弾などの特定の種類の武器に分解し、それぞれ独自の基本値を持つ)、インベントリを追加することです。キャラクターが持っている武器を表すクラス。

これらはすべて、非常に標準的で退屈なオブジェクト指向の設計手順ですが、多くの状況では、この種の考え方により、すぐに軌道に乗ることができ、少なくとも基本的な柔軟性が少し得られます。

于 2008-10-26T11:42:26.163 に答える
1

私があなたのシナリオを理解しているかどうか見てみましょう:各武器には独自の異なるヒットポイントがあるため、ライフルには1、重い武器には2などがあります。次に、各キャラクターには、ヒットポイントを掛けるショート、ミディアム、ロングの値があります。武器。

戦略設計の使用を検討する必要があります。つまり、ヒット ポイント プロパティを持つ武器のスーパークラスを作成します。ライフル、ピストル、弓などのサブクラスの武器を作成します。武器の違いはヒット ポイントだけではないと確信しています。

次に、キャラクターはゲームプレイに応じて 1 つまたは複数の武器を持っています。特定の武器のヒット ポイントを計算するには、次のように簡単です。

current_weapon * self.medium

後で武器を追加することにした場合、キャラクターはあらゆる武器を扱うことができるため、キャラクター コードを編集する必要はありません。

疑似 Python で

class Weapon
    hit = 1
    #other properties of weapon

class Rifle(Weapon)
    #other properties of Rifle

class Pistol(Weapon)
    #other properties of Pistol

class Character
   weapon = Rifle()
   long=0.6
   def calcHit()
      return self.long*weapon.hit

john = Character()
john.weapon= Rifle()
john.calcHit
于 2008-10-26T11:39:29.587 に答える
0

キャラクターの属性用のクラス(つまり、キャラクタークラスにたくさんのものがない)と武器の属性用のクラスがあります。

class WeaponAttribute(object):

    short_mod = 0.6
    med_mod = 0.3
    long_mod = 0.1

    def __init__(self, base):
        self.base = base

    @property
    def short(self):
        return self.base * self.short_mod

    @property
    def med(self):
        return self.base * self.med_mod

    @property
    def long(self):
        return self.base * self.long_mod


class CharacterAttributes(object):

    def __init__(self, attributes):
        for weapon, base in attributes.items():
            setattr(self, weapon, WeaponAttribute(base))

CharacterAttributes文字クラスにオブジェクトがあり、次のように使用します。

# Initialise
self.charAttribs = CharacterAttributes(self.skill_dict)
# Get some values
print self.charAttribs.CRM.short
print self.charAttribs.PST.med
print self.charAttribs.LCG.long
于 2008-10-27T05:14:52.530 に答える
0

@Vinko: おそらく calcBaseHitNumbers を作成し、「if not self.calculatedBase:」チェックを内部で実行し、以前に実行された場合は何もしません。とはいえ、この情報を事前に計算する必要性が差し迫っているとは思えません。しかし、私は Python パフォーマンスの専門家ではありません。

于 2008-10-26T11:35:07.303 に答える
0

躍動感とは?何が変化する可能性がありますか? スキルの数、加重係数、範囲の数 (ショート、ミドル、ロング)、またはこれらすべて?

その後、(例) bhPST_* 値はどうなりますか?それらは 1 つの数値に結合されますか?

飛び出すことの1つは、スキルのリストがコードに組み込まれていることです.bh変数をメソッドに置き換える傾向があります.

だから(私はPythonについて最初に知らないことを考慮してください:))

def bh_short(self, key)
  skill = self.skill_dict.get(key, 0)
  return skill * 0.6

これで、ヒット ポイントに貢献するスキルのリストを保持し、その呼び出し bh_short などを反復処理できます。

関数に範囲 (long med short) を渡すか、3 つの値すべてを返すこともできます。これはすべて、計算されたヒットポイントを使用して次に何をするかによって異なります。

基本的に、これが使用されるコンテキストについてより多くの情報が必要です

于 2008-10-26T11:39:38.650 に答える