1

私の質問にはすべての用語が正しいと思います...しかし、よくわかりません。基本的に私がやろうとしているのは、テキスト ゲームに設定されたインベントリと装備の詳細を取得することです。

私がやりたいのは、武器を持ち、剣を手に入れて、キャラクター自体の特定の側面を変えたい. キャラクターの HP が 5 程度増加するようにしましょう。

global basehp
basehp = 10
global armorhp
armorhp = 0
global skillhp
skillhp = 0
global hpmod
hpmod = (skillhp + armorhp)
global righthand
righthand = 0

hpで例を設定すると、これが実際に私のプログラムにあるものです。今、私がやりたいのは、鎧がそれを変更するものに一致するようにarmorhpを変更することです。私のhpに5を追加する剣を持っているとしましょう。私が今取り組んでいるものは機能していません。最初は、装備してアーマーHPに5を追加することを考えていましたが、装備を解除することを考え始めました...効果は同じです...私はあなたに何を示しますかつまり

def hpsword:
    armorhp = (armorhp + 5)

def prompt():
    x = raw_input("Type command>>")
    if x == 'equip':
        print "equip what?"
        print inventory
        y = raw_input(">>>>")
        if y == 'sword':
            if 'hpsword' in inventory:
                global righthand
                righthand = 1
                inventory.remove ('hpsword')
                equipmentlist.append ('hpsword')

ここから、リストなど、いくつかの項目を省略していることに気付くと思いますが、ここで、私が意味することの詳細を実際に説明できます。各項目をそのように使用したいのですが、方法がわかりません...混乱しています、私は知っています、私は頭にたくさんありますが、私はただ何かをしたいです....

def this sword():
    this sword does this thing!

次に、装備されたときに+5ヘルスなどの効果を追加し、それを取り外して効果を利用します。100行のコードを実行して、この効果を追加する一連のステートメントを使用する必要はありませんが、これ以上使用したくない場合は、右側を 0 にリセットし、それがこの数だった場合は、それを 2 に変更してさらに 10 を追加する前に、そこからこの数を取り除きます。

私はまた、剣を装備するのを避けようとしています。ヘルスを 5 獲得し、装備を外して、まだ 5 のままですか? 良い、装備、YAY 10!!!

私が少しでも意味をなすとしたら、私はショックを受けます...しかし、誰かが私が何を意味するのかを理解し、私にいくつかの指針を与えることができれば、それは素晴らしいことです!

編集:

コメントに残っているものを読んで、(Eevee に感謝します!) 私はクラスを少し理解し始めていると思います... ごくわずかです。

新しい質問です。次に、主人公のクラスを作成しますか?

class character(object):

次に、初期化を追加します

def __init__(self)

次に、次のように在庫を定義しますか?

def __init__(self)

def inventory

それとも私はこれをしますか、

def __init__(self, inventory)

あまりにも多くの質問をして申し訳ありませんが、それを理解しようとしているだけで、ここの人々は少なくとも私のようなプログラマー志望者からの質問を見るのに十分親切であることに気付きました:D

別の編集!!!!

繰り返しになりますが、たくさんのイーブイに感謝します! それを読んでも、それをコードに追加する方法と、いくつかの異なる項目に対して何を変更する必要があるかについて、まだ少し混乱しています。

いくつか説明するために、私が別のアイテムを言うとき、あなたは私にくれました

class Sword(object):
    def visit_health_bonus(self, character):
        return 5

何か違うことをする剣が欲しければ、別の名前で新しいクラスを作成するだけですが、基本的に同じことですか?

class Sword2(object):
    def visit_strength_bonus(self, character):
        return 2

それは私の力を2加える剣を私に与えますよね?

ここで私の他の質問に進みます。これを使用しようとすると、正しく機能させるために本当に必要なものは何ですか?他のビットがないと実行できないと思われる多くのことが見られます

class Sword(object):
    def visit_health_bonus(self, character): 
        return 5

# Then, every turn, recalculate health:
health = player.base_health
for equipment in player.equipment:   //would i need another class here? (player)
    # Pretend this lists everything the player has equipped; you might
    # have to check each hand manually
    health += equipment.visit_health_bonus(player)  //also going to think a class (equipment)
4

3 に答える 3

1

オブジェクト指向プログラミングの素晴らしいユーティリティのいくつかを見逃しているように思えます.Marcinが言ったことと同様に、一連のクラスを次のように作成する必要があります。

class Weapon:
    def __init__(self, name, armor_hp_bonus = 0, skill_hp_bonus = 0):
       self.skill_hp_bonus = skill_hp_bonus
       self.armor_hp_bonus = armor_hp_bonus
       self.__name__ = name

