beginner11
@beginner11

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

戦闘ゲームのダメージ計算について

解決したい事項

PythonでRPG風ゲームを作っている話は以前したのですが、そのダメージ計算式が上手くいきません…。

発生している問題

・計算式の例

playerHP=playerHP-(attack_cpu/2-playerguard/4)

HP:250の場合
この計算式だとダメージ数値が1つずれて、本来なら14ダメージ(残りHP:236)としたはずなのに、13ダメージになり、250-13で237になってしまうことがざらにあるという…。

該当するソースコード

game.py
import keyboard
import random
import sys
import time
from random import randrange 
from random import randint
from player import Player

playerHP=250
enemyHP=250
playerMP=30
enemyMP=30
MPuse=5

player_name=str()
button=None

playerguard=randint(20,30)
enemyguard=randint(20,30)
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 standby():
    print("aキー(攻撃)またはmキー(魔法)、gキー(防御)を押してください\n")
    print("何かキーを打ってください\n")

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

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

        attack_my=randint(35,50)
        attack_cpu=randint(35,50)

        if enemyHP > 0:
            time.sleep(1)
            enemyHP=enemyHP-(attack_my/2-enemyguard/4)
            print("モンスター:{}のダメージ".format(int(attack_my/2-playerguard/4)))
            print("\n")
        if playerHP > 0:    
            if enemyHP > 0:
                print("***敵のターン!***")
                per=random.uniform(0.01,1.00)
                if per>0.30:
                    playerHP=playerHP-(attack_cpu/2-playerguard/4)
                    print("モンスター「喰らえ!」")
                    print("{}:{}のダメージ".format(player.name,int(attack_cpu/2-playerguard/4)))
                    time.sleep(1)
                if per<=0.30:
                    if enemyMP > 0:
                        time.sleep(1)
                        playerHP=playerHP-(attack_cpu/2-playerguard/4)
                        enemyMP-=MPuse
                        print("モンスター:「ファイアボール!」")
                        print("{}:{}のダメージ".format(player.name,int(attack_cpu/2-playerguard/4)))
                        time.sleep(1)
                    if enemyMP <= 0:
                        print("モンスター:「MPが足りない!」")

    if button=="m":
        global magic_my
        global playerMP

        attack_my=randint(35,50)
        attack_cpu=randint(35,50)
        magic_my=randint(55,70)
        magic_enemy=randint(55,70)
        
        if playerMP > 0:
            time.sleep(1)
            print("{}:「サンダーシュート!」".format(player.name),sep='')
            if enemyHP > 0:
                time.sleep(1)
                enemyHP=enemyHP-(magic_my/2-enemyguard/4)
                playerMP-=MPuse
                print("モンスター:{}のダメージ".format(int(magic_my/2-playerguard/4)))
                time.sleep(1)
        else:   
            print("{}:「MPが足りない!」".format(player.name))
            
        if playerHP > 0:
            if enemyHP > 0:
                print("***敵のターン!***")
                per=random.uniform(0.01,1.00)
                if per>0.30:
                    time.sleep(1)
                    playerHP=playerHP-(attack_cpu/2-playerguard/4)
                    print("モンスター:「喰らえ!」")
                    print("{}:{}のダメージ".format(player.name,int(attack_cpu/2-playerguard/4)))
                    time.sleep(1)
                if per<=0.30:
                    if enemyMP > 0:
                        time.sleep(1)                        
                        playerHP=playerHP-(magic_enemy/2-playerguard/4)
                        enemyMP-=MPuse
                        print("モンスター:「ファイアボール!」")
                        print("{}:{}のダメージ".format(player.name,int(magic_enemy/2-playerguard/4)))
                        time.sleep(1)
                    else:
                        print("モンスター:「MPが足りない!」")

    if button=="g":
        if per >= 0.10:
            time.sleep(1)
            print("{}:「盾で防ぐぞ!」\n".format(player.name))
            print("***敵のターン!***")
            if enemyHP>0:
                print("モンスター:「ファイアボール!」")

            else:
                print("モンスター:「喰らえ!」")
                time.sleep(1)
                print("モンスター:「やるな」")
                print("{}:{}のダメージ".format(player.name,int(attack_cpu/2-playerguard/4)))
        elif per < 0.10:
            if enemyHP > 0:
                print("***敵のターン!***")
                per=random.uniform(0.01,1.00)
                if per > 0.30:
                    time.sleep(1)
                    playerHP=playerHP-(attack_cpu/2-playerguard/4)
                    print("モンスター:「喰らえ!」")
                    print("{}:{}のダメージ".format(player.name,int(attack_cpu/2-playerguard/4)))
                    time.sleep(1)
                if per<=0.30:
                    if enemyMP > 0:
                        time.sleep(1)                        
                        playerHP=playerHP-(magic_enemy/2-playerguard/4)
                        enemyMP-=MPuse
                        print("モンスター:「ファイアボール!」")
                        print("{}:{}のダメージ".format(player.name,int(magic_enemy/2-playerguard/4)))
                        time.sleep(1)
                    else:
                        print("モンスター:「MPが足りない!」")

            
while True:
    title()
    name_entry()
    
    while True:
        print("\n")
        print("",str(player.name),"のHP:",int(playerHP)," 敵のHP:",int(enemyHP),"\n",str(player.name),"のMP:",int(playerMP)," モンスターのMP:",int(enemyMP),"\n",sep='')
        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()

自分で試行してみたこと

計算式をFractionに直してみたものの、エラーを吐いてしまって駄目でした。

0

1Answer

Comments

  1. @beginner11

    Questioner

    先程@amateさんから教えていただいた方法を実践してみた所、ダメージ計算が正常なものになりました。教えて下さり、ありがとうございます。

Your answer might help someone💌