0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

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

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()

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

0
0
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?