【问题标题】:Modifying Variables (Player Attributes) Python 3修改变量(玩家属性)Python 3
【发布时间】:2018-08-18 03:27:54
【问题描述】:

嘿,所以我正在制作一个 RPG 文字游戏,但我遇到了一个问题,即让盔甲增加玩家的最大生命值。我试图使用定义来实现这一点,现在@property 都让我失败了。附件是我的整个代码,您可以自己运行它。没有出现引用错误,但似乎修饰符没有修改我的变量(self.maxhealth)。澄清一下,我们正在查看的区域位于“防御修改器”下。如果您发现任何令人困惑的事情,请询问,以便我们解决此问题。谢谢大佬!

import sys 
import os
import random
import pickle
import time

## Weapons
weapon1 = {"long sword":10}
weapon2 = {"great sword":40}

## Armor
armor1 = {"leather armor":20}

## Potions
healthpot = {"health potion": 10}

# User Statistics
class Player:
    def __init__(self, name):
        self.name = name
        self.exp = 100
        self.maxhealth = 100
        self.health = self.maxhealth
        self.base_attack = 10
        self.gold = 100
        self.pots_health = 0
        self.weap = ["rusty sword"]
        self.curweap = "rusty sword"
        self.arm = ["common clothes"]
        self.curarm = "common clothes"


# Attack Modifiers
    @property 
    def attack(self):
        attack = self.base_attack
        if self.curweap == "rusty sword":
            attack += 0

        if self.curweap == "long sword":
            attack += 10

        if self.curweap == "great sword":
            attack += 20

        return attack

# Defense Modifiers
    @property
    def armor(self):
        armor = self.maxhealth
        if self.curarm == "common clothes":
            armor += 0

        if self.curarm == "leather armor":
            armor += 25

        return armor

# Monsters
class Goblin:
    def __init__(self, name):
        self.name = name
        self.maxhealth = 30
        self.health = self.maxhealth
        self.attack = random.randint(3,8)
        self.goldgain = random.randint(5,10)
        self.expgain = random.randint(9,15)
#GoblinIG = Goblin("Goblin")

class Skeleton:
    def __init__(self, name):
        self.name = name
        self.maxhealth = 25
        self.health = self.maxhealth
        self.attack = random.randint(2,7)
        self.goldgain = random.randint(0,10)
        self.expgain = random.randint(5,10)
#SkeletonIG = Skeleton("Skeleton")

class Colbolt:
    def __init__(self, name):
        self.name = name
        self.maxhealth = 50
        self.health = self.maxhealth
        self.attack = random.randint(7,15)
        self.goldgain = random.randint(10,20)
        self.expgain = random.randint(9,20)
#ColboltIG = Colbolt("Colbolt")

# Functions

# Start Up Prompt
def main():
    os.system('clear')
    print ("Text RPG game.\nCreated on July 24, 2018.\n\n")
    print ("--------------\nKINDRED DEMONS\n--------------\n")
    print ("Select an option\n")
    print ("1.) Start")
    print ("2.) Load")
    print ("3.) Exit")
    raw_input = input (">>> ")
    option = raw_input
    if option == "start":
        start()
    elif option == "load":
        if os.path.exists("savefile") == True:
            os.system('clear')
            with open('savefile', 'rb') as f:
                global PlayerIG
                PlayerIG = pickle.load(f)
            loadtext = 'Loaded Save State...\n\n'
            for char in loadtext:
                sys.stdout.write(char)
                sys.stdout.flush()
                time.sleep(0.1)
            option = raw_input
            start1()
        else:
            print ("You have no save file for this game.")
            option = raw_input
            main()
    elif option == "exit":
        sys.exit()
    else:
        print ("Error 404: Unknown command")
        main()

# Goining User Infomation
def start():
    os.system('clear')
    print ("Hello, what is your name?")
    raw_input = input (">>> ")
    option = raw_input
    global PlayerIG
    PlayerIG = Player(option)
    startintro()
    start1()

