0

Python 3 を呼び出すたびにリストからランダムな項目を選択するにはどうすればよいですか? これを行う必要がある関数が 2 つあります。item = random.randint() と item = random.choice() を試しましたが、それらは一度だけランダム化してアイテムに保存します。

これが2つの機能です。関数 1 では、呼び出すたびにアイテムをランダム化する必要があるため、プレイヤーは毎回ランダムなアイテムを取得します。機能 2 では、プレイヤーとネズミの攻撃を、選択した数値内でランダム化する必要があります。つまり、プレイヤーが攻撃するときは常に 10 から 30 の間であり、ネズミが攻撃するときは 10 から 15 の間です。これを毎ターン行う必要があります。

これは可能ですか?

機能 1.

def chest(sector):
    item = random.choice(items)
    print("You see a chest, you unlock it and inside is '{0}'".format(item))
    print()
    if item in inventory:
        print("You already have a {0}".format(item))
    item_take = input("Do you wish to take the '{0}'?: ".format(item)).lower()
    if item_take == ("yes"):
        inventory.append(item)
        if item == "Armor":
            player["hp"] = 150
        print("The {0} has been added to your inventory!".format(item))
        sector()
    else:
        print("You don't take the '{0}'!".format(item))
        print()
        sector()

機能 2。

player = dict(
    name = " ",
    att = random.randint(10, 30),
    hp = 100,)

rat = dict(
    name = "Rat",
    att = random.randint(10, 15),
    hp = 20,)


def attack(player, enemy):
    firstAtt = random.randint(1, 2)#Player = 1, Enemy = 2. Checks to see who goes first.
    if firstAtt == 1:
        while player["hp"] > 0 and enemy["hp"] > 0:
            enemy["hp"] = enemy["hp"] - player["att"]
            print("You have dealt {0} damage to the {1}!".format(player["att"], enemy["name"]))
            if enemy["hp"] <= 0:
                print()
                print("You have killed the {0}".format(enemy["name"]))
                print("You have {0}HP left.".format(player["hp"]))
                break

            player["hp"] = player["hp"] - enemy["att"]
            print("The {0} has dealt {1} damage to you!".format(enemy["name"], enemy["att"]))
            if player["hp"] <= 0:
                print()
                print("The {0} has killed you!".format(enemy["name"]))
                break

    elif firstAtt == 2:
        while player["hp"] > 0 and enemy["hp"] > 0:
            player["hp"] = player["hp"] - enemy["att"]
            print("The {0} has dealt {1} damage to you!".format(enemy["name"], enemy["att"]))
            if player["hp"] <= 0:
                print()
                print("The {0} has killed you!".format(enemy["name"]))
                break

            enemy["hp"] = enemy["hp"] - player["att"]
            print("You have dealt {0} damage to the {1}".format(player["att"], enemy["name"]))
            if enemy["hp"] <= 0:
                print()
                print("You have killed the {0}".format(enemy["name"]))
                print("You have {0}HP left.".format(player["hp"]))
                break
4

2 に答える 2

2

chest()結構です。

の場合attack()att要素を関数に変換してから、適切に呼び出します。

  att=lambda: random.randint(...),

 ...

      dmg = player['att']()
       ...
于 2012-08-20T00:46:01.317 に答える
1

これを完全にクラスレスで実行しようとしている場合を除き (おそらく授業として、または関数型プログラミングや辞書を理解するための演習として)、これは Python クラスがコードを大幅にクリーンアップする状況です。これにも多数のノックオンメリットがあります。たとえば、このコードでは、攻撃の最小値と最大値に簡単にアクセスして、ボード上のキャラクターのトークンや攻撃ダイアログ ボックスに表示することができます。これは必要最小限の例です。ニーズに合わせて拡張し、さらに変更する必要があります。個人的には、攻撃へのダメージを処理する「take_damage」関数を含めます (そうすれば、自分の関数内で他のダメージ関連の効果が必要な場合、または実行する場合に、受けたダメージの関数として atk_min または atk_max を減らすことができます)。各変数、別の「現在」があります

from random import randint
class Character():
    def __init__(self, name, atk_min, atk_max, hp):
        self.name = name
        self.atk_min = atk_min
        self.atk_max = atk_max
        self.hp = hp

    def attack(self):
        return randint(self.atk_min, self.atk_max)

rat = Character('rat', 10, 15, 20)
player = Character('Player', 15, 30, 100)

コードが長いことは知っていますが、それははるかに発見しやすいものであり、未来のあなたが今から 2 年間、現在のあなたに感謝することになるでしょう (私が 2 年間放置した問題に 2,000 行近くのくだらないコードを書いた人からそれを受け取ってください。知的に変更するのに十分なほどうまく機能するはずだったことがわからなくなったため、すべてを捨てなければなりませんでした)。

于 2012-08-20T08:16:45.210 に答える