class Hero:
    def __init__(self):
        self.basehp = 10
        self.armorhp = 0
        self.skillhp = 0
        self.righthand = None
        self.inventory = []

    def choose_weapon(self):
        while True:
            for idx, item in enumerate(self.inventory):
                print '{i}: {weapon}'.format(i=idx, weapon=item.__name__)
                choice = raw_input("Pick your weapon: ")
                try:
                    self.equip(self.inventory.pop(int(choice)))
                    return
                except IndexError:
                    print "Invalid choice"
                    continue

    def equip(self, weapon):
        if self.righthand:
            print "Weapon already equipped to right hand!"
            return
        else:
            self.righthand = weapon
            self.armorhp += weapon.armor_hp_bonus
            self.skillhp += weapon.skill_hp_bonus

    def unequip(self):
        if not self.righthand:
            print "No weapon to unequip!"
            return
        self.skillhp -= self.righthand.skill_hp_bonus
        self.armorhp -= self.righthand.armor_hp_bonus
        self.inventory.append(self.righthand)
        self.righthand = None

    def acquire_weapon(self, weapon):
        self.inventory.append(weapon)

    def calc_effective_hp(self):
        return self.basehp + self.skillhp + self.armorhp

クラスを使用すると、追跡に苦労しているすべての変数を 1 か所に保管できます。このように、ある武器のスキル ボーナスが別の武器のスキル ボーナスと混同されることはありません。これは、その情報を格納する変数がオブジェクト内に含まれているためです。クラスを正しく設定すると、メソッドを呼び出すだけですべてが正しく行われていることを確認できるため、コードの残りの部分はずっと短くてきれいになります。

sword_of_1000_truths = Weapon('sword_of_1000_truths', skill_hp_bonus = 1337)
gandalf = Hero()

gandalf.acquire_weapon(sword_of_1000_truths)
gandalf.choose_weapon()

>> 0 sword_of_1000_truths
>> Pick your weapon: 0


print gandalf.calc_effective_hp()
>> 1347

gandalf.unequip()

print gandalf.calc_effective_hp()
>> 10

equipやなどの方法では、ゲームのロジックを追跡しながら、 の HP を正しくunequip増減させますHero。つまり、片手で 2 つの武器を持つことはできず、武器を持っていない場合は武器を外すことはできません。装備など。これにより、言及した醜い100行のコードを排除できます。

幸運を!お役に立てれば

于 2013-09-09T22:24:44.847 に答える
1

あなたはオブジェクトに精通していると思います。そうでない場合は、先に進む前にそれらをよく読む必要があります (LPTHW は非常に優れています)。これは、Python の中心となるものだからです。もしそうなら、6 個のグローバルではなく、Player オブジェクトを実際に使用する必要があります。

本当に簡単なアプローチは、剣を装備したときと装備していないときに何かをするオブジェクトにすることです:

class Sword(object):
    health_bonus = 5

    def on_equip(self, character):
        character.health += self.health_bonus

    def on_unequip(self, character):
        character.health -= self.health_bonus

次にon_equip、プレイヤーが剣を装備するときと、プレイヤーが剣をon_unequip外すときに呼び出します。他の武器は、おそらく異なる統計のために、同様のイベントフックを持つことができます.

それはそれで良いことなのですが、何か気にon_unequipなる点があります。プレイヤーがアイテムを紛失したときはいつでもコールすることを忘れないようにしなければならず、それが起こる方法は複数ある可能性があります。また、プレイヤーの「ベース」ヘルスを個別に追跡する必要があり、それが変化した場合、「計算された」ヘルスを更新するには、武器の装備を解除して再装備する必要がありますが、これはあまり意味がありません.

それでは、他のことを試してみましょう。Marcin が言及した「ビジター パターン」とは、(大まかに) より大きな全体のすべての部分をループし、それらに対して同じメソッドを呼び出すことを意味します。この場合、プレイヤーのすべての装備に、どのくらいの追加のヘルスを付与するかを尋ねます。

class Sword(object):
    def visit_health_bonus(self, character):
        return 5

# Then, every turn, recalculate health:
health = player.base_health
for equipment in player.equipment:
    # Pretend this lists everything the player has equipped; you might
    # have to check each hand manually
    health += equipment.visit_health_bonus(player)

これで、必要になるたびに合計ヘルスが計算されるので、たとえばプレイヤーがレベルアップしたときにそれを更新することを心配する必要はありません。また、何かが装備されていないときに余分な簿記を行うことを心配する必要はありません。装備のリストから消えるとすぐに、貢献を停止します。

ドラゴンと戦うときに攻撃力を2倍にする剣などを簡単にサポートできないため、これはまだ少し柔軟性がありません. これを解決する最も一般的な方法は、多くのもつれや余分なオブジェクトを使用し、最初にどのような効果を発生させる必要があるかを理解することです。上記のアプローチが十分な出発点になることを願っています。:)

これを解決する最も柔軟な方法は、「装備武器で攻撃する」というアクション自体をオブジェクトにし、装備、プレイヤー、ターゲットなどすべてが攻撃に反応してステータスを増加させることです。しかし、解決するのが本当に面倒な優先順位の問題があるので、そうしないでください。

于 2013-09-09T21:59:42.437 に答える
0

いくつかのこと:

  1. 5 つのグローバル変数があります。これらはクラスに移動する必要があり、関数はそのクラスのメソッドになります。

  2. このような作業を行う通常の方法は、剣がどのような変更を行うかを定義する特定のインターフェイスをサポートし、キャラクター クラスが読み取ることができるようにすることです。または、ビジター パターンを使用して、キャラクターが装備/装備解除時に剣のメソッドに自分自身を渡すようにします。

于 2013-09-09T21:35:18.700 に答える