0

コードを実行してゲームの戦闘部分に到達すると、キャラクターの攻撃、防御、ダメージ、および健康にランダムな値が割り当てられます。ただし、最初のターン以降は同じ値を取得し続け、リセットすることはできません。

たとえば、ユーザーの攻撃は 4 から 11 までの乱数です。プログラムは 5 を「ロール」し、それを変数 userAtk に割り当てます。

userAtk = random.randint(4,11)

ループが実行されるたびに、新しい値が生成されると想定しました。しかし、そうではなく、変数を出力するたびに、最初に割り当てられたのと同じ値になります。何か不足していますか?

以下は私のコードです

import random

# VARIABLES
#
#
# This variable is the user's character name
userName = input("Brave warrior, what is your name? ")

# This variable is used in the input function to pause the game
enterNext = ("Press enter to continue...")

# This variable is used to format the user input prompt
# as well as the battle text
prompt = ">>>>>  "

# This variable is used to add a new line to a string
newLine = "\n"

# This variable is used to display a message when the hero dies
heroDeadmsg = userName + " has fallen!"

# These variables represent the dragon's stats (HP, ATK & DEF)
dragonHp = 100
dragonAtk = random.randint(5,10)
dragonDef = random.randrange(8)

# These variables represent the user's stats (HP, ATK & DEF)
userHp = 90
userAtk = random.randint(4,11)
userDef = random.randrange(8)

# These variables calculate battle damage and HP
dragonDmg = (userAtk - dragonDef)
dragonHp -= dragonDmg
userDmg = (dragonAtk - userDef)
userHp -= userDmg

# This variable prints the options in the battle menu
battleMenu = """Attack (a) - Magic (m) - Item (i) - Run (r)""" 

# This variable determines who goes first
cointoss = random.randint(0, 1)

# These variables print the actions in each turn
dragonAttack = \
    prompt + "Crimson Dragon attacks you with " + str(dragonAtk) + " ATK!"\
    + newLine + prompt + "You defend with " + str(userDef) + " DEF!"\
    + newLine + prompt

userAttack = \
    prompt + "You attacked with " + str(userAtk) + " ATK!"\
    + newLine + prompt + "Crimson Dragon defends with " + str(dragonDef) + " DEF!"\
    + newLine + prompt

userMagic = \
    prompt + userName + " tried to use Magic!"\
    + newLine + prompt + userName + " has no magic!"\
    + newLine + prompt

userItem = \
    prompt + userName + " tried use an Item!"\
    + newLine + prompt + userName + " has no Items!"\
    + newLine + prompt

userRetreat = \
    prompt + userName + " tries to retreat!"\
    + newLine + prompt + "The enemy won't let you escape!"\
    + newLine + prompt


# These variables show health during battle 
printDragonhp = "Crismon Dragon has " + str(dragonHp) + " HP remaining!"
printUserhp = userName + " has " + str(userHp) + " HP remaining!"

# This variable simulates the results of a coin toss
coinToss = random.randint(0, 1)


#
#
# CONDTITIONS
#
#
# These conditions determines who attacks first
if coinToss == 0:
    currentTurn = "dragon"
elif coinToss == 1:
    currentTurn = "user"
else:
    print("The Coin Toss Failed!")    

#
#
# BATTLE MECHANICS
#
#

while currentTurn:
# Mechanics for the Crimson Dragon's Turn
if currentTurn == "dragon":

    # Prints the Crimson Dragon's Attack and ends the turn
    print(newLine + prompt + "Crimson Dragon moves!"\
          + newLine + prompt + newLine + dragonAttack\
          + newLine + prompt + userName + " takes " + str(userDmg) + " DMG!"\
          + newLine + prompt + printUserhp)
    currentTurn = "user"
    input(prompt)

    # Need to implent a way to reset ATK and DEF

# Mechanics for the User's Turn    
if currentTurn == "user":

    # Prints the Battle Menu and asks for the User's choice
    print(newLine + prompt + battleMenu\
          + newLine + prompt)
    userChoice = input(prompt)

    # Prints the User's Attack and ends the turn
    if userChoice == "a":
        print(userAttack)
        if userHp < 1:
            print(heroDeadmsg)
            break

        input (prompt)
        currentTurn = "dragon"
    # Prints the User's Magic and ends the turn
    elif userChoice == "m":
        print(userMagic)
        input (prompt)
        currentTurn = "dragon"
    # Prints the User's Item and ends the turn   
    elif userChoice == "i":
        print(userItem)
        input (prompt)
        currentTurn = "dragon"
    # Prints the User's Retreat and ends the turn    
    elif userChoice == "r":
        print(userRetreat)
        input (prompt)
        currentTurn = "dragon"
    # Prints an error message for invalid entries
    else:
        print(newLine + prompt + "That is not a valid menu item."\
              + newLine + prompt + "Please try again.")
4

3 に答える 3

3

random.randint(4,11)範囲内の整数を選択するだけで、[4, 11]その数値が返されます。したがって、 を実行userAtk = random.randint(4,11)すると、数値を取得して として格納するだけでuserAtk、アクセスするたびuserAtkに同じ数値が返されます。

アクセスするたびuserAtkに範囲内の異なる数値のように振る舞うような魔法のようなものになりたいと思っていたなら…まあ、それは不可能ではありません(簡単で汚い刺し傷については、ここを参照してください)…しかし、ほぼ確実に利益よりも混乱を招きます。[4, 11]

たとえば、出力しようとするコードがあるとしますstr(userAtk)…しかし、アクセスするたびに値が異なる場合、出力されるものはダメージの計算に使用されるものとは異なります! あなたが卓上で D&D をプレイしていて、ダンジョン マスターがサイコロを振ってあなたのロールを伝え、すぐに結果を忘れてもう一度ロールして、あなたがヒットしたかどうかを判断したとします。それで、彼は「あなたは 20 を出しました。失敗しました」と言うかもしれません。それは良くないね。

役に立つかもしれないuserAtkのは、実際に関数にすることです:

def userAtk():
    return random.randint(4, 11)

同様に、同様のすべての変数についても同様です。次に、番号にアクセスしていたところはどこでも、代わりに関数を呼び出します。

def dragonDmg():
    return userAtk() - dragonDef()

次に、これらの関数を呼び出した結果を、各ループ内のいくつかのローカル変数に格納する必要があります。

しかし重要なのは、どのように実行するにしても、ループのたびに再計算する変数が必要だということです。

于 2013-08-20T01:59:16.003 に答える
2

userAtk私が見る限り、ループ内にないためです。ループ内でリセットしたい場合は、ループrandom.randint(4,11)内で呼び出します。

于 2013-08-19T23:47:30.057 に答える
0

randint() を100万回呼び出しても、繰り返しが発生すると思います(これは知っていると思います)。以前は、辞書を使用して使用済み/未使用の乱数を追跡し、辞書が既に使用されているかどうかを確認していました。質問を誤解したかもしれません。

于 2013-08-20T00:31:52.837 に答える