Python初心者が簡単なRPG風テキストゲームを作ってみた結果

・はじめに
初心者ながら、Pythonで簡単なRPGゲーム風のテキストゲームをVScodeで作ってみました。
かなりお粗末な出来ではありますが、こういったシステムになっています。

```Python:python_battle_game_cord.py
#python_battle_game_cord.py
import keyboard
import random
from random import randint 
from random import uniform

#プレイヤーのクラス（名前のみ格納）
class Player:
    def __init__ (self,name:str):
        self.name=name

#呪文名
thunder="サンダーシュート"
flame="フレイムバースト"

#魔法の切り替え
magics={1:thunder,2:flame}

#敵キャラのクラス（名前などいろいろ格納）
class Monster:
    def __init__(self,name,spell,hp,mp,ap,ap_m,gp):
        self.name=name
        self.spell=spell
        self.hp=hp
        self.mp=mp
        self.ap=ap
        self.ap_m=ap_m
        self.gp=gp

#敵データ
knight=Monster("ゴーストナイト","ダークスラッシュ",200,30,randint(50,55),randint(60,65),20)
dragon=Monster("ギルドラゴン","バーンフレイム",270,40,randint(60,65),randint(70,75),25)
wizard=Monster("ダークウィザー","キルストーム",220,50,randint(70,75),randint(80,85),25)
caeser=Monster("ネビュラシーザー","ヘル・デストロイ",300,60,randint(80,85),randint(100,105),30)

#ランダムに対戦相手を選ぶ→決定
monsters=[knight,dragon,wizard,caeser]
monster=random.choice(monsters)

import sys
import time

#プレイヤーステータス
playerHP=300
HPmax=300
playerMP=30
enemyMP=30
playerguard=random.randint(40,45)
MPuse=5
MPuse_F=10
heal_d=5
drink=1
add=100

player_name=str()
button=None

#処理云々
def title():
    print("*************************************")
    print("*かんたんクエスト ～勇者よいそげ！～*")
    print("*************************************")

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

#ここでプレイヤー名の出力
def show_text(player_name):
    print(format(player_name))

#出現したモンスターを表示
def appear():
    print(monster.name+'出現！\n',sep='')

#操作説明
def standby():
    print("a（攻撃）またはm（攻撃魔法）、s（強力攻撃魔法）、g（防御）、d（回復薬）を押してください\n")
    print("何かキーを打ってください\n")

#攻撃力一覧
def monster_ap():
    knight(ap=randint(50,55),ap_m=randint(60,65),gp=20)
    dragon(ap=randint(60,65),ap_m=randint(70,75),gp=25)
    wizard(ap=randint(70,75),ap_m=randint(80,85),gp=25)
    caeser(ap=randint(80,85),ap_m=randint(100,105),gp=30)

#主人公のターンが回ってきた時のメッセージ
def turn():
    print("***{}のターン！***".format(player.name),sep='')
    button=input("ボタンを押してね")

    #通常攻撃
    if button=="a":
        global playerHP
        global enemyMP
        global attack_my
        global attack_cpu
        global playerguard
        global magic_enemy
        global per

        attack_my=randint(55,60)
        attack_cpu=randint(55,60)

        if monster.hp > 0:
            time.sleep(1)
            monster.hp=monster.hp-(attack_my//2-monster.gp//4)
            print("{}：{}のダメージ".format(monster.name,attack_my//2-monster.gp//4))
            time.sleep(1)
        if playerHP > 0:    
            if monster.hp > 0:
                print("***敵のターン！***")
                per=random.uniform(0.01,1.00)
                if per>0.30:
                    playerHP=playerHP-(monster.ap//2-playerguard//4)
                    print("{}：「喰らえ！」".format(monster.name))
                    print("{}：{}のダメージ".format(player.name,monster.ap//2-playerguard//4))
                    time.sleep(1)
                if per<=0.30:
                    if monster.mp > 0:
                        playerHP=playerHP-(monster.ap_m//2-playerguard//4)
                        monster.mp-=MPuse
                        print("{}：「{}！」".format(monster.name,monster.spell))
                        print("{}：{}のダメージ".format(player.name,monster.ap_m//2-playerguard//4))
                        time.sleep(1)
                    if monster.mp <= 0:
                        print("{}：「MPが足りない！」".format(monster.name))

    #攻撃魔法
    if button=="m":
        global magic_my
        global playerMP

        magic_my=randint(85,90)
        magic_enemy=randint(85,90)
        
        if playerMP > 0:
            time.sleep(1)
            print("{}：「{}！」".format(player.name,magics[1]),sep='')
            if monster.hp > 0:
                time.sleep(1)
                monster.hp=monster.hp-(magic_my//2-monster.gp//4)
                playerMP-=MPuse
                print("{}：{}のダメージ".format(monster.name,magic_my//2-monster.gp//4))
                time.sleep(1)
        else:   
            print("{}：「MPが足りない！」".format(player.name))
            
        if playerHP > 0:
            if monster.hp > 0:
                print("***敵のターン！***")
                per=random.uniform(0.01,1.00)
                if per>0.30:
                    time.sleep(1)
                    playerHP=playerHP-(monster.ap//2-playerguard//4)
                    print("{}：「喰らえ！」".format(monster.name))
                    print("{}：{}のダメージ".format(player.name,monster.ap//2-playerguard//4))
                    time.sleep(1)
                if per<=0.30:
                    if monster.hp > 0:
                        time.sleep(1)                        
                        playerHP=playerHP-(monster.ap_m//2-playerguard//4)
                        monster.mp-=MPuse
                        print("{}：「{}！」".format(monster.name,monster.spell))
                        print("{}：{}のダメージ".format(player.name,monster.ap_m//2-playerguard//4))
                        time.sleep(1)
                    else:
                        print("{}：「MPが足りない！」".format(monster.name))

    #強力攻撃魔法
    if button=="s":

        magic_my=randint(105,110)
        
        if playerMP > 0:
            time.sleep(1)
            print("{}：「{}！」".format(player.name,magics[2]),sep='')
            if monster.hp > 0:
                time.sleep(1)
                monster.hp=monster.hp-(magic_my//2-monster.gp//4)
                playerMP-=MPuse_F
                print("{}：{}のダメージ".format(monster.name,magic_my//2-monster.gp//4))
                time.sleep(1)
        else:   
            print("{}：「MPが足りない！」".format(player.name))
            
        if playerHP > 0:
            if monster.hp > 0:
                print("***敵のターン！***")
                per=random.uniform(0.01,1.00)
                if per>0.30:
                    time.sleep(1)
                    playerHP=playerHP-(monster.ap//2-playerguard//4)
                    print("{}：「喰らえ！」".format(monster.name))
                    print("{}：{}のダメージ".format(player.name,monster.ap//2-monster.gp//4))
                    time.sleep(1)
                if per<=0.30:
                    if monster.hp > 0:
                        time.sleep(1)                        
                        playerHP=playerHP-(monster.ap_m//2-playerguard//4)
                        monster.mp-=MPuse
                        print("{}：「{}！」".format(monster.name,monster.spell))
                        print("{}：{}のダメージ".format(player.name,monster.ap_m//2-monster.gp//4))
                        time.sleep(1)
                    else:
                        print("{}：「MPが足りない！」".format(monster.name))
        
    #防御
    if button=="g":
        per=random.uniform(0.01,1.00)
        per2=random.uniform(0.01,1.00)
        if (per >= 0.10) & (per2 > 0.30) & (per2 <= 1.00):
            time.sleep(1)
            print("{}：「盾で防ぐぞ！」\n".format(player.name))
            print("***敵のターン！***")
            if monster.hp > 0:
                print("{}：「喰らえ！」".format(monster.name))
                time.sleep(1)
                print("攻撃を弾いた！")
                time.sleep(1)
                print("{}：「やるな」".format(monster.name))
            if monster.mp>0:
                if (per >= 0.10) & (per2 <= 0.30):
                    print("{}：「{}！」".format(monster.name,monster.spell))
                    time.sleep(1)
                    print("攻撃を弾いた！")
                    time.sleep(1)
                    print("{}：「やるな」".format(monster.name))
        elif (per < 0.10) & (per2 > 0.30) & (per2 <= 1.00):
            if monster.hp > 0:
                print("***敵のターン！***")
                per=random.uniform(0.01,1.00)
                time.sleep(1)
                playerHP=playerHP-(monster.ap//2-monster.gp//4)
                print("{}：「喰らえ！」".format(monster.name))
                print("{}：{}のダメージ".format(player.name,monster.ap//2-monster.gp//4))
                time.sleep(1)
        if (per > 0.10) & (per2 <= 0.30):
            if monster.mp > 0:
                print("***敵のターン！***")
                per=random.uniform(0.01,1.00)
                time.sleep(1)                        
                playerHP=playerHP-(monster.ap_m//2-player.gp//4)
                monster.mp-=MPuse
                print("{}：「{}！」".format(monster.name,monster.spell))
                print("{}：{}のダメージ".format(player.name,monster.ap_m//2-playerguard//4))
                time.sleep(1)
            else:
                print("{}：「MPが足りない！」".format(monster.name))

    #回復薬を飲む
    if button=="d":
        global heal_d
        global drink
        global add
        if HPmax<=playerHP:
                print("{}：「今はいらないな」".format(player.name))
                return turn()
        if drink>0:
            heal_d-=drink
            playerHP+=add
            if playerHP>300:
                playerHP=300
            print("{}：「力がみなぎって来たぞ！」".format(player.name))
            print("ライフが回復した！")
        if drink<=0:
            print("{}：「回復薬が無い！」".format(player.name))
        per=random.uniform(0.01,1.00)
        if per>=0.30:
            if monster.hp > 0:
                print("***敵のターン！***")
                time.sleep(1)
                playerHP=playerHP-(monster.ap//2-playerguard//4)
                print("{}：「喰らえ！」".format(monster.name))
                print("{}：{}のダメージ".format(player.name,monster.ap//2-playerguard//4))
                time.sleep(1)
        if per<0.30:
            if monster.hp > 0:    
                if monster.mp > 0:
                    print("***敵のターン！***")
                    time.sleep(1)                        
                    playerHP=playerHP-(monster.ap_m//2-playerguard//4)
                    monster.mp-=MPuse
                    print("{}：「{}！」".format(monster.name,monster.spell))
                    print("{}：{}のダメージ".format(player.name,monster.ap_m//2-playerguard//4))
                    time.sleep(1)
            else:
                print("{}：「MPが足りない！」".format(monster.name))


#ゲームの一連の動作            
while True:
    title()
    name_entry()
    time.sleep(1)
    appear()
    time.sleep(1)
    
    while True:
        print("\n",str(player.name),"のHP:",int(playerHP)," ",str(player.name),"のMP:",int(playerMP)," ","残り回復薬:",int(heal_d),"\n{}のHP:".format(monster.name),int(monster.hp),""," {}のMP:".format(monster.name),int(monster.mp),"\n",sep='')
        standby()
        turn()

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

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

```

・あとがき
 以上のようなガバガバプログラムになっているのですが、突っ込みどころ満載なので、まだ改良の余地があると思います。
 ではまた。