# Starting Introduction
def startintro():
    os.system('clear')
    intro1 = '"There was once a time where demons and angels roamed the same plains. It was not until Barook, the King of the Chaos Rift, returned.\nBarook wielded the Great Staff, Jungik, which supposedly only a True King could wield. The Legends are told that it was Barook who was the one to split the plains in two:\nTHE ARCH PLAIN and ETERNAL DEPTHS PLAIN.\nChaos broke out as the wingless demons fell into the eternal depths plain, unable to return.\nIt is said that there once was a powerful demon, capable of contesting anything that stood in his way. It is said that he was cloaked in the Wings of Darkness.\nallowing him to soar through the Arch Plains."'
    intro2 = '\nThe old man paused.''\n"I seem to be forgetting the name of the demon. Ah yes it was..."'
    intro3 = '\n"%s!" \n"It is time."\n\n' % PlayerIG.name
    for char in intro1:
        sys.stdout.write(char)
        sys.stdout.flush()
        time.sleep(0.009)
    for char in intro2:
            sys.stdout.write(char)
            sys.stdout.flush()
            time.sleep(0.01)
    for char in intro3:
            sys.stdout.write(char)
            sys.stdout.flush()
            time.sleep(0.1)


# Main Page - What The User Chooses To Do
def start1():
    os.system('clear')
    print ("Name: %s" % PlayerIG.name)
    print ("Experience: %i" % PlayerIG.exp)
    print ("Attack: %i" % PlayerIG.attack)
    print ("Gold: %d" % PlayerIG.gold)
    print ("Current Weapon: %s" % PlayerIG.curweap)
    print ("Current Armor: %s" % PlayerIG.curarm)
    print ("Health Potions: %d" % PlayerIG.pots_health)
    print ("Health: %i/%i\n" % (PlayerIG.health, PlayerIG.maxhealth))
    print ("1.) Fight")
    print ("2.) Drink Health Potion")
    print ("3.) Shop")
    print ("4.) Inventory")
    print ("5.) Save")
    print ("6.) Exit")
    os.system('clear')
    raw_input = input (">>> ")
    option = raw_input
    if option == "fight":
        os.system('clear')
        prefight()
    elif option == "shop":
        shop()
    elif option == "drink health potion":
        drinkpot_health_startpage()
    elif option == "drink health":
        drinkpot_health_startpage()
    elif option == "health potion":
        drinkpot_health_startpage()
    elif option == "save":
        os.system('clear')
        with open('savefile', 'wb') as f:
            pickle.dump(PlayerIG, f)
            print ("\nGame has been saved!\n")
        option = raw_input
        start1()
    elif option == "exit":
        sys.exit()
    elif option == "inventory":
        inventory()
    else:
        print ("\n")
        start1()

# Accessing The Inventory Of The User
def inventory():
    os.system('clear')
    print ("What do you want to do?")
    print ("1.) Equip Weapon")
    print ("2.) Equip Armor")
    print ("3.) Exit")
    raw_input = input (">>> ")
    option = raw_input
    if option == "equip weapon":
        equip_weapon()
    if option == "equip armor":
        equip_armor()
    elif option == "exit":
        start1()
    else:
        os.system('clear')
        print ("Error 404: Unknown Command\n")
        inventory()

# Equiping Weapons
def equip_weapon():
    os.system('clear')
    print ("What do you want to equip?\n")
    for weapon in PlayerIG.weap:
        print (weapon.title())
    print ("Back")
    print ("Exit")
    raw_input = input (">>> ")
    option = raw_input
    if option == PlayerIG.curweap:
        print ("You already have that weapon equipped\n")
        option = raw_input
        equip_weapon()
    elif option == "back":
        inventory()
    elif option == "exit":
        start1()
    elif option in PlayerIG.weap:
        PlayerIG.curweap = option
        print ("You have equipped %s." % option, "\n")
        option = raw_input
        equip_weapon()
    else:
        print ("You don't have %s in your inventory" % option, "\n")
        equip_weapon()

#Equiping Armor
def equip_armor():
    os.system('clear')
    print ("What do you want to equip?\n")
    for armor in PlayerIG.arm:
        print (armor.title())
    print ("Back")
    print ("Exit")
    raw_input = input (">>> ")
    option = raw_input
    if option == PlayerIG.curarm:
        print ("You already have that armor equipped\n")
        option = raw_input
        equip_armor()
    elif option == "back":
        inventory()
    elif option =="exit":
        start1()
    elif option in PlayerIG.arm:
        PlayerIG.curarm = option
        print ("You have equipped %s." % option, "\n")
        option = raw_input
        equip_armor()
    else:
        print ("You dont't have %s in your inventory" % option, "\n")
        equip_armor()

