
[code]

    class game_system:
        def __init__(self, player, monster, p_hp, m_hp):
            self.player = player
            self.monster = monster
            self.p_hp = p_hp
            self.m_hp = m_hp
           
            while p_hp < 0 or m_hp < 0:
                p_attack = int(input("enter number:"))
                m_attack = int(input("enter number:"))
                self.p_hp -= m_attack
                self.m_hp -= p_attack
                turn = 1
                print(f"{turn}ターン {self.player}の攻撃 {self.monster}は{p_attack}のダメージを受けた")
                print(f"{turn}ターン {self.monster}の攻撃 {self.player}は{m_attack}のダメージを受けた")
                turn += 1
    a = game_system
    print(a("t", "s", 50, 20))
    
[/code]


CC BY-SA 4.0
2020-11-14T01:25:03.670
71939
2023-09-20T03:03:45.800
2020-11-14T02:57:47.013
42000
question
python
簡単なゲームのコードを実行すると <... object at 0x.....> と表示される


提示されたソースが全てだとして、表示されるのがエラーではなく、以下のようなメッセージならば、それは正しい動作でしょう。

[code]

    <__main__.game_system object at 0x000001E5421D9D00>
    
[/code]

動作していないように見える(そして実際に一部分しか動作していない)直接の原因は、以下の行の不等号の向きが逆なことで、これにより`while`ループは一度も動作しません。  
なお単に不等号を逆に直すだけだとループ続行の判定としてはまだ正しくないかもしれません。  
**追記**  
例えば不等号を逆にしただけでその間が`or`のままだと両者が0以下にならないと終了しません。

[code]

    while p_hp < 0 or m_hp < 0:
    
[/code]

それと、`while`ループの判定用変数(p_hp, m_hp)と、ループ内で処理している変数(self.p_hp, self.m_hp)が違います。  
これではループに入れたとしても永久に終了しないのでは？

[code]

        self.p_hp -= m_attack
        self.m_hp -= p_attack
    
[/code]

あと`while`ループの中で`print(..)`の前に`turn = 1`しているので、表示されるターン番号は常に`1`になります。

* * *

実行して`<__main__...>`が表示されるのは、`def
__init__(...)`が戻り値を返していないことと、それを呼び出す2行の内容によっています。

以下の行は後ろに()が付いていない(=関数やメソッドとしての呼び出しでは無い)かつパラメータが指定されていないので、`game_system`クラスのインスタンスが作られて`a`という変数に格納されるだけになります。

[code]

    a = game_system
    
[/code]

次の行で`def __init__(...)`に合致したパラメータ指定されているので、初めて`def __init__(...)`が実行されます。

[code]

    print(a("t", "s", 50, 20))
    
[/code]

ただし、上記不等号の向きが逆なので、内部の変数を初期設定した後は、そのまま何もせずに終了しています。

そしてこのクラスの`def
__init__(...)`は、終了した場合に何も返していないので、print(a(...))するとオブジェクト`a`の情報を表示することになり、上記の`<__main__...>`が表示されることになります。

さらに、上記不等号の向きや処理している変数を直して`while`ループを動作させたとしても戻り値が無いのは同じなので、ループ終了後は上記の`<__main__...>`が表示されることになります。

* * *

質問者さんの意図を結構はみ出している感じですが変更の例として以下のようにしてみました。  
`####`でコメントを付けた部分が追加・変更点です。

[code]

    class game_system:
        def __init__(self, player, monster, p_hp, m_hp):
            self.player = player
            self.monster = monster
            self.p_hp = p_hp
            self.m_hp = m_hp
            
        def fight(self):    #### 初期化と戦闘は独立したメソッドとする
            self.turn = 0   #### turn変数はインスタンス変数としてwhileの処理前に初期化
            while self.p_hp > 0 and self.m_hp > 0:    #### whileループの続行条件の見直し
                p_attack = int(input("enter the player's attack points:"))    #### どちらの攻撃点入力か明確化
                m_attack = int(input("enter the monster's attack points:"))   ####
                self.p_hp -= m_attack
                self.m_hp -= p_attack
                self.turn += 1    #### ターン数の更新はここに移動
                print(f"{self.turn}ターン {self.player}の攻撃 {self.monster}は{p_attack}のダメージを受けた")
                print(f"{self.turn}ターン {self.monster}の攻撃 {self.player}は{m_attack}のダメージを受けた")
            
            #### 以下に結果を判定する処理と戻り値通知を追加。勝ち/負けはプレイヤー視点
            self.result = ''
            if self.turn == 0:
                self.result = 'no battle occurs'
            elif self.p_hp <= 0 and self.m_hp <= 0:
                self.result = 'double knockout'
            elif self.p_hp > self.m_hp:
                self.result = 'won'
            elif self.p_hp < self.m_hp:
                self.result = 'lost'
            
            #### 戦闘ターン数、プレイヤー視点の結果、プレイヤーの残りHP を戻り値として通知
            return self.turn, self.result, self.p_hp
    
    a = game_system("t", "s", 50, 20)    #### オブジェクト作成時に初期化パラメータ指定
    print(a.fight())                     #### 戦闘メソッドを呼び出して結果表示
    #### 結果を格納する変数を分けて用意しないとtupleとして表示される
    #### 上記 print(a.fight()) を以下のように変えても良い
    #### t, r, p = a.fight()
    #### print(f'戦闘ターン数:{t}, 結果:{r}, プレイヤー残りHP:{p}')
    
[/code]


CC BY-SA 4.0
2020-11-14T02:28:30.857
71940
2020-11-17T07:56:54.640
2020-11-17T07:56:54.640
26370
26370
71939
answer


  * `a` には `game_system` のインスタンスを入れます
  * `while p_hp < 0 or m_hp < 0:` は `while self.p_hp > 0 or self.m_hp > 0:` に修正します（不等号の修正とself.を付けます）

[code]

    class game_system:
        def __init__(self, player, monster, p_hp, m_hp):
            self.player = player
            self.monster = monster
            self.p_hp = p_hp
            self.m_hp = m_hp
           
            while self.p_hp > 0 or self.m_hp > 0:
                p_attack = int(input("enter number:"))
                m_attack = int(input("enter number:"))
                self.p_hp -= m_attack
                self.m_hp -= p_attack
                turn = 1
                print(f"{turn}ターン {self.player}の攻撃 {self.monster}は{p_attack}のダメージを受けた")
                print(f"{turn}ターン {self.monster}の攻撃 {self.player}は{m_attack}のダメージを受けた")
                turn += 1
    a = game_system("t", "s", 50, 20)
    
[/code]


CC BY-SA 4.0
2020-11-14T02:43:34.287
71942
2020-11-15T16:24:59.887
2020-11-15T16:24:59.887
3060
39819
71939
answer