2

私はPythonを学び始めたばかりで、皆さんが私が物事をもう少しよく理解するのを手伝ってくれることを願っています。あなたがゲームボーイのためにポケモンゲームをプレイしたことがあるなら、あなたは私がやろうとしていることについてもっと理解するでしょう。私はあなたが簡単なことをするテキストアドベンチャーから始めました、しかし今私はポケモンがお互いに戦っているところです。これが私が達成しようとしていることです。

  • ポケモンバトル開始
  • あなたはターゲットを攻撃します
  • ターゲットはHPを失い、攻撃します
  • 最初の1から0馬力は負けます

もちろん、これはすべて印刷されています。

これは私がこれまでの戦いのために持っているものです、私は今私がどれほど正確であるかわかりません。私がこれを正しく行うことにどれだけ近づいているかを本当に見ています。

class Pokemon(object):  
    sName = "pidgy"
    nAttack = 5
    nHealth = 10
    nEvasion = 1


    def __init__(self, name, atk, hp, evd):
        self.sName = name
        self.nAttack = atk
        self.nHealth = hp
        self.nEvasion = evd


    def fight(target, self):
        target.nHealth - self.nAttack



def battle():
    print "A wild  appeared" 
    #pikachu = Pokemon("Pikafaggot", 18, 80, 21)
    pidgy = Pokemon("Pidgy", 18, 80, 21)
    pidgy.fight(pikachu)
    #pikachu.fight(pidgy)   

ここに完全なコード:http: //pastebin.com/ikmRuE5z

変数の管理方法についてのアドバイスも探しています。変数の食料品リストが一番上にあるようですが、それは良い習慣ではないと思います。どこに行けばいいですか?

4

3 に答える 3

3

もし私がfightインスタンスメソッドとして持っているとしたら (私はそうするかどうかはわかりません)、おそらく次のようにコード化するでしょう:

class Pokemon(object):
    def __init__(self,name,hp,damage):
        self.name = name     #pokemon name
        self.hp = hp         #hit-points of this particular pokemon
        self.damage = damage #amount of damage this pokemon does every attack

    def fight(self,other):
        if(self.hp > 0):
            print("%s did %d damage to %s"%(self.name,self.damage,other.name))
            print("%s has %d hp left"%(other.name,other.hp))

            other.hp -= self.damage
            return other.fight(self)  #Now the other pokemon fights back!
        else:
            print("%s wins! (%d hp left)"%(other.name,other.hp))
            return other,self  #return a tuple (winner,loser)

pikachu=Pokemon('pikachu', 100, 10)
pidgy=Pokemon('pidgy', 200, 12)
winner,loser = pidgy.fight(pikachu)

もちろん、ダメージの量はポケモンの種類に依存せず、ランダム化されていないため、これはやや退屈です...しかし、うまくいけばそれは要点を示しています.

あなたのクラス構造については:

class Foo(object):
    attr1=1
    attr2=2
    def __init__(self,attr1,attr2):
        self.attr1 = attr1
        self.attr2 = attr2

で上書きすることが保証されている場合、クラス属性を宣言することは(私にとって)本当に意味がありません__init__。インスタンス属性を使用するだけで問題ありません(つまり):

class Foo(object):
    def __init__(self,attr1,attr2):
        self.attr1 = attr1
        self.attr2 = attr2v
于 2012-07-29T04:11:45.220 に答える
2
  1. 上の変数は必要ありません。init () メソッドでそれらが必要なだけです。
  2. Fight メソッドは次の値を返す必要があります。

    def fight(self, target): 
        target.nHealth -= self.nAttack
        return target
    
  3. 誰かが戦いに負けたかどうかも確認したいでしょう:

    def checkWin(myPoke, target):
        # Return 1 if myPoke wins, 0 if target wins, -1 if no winner yet.
        winner = -1
        if myPoke.nHealth == 0:
            winner = 0
        elif target.nHealth == 0:
            winner = 1
        return winner
    

私が助けてくれることを願っています。

于 2012-07-29T04:08:12.113 に答える
2

完全なコード レビューはこのサイトの範囲を超えているため、いくつかの明白な側面についてのみコメントします ( codereview.stackexchange.comを試してください) 。

fight()メソッドは減算の結果を保存していないため、何も変更されていません。次のようにする必要があります。

def fight(target, self):
    target.nHealth -= self.nAttack
    # check if target is dead now?

ターゲットに直接変更を加えないことをお勧めします。attack(power)ターゲットに を呼び出して、ダメージ量を決定できるようにすると良いかもしれません。その後、ターゲットがまだ死んでいるかどうかを確認できます。最終的には、結果を決定する「サイコロ」オブジェクトがあると思います。

グローバルについては...使用をやめてください。本当に正当な理由がない限り、それらを持つのは悪い習慣です。結果を呼び出し元に返す関数を用意し、それを利用します。

def func(foo):
    return 'bar'

ただし、定数のモジュールを持つことはできます。これらは、アプリケーションの存続期間中変更されない一連の値です。これらは、共通の値を提供する単なる変数です。constants.pyを作成して、次のようなものを作成できます。

UP = "up"
DOWN = "down"
DEAD = 0
...

...そして、他のモジュールでは次のことを行います。

from constants import *
于 2012-07-29T04:10:40.007 に答える