## Deciding Monster Spawn Type
def prefight():
    global enemy
    if PlayerIG.exp <= 50:
        enemynum = random.randint(1, 2)
        if enemynum == 1:
            enemy = Goblin("Goblin")
        if enemynum == 2:
            enemy = Skeleton("Skeleton")
        fight()
    if PlayerIG.exp >= 50 <= 100: 
        enemynum = random.randint(1, 3)
        if enemynum == 1:
            enemy = Goblin("Goblin")
        elif enemynum == 2:
            enemy = Skeleton("Skeleton")
        else:
            enemy = Colbolt("Colbolt")
        fight()

# Determining What The User Wants To Do
def fight():
    os.system('clear')
    print ("%s     vs      %s" % (PlayerIG.name, enemy.name))
    print ("%s's Health: %d/%d    %s's Health: %i/%i" % (PlayerIG.name, PlayerIG.health, PlayerIG.maxhealth, enemy.name, enemy.health, enemy.maxhealth))
    print ("Health Potions %i\n" % PlayerIG.pots_health)
    print ("1.) Attack")
    print ("2.) Drink Health Potion")
    print ("3.) Run")
    raw_input = input (">>> ")
    option = raw_input
    if option == "attack":
        os.system('clear')
        attack()
    elif option == "run":
        run()
    elif option == "drink heatlh potion":
        drinkpot_health_fightpage()
    elif option == "drink heatlh":
        drinkpot_health_fightpage()
    elif option == "heatlh potion":
        drinkpot_health_fightpage()
    else:
        print ("What the hell does that mean?")
        fight()

