beginner11
@beginner11 (晃希 林)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Pythonの戦闘ゲーム作成に当たって、分からない事が色々と……

概要

現在Pythonで、以前C言語で作成していたゲームの移植を行っています。
しかし、その中で上手くいかない点が多々あるのですが、それについてご指摘いただきたいです。少々拙いコードですが、色々とご指摘いただけるとありがたいです。

現段階での問題点

1.プレイヤーの名前が最初の部分(「勇者○○よ、行け!」の部分)でしか反映されず、以降ゲーム内では無記入状態になってしまう所。
2.ダメージの数値が常時一定(例:ゲーム開始から敵撃破まで与えられるダメージがずっと5のままでとても単調になってしまう)で、ゲーム終了時までそれが続く。

player.py
class Player:
    def __init__ (self,name:str):
        self.name=name
game.py
import keyboard
import random
import sys
import time
from random import randint
from player import Player
playerHP=200
enemyHP=200
playerMP=20
MPuse=25

random.seed(20)
attack_my=random.randint(20,30)
attack_cpu=random.randint(20,30)

player_name=str()
button=None

playerguard=10
enemyguard=10
def title():
    print("******************")
    print("*かんたんクエスト*")
    print("******************")

def name_entry():
    player_name=input('名前を入力してください>>>')
    player=Player(player_name)
    print('勇者{}よ、行け!'.format(player.name),sep='')

def show_text(player_name):
    print(format(player_name))

def standby():
    print("aキー(攻撃)を押してください\n")
    print("何かキーを打ってください\n")

def turn():
    global player_name
    print("***{}のターン!***".format(player_name),sep='')
    button=input("ボタンを押してね")

    if button=="a":
        global enemyHP
        global playerHP
        global attack_my
        global attack_cpu
        global playerguard
        global enemyguard

        if enemyHP > 0:
            time.sleep(1)
            enemyHP=enemyHP-(attack_my-enemyguard)
            print("モンスター:{}のダメージ".format(int(attack_my-playerguard)))
            print("\n")
        if playerHP > 0:    
            if enemyHP > 0:
                print("***敵のターン!***\n")
                playerHP=playerHP-(attack_cpu-playerguard)
                print("{}:{}のダメージ".format(player_name,int(attack_cpu-playerguard)))
    else:
        time.sleep(1)
        print("WAIT")

while True:
    title()
    name_entry()
    
    while True:
        print("\n")
        print("",str(player_name),"のHP:",int(playerHP)," 敵のHP:",int(enemyHP),"\n")
        standby()
        turn()

        if enemyHP<=0:
            print("モンスターを倒した!\n")
            print("************")
            print("*GAME CLEAR*")
            print("************")
            sys.exit()

        elif playerHP<=0:
            print("{}は敗れた・・・\n".format(player_name))
            print("GAME OVER")
            sys.exit()

自分で試したこと

インターネットでPythonのゲーム作成についての記事を色々と調べてみたのですが、なかなか上手くいかず苦戦しています。

0

2Answer

1.プレイヤーの名前が最初の部分(「勇者○○よ、行け!」の部分)でしか反映されず、以降ゲーム内では無記入状態になってしまう所。

以下の箇所で、player_name、player ともローカル変数になっているからでは?
globalを追加してみてください。

def name_entry():
    player_name=input('名前を入力してください>>>')
    player=Player(player_name)
    print('勇者{}よ、行け!'.format(player.name),sep='')
1Like

素晴らしい挑戦です。応援しております!

1.プレイヤーの名前が最初の部分(「勇者○○よ、行け!」の部分)でしか反映されず、以降ゲーム内では無記入状態になってしまう所。

player変数をグローバルにして、printする際に、player.nameを参照するようにコードを変更すれば意図した挙動になるかと思います。

print("{}は敗れた・・・\n".format(player_name))
↓
print("{}は敗れた・・・\n".format(player.name))

2.ダメージの数値が常時一定(例:ゲーム開始から敵撃破まで与えられるダメージがずっと5のままでとても単調になってしまう)で、ゲーム終了時までそれが続く。

random.seed(20)

seed関数の引数を20のように固定値にしているので、生成される乱数が毎回一定になってしまっています。
このコードを削除するか、引数を省略すればシステム時刻が引数に使われるので、毎回ランダムな値が生成されるようになって意図した挙動になるかと思います。
参考サイト:https://docs.python.org/ja/3/library/random.html

1Like

Comments

  1. @beginner11

    Questioner

    @alicecoder96さん、ご返答ありがとうございます。
    何度か参考サイトの方を見て、コーディングし直したのですが、どうやっても毎ターン同じ数値になってしまいます……。
    例えば最初のターンで5ダメージになったら、敵撃破まで毎ターンずっと数値が変わりません。

Your answer might help someone💌