So I'm a tad new to Python, I've worked a lot with RPG but I've come across a problem when trying to reset or refresh my variables in my Classes.
At the moment when the user successfully flees the monster, entering the next fight with a goblin will result in the goblin sharing the same statistics as the previous one. For example, the user damages Goblin_1
for 5
damage, meaning its health is at 25/30. If the user run away successfully, the next time the user fights a goblin, its starting health will be 25/30.
This problem also carries over to the earned experience and gold given to the user when they kill the monster. I fairly certain that if the variables were reset after the user ran successfully away this would solve all the problems if I just carried it over to also the win condition.
So to put this in short, we have Goblin_1
. Goblin_1
gets damaged for 5
hit points, and is now at 25/30. If the user flees, Goblin_2
will override Goblin_1
's statistics and not start at 25/30 hit points.
Any help would be fantastic mates.
import sys
import os
import random
import pickle
import time
## Weapons
weapon1 = {"long sword":10}
weapon2 = {"great sword":40}
## Potions
healthpot = {"health potion": 10}
# User Statistics
class Player:
def __init__(self, name):
self.name = name
self.exp = 0
self.maxhealth = 100
self.health = self.maxhealth
self.base_attack = 10
self.gold = 0
self.pots_health = 0
self.weap = ["rusty sword"]
self.curweap = "Rusty Sword"
# Attack Modifiers
@property
def attack(self):
attack = self.base_attack
if self.curweap == "rusty sword":
attack += 2
if self.curweap == "long sword":
attack += 10
if self.curweap == "great sword":
attack += 20
return attack
## 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 ("Basic Text RPG game.\nCreated on July 24, 2018.\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)
print ("Loaded Save State...\n")
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)
start1()
# 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 Weapons: %s" % PlayerIG.curweap)
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.) Save")
print ("5.) Inventory")
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.) Exit")
raw_input = input (">>> ")
option = raw_input
if option == "equip weapon":
equip()
elif option == "exit":
start1()
else:
os.system('clear')
print ("Error 404: Unknown Command\n")
inventory()
# Equiping Gear
def equip():
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()
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()
else:
print ("You don't have %s in your inventory" % option, "\n")
equip()
## Deciding Monster Spawn Type
def prefight():
global enemy
if PlayerIG.exp <= 50:
enemynum = random.randint(1, 2)
if enemynum == 1:
enemy = GoblinIG
if enemynum == 2:
enemy = SkeletonIG
fight()
if PlayerIG.exp >= 50 <= 100:
enemynum = random.randint(1, 3)
if enemynum == 1:
enemy = GoblinIG
elif enemynum == 2:
enemy = SkeletonIG
else:
enemy = ColboltIG
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.) 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 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()
Short answer to your question would be:
(Sorry I don't copy-paste your code, it's too long) Replace lines for example
enemy = GoblinIG
with
enemy = Goblin("Goblin")
Also delete GoblinIG("Goblin") etc, because from now on you won't use them. This way it would create new object each time you use "prefight" function.
Long answer would teach you about global and local variables (you seem to use only global ones) and also argument passing. Those would make your code so much better with so little effort.
Don't get me wrong, I'm not trying to be mean, but to point directions. Your code will work, but it's not how you program nowadays.