# Calculating Attacking Statistics + Running Fight Outcomes
def attack():
    PAttack = int(random.uniform(PlayerIG.attack // 2, PlayerIG.attack))
    EAttack = int(random.uniform(enemy.attack // 2, enemy.attack))
    if PAttack <= PlayerIG.attack // 2:
        print ("You miss!")
    else:
        enemy.health == PAttack
        print ("You deal %i damage!" % PAttack)
        enemy.health -= PAttack
    if enemy.health <= 1:
        win()
    os.system('clear')
    if EAttack <= enemy.attack // 2:
        print ("The enemy missed!")
    else:
        PlayerIG.health -= EAttack
        print ("The enemy deals %i damage!" % EAttack)
    if PlayerIG.health <= 0:
        dead()
    else:
        fight()

# If The User Drinks Health Potions From 'Start1()'
def drinkpot_health_startpage():
    os.system('clear')
    if PlayerIG.pots_health == 0:
        print ("You don't have any health potions!\n")
        start1()
    else:
        PlayerIG.health += 25
        if PlayerIG.health > PlayerIG.maxhealth:
            PlayerIG.health = PlayerIG.maxhealth
        print ("You drank a health potion!\n")
        PlayerIG.pots_health -= 1
        start1()

# If The User Drinks Health Potions From 'Fight()'
def drinkpot_health_fightpage():
    os.system('clear')
    if PlayerIG.pots_health == 0:
        print ("You don't have any health potions!\n")
        fight()
    else:
        PlayerIG.health += 25
        if PlayerIG.health > PlayerIG.maxhealth:
            PlayerIG.health = PlayerIG.maxhealth
        print ("You drank a health potion!\n")
        PlayerIG.pots_health -= 1
        fight()


# Calcualting And Running Statistics If The User Runs      
def run():
    os.system('clear')
    runnum = random.randint(1, 5)
    if runnum <= 3:
        print ("You have successfully ran away!")
        os.system('clear')
        start1()
    else:
        print ("You failed to get away!")
        os.system('clear')
        EAttack = random.randint(enemy.attack // 2, enemy.attack)
        if EAttack == enemy.attack/2:
            print ("The enemy missed!")
        else:
            PlayerIG.health -= EAttack
            print ("The enemy deals %i damage!" % EAttack)
        fight()
        if PlayerIG.health <= 0:
            dead()
        else:
            fight()

# When User Defeats Monster - Calculates What User Gained
def win():
    os.system('clear')
    enemy.health = enemy.maxhealth
    PlayerIG.gold += enemy.goldgain
    PlayerIG.exp += enemy.expgain
    print ("You have defeated the %s" % enemy.name)
    print ("You gained %i experience points!" % enemy.expgain)
    print ("You found %i gold!" % enemy.goldgain, "\n")
    start1()

# When User Dies
def dead():
    os.system('clear')
    print ("You have died\n")
    restart()

# Prompting User To Restart
def restart():
    os.system('clear')
    print ("Would you like to Restart?")
    raw_input = input (">>> ")
    option = raw_input
    if option == "yes" or "restart":
        text1 = "Restarting"
        for char in text1:
            sys.stdout.write(char)
            sys.stdout.flush()
            time.sleep(0.1)
        text2 = "...\n\n"
        for char in text2:
            sys.stdout.write(char)
            sys.stdout.flush()
            time.sleep(0.7)
        start()
    if option == "no":
        print ("Game Over")

# Accessing The Shop
def shop():
    os.system('clear')
    print ("Rhaast's Weapons Shop\n")
    print ("\nWhat would you like to buy?\n")
    print ("1.) Long Sword 10gp")
    print ("2.) Great Sword 40gp")
    print ("3.) Leather Armor 20gp")
    print ("4.) Health Potion 10gp")
    print ("Back")
    print (" ")
    raw_input = input (">>> ")
    option = raw_input

    if option in weapon1:
        if PlayerIG.gold >= weapon1[option]:
            os.system('clear')
            PlayerIG.gold -= weapon1[option]
            PlayerIG.weap.append(option)
            print ("You have bought %s!" % option, "\n")
            option = raw_input
            shop()
        else:
            os.system('clear')
            print ("You don't have enough gold\n")
            option = raw_input
            shop()

    if option in weapon2:
        if PlayerIG.gold >= weapon2[option]:
            os.system('clear')
            PlayerIG.gold -= weapon2[option]
            PlayerIG.weap.append(option)
            print ("You have bought %s!" % option, "\n")
            option = raw_input
            shop()
        else:
            os.system('clear')
            print ("You don't have enough gold\n")
            option = raw_input
            shop()

    if option in armor1:
        if PlayerIG.gold >= armor1[option]:
            os.system('clear')
            PlayerIG.gold -= armor1[option]
            PlayerIG.arm.append(option)
            print ("You have bought %s!" % option, "\n")
            option = raw_input
            shop()
        else:
            os.system('clear')
            print ("You don't have enough gold\n")
            option = raw_input
            shop()

    if option in healthpot:
        if PlayerIG.gold >= healthpot[option]:
            os.system('clear')
            PlayerIG.gold -= healthpot[option]
            PlayerIG.pots_health += 1
            print("You have bought %s!" % option, "\n")
            option = raw_input
            shop()
        else:
            os.system('clear')
            print ("You don't have enough gold\n")
            option = raw_input
            shop()

    elif option == "back":
        start1()

    else:
        os.system('clear')
        print ("That item does not exist\n")
        option = raw_input
        shop()

##__main__##
main()

【问题讨论】:

  • 这样,代码太多了。请给我们一个minimal reproducible example,它只展示您遇到的问题,而不是您的整个程序。

标签: python variables properties modifiers


【解决方案1】:

虽然我同意 abarnert 的评论,并且去掉游戏的所有其余部分是一个好主意,但我对学习有关 python 的一两件事很感兴趣,并认为修补你的游戏会是乐趣。所以我看了看。

我使用 IDLE 逐步浏览了相关的代码部分,很明显你的逻辑是错误的。您有一个名为 PlayerIG 的全局变量,它是您的 Player 类的游戏内实例。你的武器能适当提升你的攻击值的原因是你参考了PlayerIG.attack属性的攻击值,而不是PlayerIG.base_attack属性。

但是,您不会对已设置的 armor 属性执行任何类似操作。您希望通过装备盔甲来增强您的 PlayerIG.maxhealth 属性,而您还没有在代码中做到这一点。相反,您正在设置一个PlayerIG.armor 属性,将其值设置为增强的maxhealth 值,然后不使用它,而是使用您尚未更改的PlayerIG.maxhealth 值。

如果您想在用户装备盔甲时使用增强的最大生命值,则必须使用armor 属性而不是maxhealth 属性。这在语义上没有多大意义;毕竟,最大生命值不是盔甲。

因此,我建议您以类似于您的attack 属性的方式设置您的maxhealth 属性。从base_maxhealth 属性开始,将armor 属性重命名为maxhealth,然后在游戏计算中使用后者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多