Dragon Tale.

This is the place to post any code that you want to share with the community. Only completed scripts should be posted here.

Dragon Tale.

Postby Wizza » Wed Dec 18, 2013 3:25 pm

Well.. I am a python scripter who started scripting before 1 month and made my first big succes. The Dragon Tale is a Text-Based RPG game made by me. If you like it please say so and if you dont like it, please state the reason why and how can I improve it/ fix it.
Code: Select all
#!/usr/bin/env python

import time
import os
import random

def cls():
    os.system(['clear','cls'][os.name == 'nt'])

o = 0
while (o < 101):
   cls()
   print "Loading",o,"%"
   time.sleep(0.1)
   o = o + 1
cls()
print "Loading 100 %"
time.sleep(1)
cls()
print "Loading Complete!"
time.sleep(3)
cls()
name = raw_input("Enter your characters name: ")
cls()
clas = raw_input("What class is your character[Archer/Warrior/Mage]?: ")
if (clas == 'Archer'):
   att = 50
   defe = 25
if (clas == 'Warrior'):
   att = 30
   defe = 45
if (clas == 'Mage'):
   att = 30
   defe = 45
hsword = 0
hbow = 0
haxe = 0
maxhp = 100
hp = maxhp
maxxp = 99
lvl = 1
gold = 0
xp = 0
cityz = 0
cls()
print "{Gate Guard} Hello fellow stranger! Whats your name?"
time.sleep(1)
guard = raw_input("[TRUTH/LIE]: ")
cls()
time.sleep(0.8)
if (guard == 'TRUTH'):
   print "{You} My name is",name,"."
   time.sleep(2)
   print "{Gate Guard} Very well",name,". I salute you."
   time.sleep(2)
   gate = raw_input("Do you want to go outside? [Y/N]: ")
if (guard == 'LIE'):
   falsename = raw_input("[What name will you tell him?]: ")
   time.sleep(2)
   print "{You} Uhmm... My name is",falsename,"."
   time.sleep(2)
   print "{Gate Guard} Very well",falsename,"."
   time.sleep(2)
   gate = raw_input("Do you want to go outside? [Y/N]: ")
infinite = 1
while (infinite == 1):
   cls()
   time.sleep(2)
   if (gate == 'Y'):
      if (lvl == 1):
         print "You have met a Level 1 Spider"
         fight = raw_input("Do you wish to fight him or flee? [FIGHT/FLEE]: ")
         cls()
         time.sleep(2)
         if (fight == 'FIGHT'):
            if (hp > 0):
               spider = 50
               spidermax = 50
               while (spider > 0):
                  print "S============================S"
                  print "S       Spider Health        S"
                  print "S         ",spider," / ",spidermax,"        S"
                  print "S                            S"
                  print "S============================S"
                  print "S Your HP:",hp,"              S"
                  print "S============================S"
                  attack = raw_input("[ATTACK/FLEE]: ")
                  if (attack == 'ATTACK'):
                     spideratt = random.randint(1,5)
                     time.sleep(3)
                     cls()
                     spider = spider - att
                     hp = hp - spideratt
                     if (hp < 0):
                        print "You died!"
                        infinite = 0
                        gate = 0
                        spider = 0      
                  if (attack == 'FLEE'):
                     time.sleep(2)
                     print "You have flee'd the fight and  lost 10 HP"
                     hp = hp - 10
                     if (hp < 0):
                        print "You died!"
                        infinite = 0
                        gate = 0
                        spider = 0   
                     time.sleep(3)
                     cls()
                  if (spider < 1):
                     if (infinite == 1):
                        goldw = 2
                        gold = gold + goldw
                        xpgot = 50
                        xp = xp + xpgot
                        print "You have defeated the Spider!"
                        time.sleep(1)
                        print "REWARD:",xpgot,"XP",goldw,"Gold"
                        time.sleep(4)
                        goldw = 0
                        xpgot = 0
                        cls()
            if (hp < 1):
               if (infinite == 1):
                  print "You are too weak to fight!"
                  time.sleep(3)
                  cls()
         if (fight == 'FLEE'):
            time.sleep(2)
            print "You have flee'd the fight and  lost 10 HP"
            hp = hp - 10
            time.sleep(3)
            cls()
      if (lvl == 2):
         print "You have met a Level 2 Spider"
         fight = raw_input("Do you wish to fight him or flee? [FIGHT/FLEE]: ")
         cls()
         time.sleep(2)
         if (fight == 'FIGHT'):
            if (hp > 0):
               spider = 65
               spidermax = 65
               while (spider > 0):
                  print "S============================S"
                  print "S       Spider Health        S"
                  print "S         ",spider," / ",spidermax,"        S"
                  print "S                            S"
                  print "S============================S"
                  print "S Your HP:",hp,"              S"
                  print "S============================S"
                  attack = raw_input("[ATTACK/FLEE]: ")
                  if (attack == 'ATTACK'):
                     spideratt = random.randint(5,10)
                     time.sleep(3)
                     cls()
                     spider = spider - att
                     hp = hp - spideratt
                     if (hp < 0):
                        print "You died!"
                        infinite = 0
                        gate = 0
                        spider = 0         
                  if (attack == 'FLEE'):
                     time.sleep(2)
                     print "You have flee'd the fight and  lost 10 HP"
                     hp = hp - 10
                     if (hp < 0):
                        print "You died!"
                        infinite = 0
                        gate = 0
                        spider = 0   
                     time.sleep(3)
                     cls()
                  if (spider < 1):
                     if (infinite == 1):
                        goldw = 10
                        gold = gold + goldw
                        xpgot = 75
                        xp = xp + xpgot
                        print "You have defeated the Spider!"
                        time.sleep(1)
                        print "REWARD:",xpgot,"XP",goldw,"Gold"
                        time.sleep(4)
                        goldw = 0
                        xpgot = 0
                        cls()
            if (hp < 1):
               if (infinite == 1):
                  print "You are too weak to fight!"
                  time.sleep(3)
                  cls()
         if (fight == 'FLEE'):
            time.sleep(2)
            print "You have flee'd the fight and lost 10 HP"
            hp = hp - 10
            time.sleep(3)
            cls()
      if (lvl == 3):
         print "You have met a Level 1 Goblin"
         fight = raw_input("Do you wish to fight him or flee? [FIGHT/FLEE]: ")
         cls()
         time.sleep(2)
         if (fight == 'FIGHT'):
            if (hp > 0):
               goblin = 100
               goblinmax = 100
               while (goblin > 0):
                  print "S============================S"
                  print "S       Goblin Health        S"
                  print "S         ",goblin," / ",goblinmax,"        S"
                  print "S                            S"
                  print "S============================S"
                  print "S Your HP:",hp,"              S"
                  print "S============================S"
                  attack = raw_input("[ATTACK/FLEE]: ")
                  if (attack == 'ATTACK'):
                     goblinatt = random.randint(7,15)
                     time.sleep(3)
                     cls()
                     goblin = goblin - att
                     hp = hp - goblinatt
                     if (hp < 0):
                        print "You died!"
                        infinite = 0   
                        gate = 0
                        goblin = 0      
                  if (attack == 'FLEE'):
                     time.sleep(2)
                     print "You have flee'd the fight and  lost 10 HP"
                     hp = hp - 10
                     if (hp < 0):
                        print "You died!"
                        infinite = 0
                        gate = 0
                        goblin = 0   
                     time.sleep(3)
                     cls()
                  if (goblin < 1):
                     if (infinite == 1):
                        goldw = 15
                        gold = gold + goldw
                        xpgot = 90
                        xp = xp + xpgot
                        print "You have defeated the Goblin!"
                        time.sleep(1)
                        print "REWARD:",xpgot,"XP",goldw,"Gold"
                        time.sleep(4)
                        goldw = 0
                        xpgot = 0
                        cls()
            if (hp < 1):
               if (infinite == 1):
                  print "You are too weak to fight!"
                  time.sleep(3)
                  cls()
         if (fight == 'FLEE'):
            time.sleep(2)
            print "You have flee'd the fight and lost 10 HP"
            hp = hp - 10
            time.sleep(3)
            cls()
      if (lvl == 4):
         print "You have met a Level 2 Goblin"
         fight = raw_input("Do you wish to fight him or flee? [FIGHT/FLEE]: ")
         cls()
         time.sleep(2)
         if (fight == 'FIGHT'):
            if (hp > 0):
               goblin = 125
               goblinmax = 125
               while (goblin > 0):
                  print "S============================S"
                  print "S       Goblin Health        S"
                  print "S         ",goblin," / ",goblinmax,"       S"
                  print "S                            S"
                  print "S============================S"
                  print "S Your HP:",hp,"              S"
                  print "S============================S"
                  attack = raw_input("[ATTACK/FLEE]: ")
                  if (attack == 'ATTACK'):
                     goblinatt = random.randint(10,17)
                     time.sleep(3)
                     cls()
                     goblin = goblin - att
                     hp = hp - goblinatt
                     if (hp < 0):
                        print "You died!"
                        infinite = 0   
                        gate = 0
                        goblin = 0      
                  if (attack == 'FLEE'):
                     time.sleep(2)
                     print "You have flee'd the fight and  lost 10 HP"
                     hp = hp - 10
                     if (hp < 0):
                        print "You died!"
                        infinite = 0
                        gate = 0
                        goblin = 0   
                     time.sleep(3)
                     cls()
                  if (goblin < 1):
                     if (infinite == 1):
                        goldw = 15
                        gold = gold + goldw
                        xpgot = 90
                        xp = xp + xpgot
                        print "You have defeated the Goblin!"
                        time.sleep(1)
                        print "REWARD:",xpgot,"XP",goldw,"Gold"
                        time.sleep(4)
                        goldw = 0
                        xpgot = 0
                        cls()
            if (hp < 1):
               if (infinite == 1):
                  print "You are too weak to fight!"
                  time.sleep(3)
                  cls()
         if (fight == 'FLEE'):
            time.sleep(2)
            print "You have flee'd the fight and lost 10 HP"
            hp = hp - 10
            time.sleep(3)
            cls()
      if (lvl == 4):
         print "You have met a Level 2 Goblin"
         fight = raw_input("Do you wish to fight him or flee? [FIGHT/FLEE]: ")
         cls()
         time.sleep(2)
         if (fight == 'FIGHT'):
            if (hp > 0):
               goblin = 175
               goblinmax = 175
               while (goblin > 0):
                  print "S============================S"
                  print "S       Goblin Health        S"
                  print "S         ",goblin," / ",goblinmax,"       S"
                  print "S                            S"
                  print "S============================S"
                  print "S Your HP:",hp,"              S"
                  print "S============================S"
                  attack = raw_input("[ATTACK/FLEE]: ")
                  if (attack == 'ATTACK'):
                     goblinatt = random.randint(17,24)
                     time.sleep(3)
                     cls()
                     goblin = goblin - att
                     hp = hp - goblinatt
                     if (hp < 0):
                        print "You died!"
                        gate = 0
                        infinite = 0   
                        goblin = 0      
                  if (attack == 'FLEE'):
                     time.sleep(2)
                     print "You have flee'd the fight and  lost 10 HP"
                     hp = hp - 10
                     if (hp < 0):
                        print "You died!"
                        infinite = 0
                        gate = 0
                        goblin = 0   
                     time.sleep(3)
                     cls()
                  if (goblin < 1):
                     if (infinite == 1):
                        goldw = 20
                        gold = gold + goldw
                        xpgot = 120
                        xp = xp + xpgot
                        print "You have defeated the Goblin!"
                        time.sleep(1)
                        print "REWARD:",xpgot,"XP",goldw,"Gold"
                        time.sleep(4)
                        goldw = 0
                        xpgot = 0
                        cls()
            if (hp < 1):
               if (infinite == 1):
                  print "You are too weak to fight!"
                  time.sleep(3)
                  cls()
         if (fight == 'FLEE'):
            time.sleep(2)
            print "You have flee'd the fight and lost 10 HP"
            hp = hp - 10
            time.sleep(3)
            cls()
      if (lvl == 5):
         print "You have met a Level 2 Goblin"
         fight = raw_input("Do you wish to fight him or flee? [FIGHT/FLEE]: ")
         cls()
         time.sleep(2)
         if (fight == 'FIGHT'):
            if (hp > 0):
               goblin = 175
               goblinmax = 175
               while (goblin > 0):
                  print "S============================S"
                  print "S       Goblin Health        S"
                  print "S         ",goblin," / ",goblinmax,"       S"
                  print "S                            S"
                  print "S============================S"
                  print "S Your HP:",hp,"              S"
                  print "S============================S"
                  attack = raw_input("[ATTACK/FLEE]: ")
                  if (attack == 'ATTACK'):
                     goblinatt = random.randint(17,24)
                     time.sleep(3)
                     cls()
                     goblin = goblin - att
                     hp = hp - goblinatt
                     if (hp < 0):
                        print "You died!"
                        infinite = 0   
                        gate = 0
                        goblin = 0      
                  if (attack == 'FLEE'):
                     time.sleep(2)
                     print "You have flee'd the fight and  lost 10 HP"
                     hp = hp - 10
                     if (hp < 0):
                        print "You died!"
                        infinite = 0
                        gate = 0
                        goblin = 0   
                     time.sleep(3)
                     cls()
                  if (goblin < 1):
                     if (infinite == 1):
                        goldw = 20
                        gold = gold + goldw
                        xpgot = 120
                        xp = xp + xpgot
                        print "You have defeated the Goblin!"
                        time.sleep(1)
                        print "REWARD:",xpgot,"XP",goldw,"Gold"
                        time.sleep(4)
                        goldw = 0
                        xpgot = 0
                        cls()
            if (hp < 1):
               if (infinite == 1):
                  print "You are too weak to fight!"
                  time.sleep(3)
                  cls()
         if (fight == 'FLEE'):
            time.sleep(2)
            print "You have flee'd the fight and lost 10 HP"
            hp = hp - 10
            time.sleep(3)
            cls()
   if (infinite == 1):
      print "+==============================+"
      print "| HP:",hp,"XP:",xp,"Gold:",gold,"      |"
      print "+==============================+"
      time.sleep(4)
      cls()
      if (lvl == 1):
         if (xp > maxxp):
            print "You have Leveled up!"
            hp = maxhp
            lvl = lvl + 1
            lvlup = raw_input("What do you wish to upgrade? [ATTACK/HEALTH]: ")
            maxxp = 149
            xp = 0
            time.sleep(2)
            if (lvlup == 'ATTACK'):
               att = att + 5
               print "HP:",hp,"XP:",xp,"Gold:",gold,"AT:",att,"DEF:",defe
               time.sleep(5)
            if (lvlup == 'HEALTH'):
               maxhp = maxhp + 5
               print "HP:",hp,"XP:",xp,"Gold:",gold,"AT:",att,"DEF:",defe
               time.sleep(5)
      if (lvl == 2):
         if (xp > maxxp):
            print "You have Leveled up!"
            hp = maxhp
            lvl = lvl + 1
            lvlup = raw_input("What do you wish to upgrade? [ATTACK/HEALTH]: ")
            maxxp = 199
            xp = 0
            time.sleep(2)
            if (lvlup == 'ATTACK'):
               att = att + 5
               print "HP:",hp,"XP:",xp,"Gold:",gold,"AT:",att,"DEF:",defe
               time.sleep(5)
            if (lvlup == 'HEALTH'):
               maxhp = maxhp + 5
               print "HP:",hp,"XP:",xp,"Gold:",gold,"AT:",att,"DEF:",defe
               time.sleep(5)
      if (lvl == 3):
         if (xp > maxxp):
            print "You have Leveled up!"
            hp = maxhp
            lvl = lvl + 1
            lvlup = raw_input("What do you wish to upgrade? [ATTACK/HEALTH]: ")
            maxxp = 299
            xp = 0
            time.sleep(2)
            if (lvlup == 'ATTACK'):
               att = att + 5
               print "HP:",hp,"XP:",xp,"Gold:",gold,"AT:",att,"DEF:",defe
               time.sleep(5)
            if (lvlup == 'HEALTH'):
               maxhp = maxhp + 5
               print "HP:",hp,"XP:",xp,"Gold:",gold,"AT:",att,"DEF:",defe
               time.sleep(5)
      if (lvl == 4):
         if (xp > maxxp):
            print "You have Leveled up!"
            hp = maxhp
            lvl = lvl + 1
            lvlup = raw_input("What do you wish to upgrade? [ATTACK/HEALTH]: ")
            maxxp = 499
            xp = 0
            time.sleep(2)
            if (lvlup == 'ATTACK'):
               att = att + 5
               print "HP:",hp,"XP:",xp,"Gold:",gold,"AT:",att,"DEF:",defe
               time.sleep(5)
            if (lvlup == 'HEALTH'):
               maxhp = maxhp + 5
               print "HP:",hp,"XP:",xp,"Gold:",gold,"AT:",att,"DEF:",defe
               time.sleep(5)
      gate = raw_input("Do you wish to stay outside? [Y/N]: ")
      cls()
      time.sleep(2)
   if (gate == 'N'):
      town = 0
      while (town == 0):
         print "+--------------------------|GATE|--------------------------------+"
         print "|    ======          ==             =====        ==              |"
         print "|   ========        ====           =======      ====             |"
         print "|  ===HALL===      ======         =========   ========           |"
         print "|  ==========     =CHURCH=        ===INN===   ==SHOP==           |"
         print "|  ====||====     ========        =========   ========           |"
         print "|                 ===||===        ===| |===   ===||===           |"
         print "|                                                                |"
         print "|                                                                |"
         print "|                                                                |"
         print "|                                                                |"
         print "|                                                                |"
         print "|                                                                |"
         print "|                                                                |"
         print "+----------------------------------------------------------------+"
         mapp = raw_input("[Where do you want to go?]: ")
         time.sleep(2)
         if (mapp == 'HALL'):
            print "TOWN HALL"
            hall = raw_input("Ask for citizenship or leave?[CITI/LEAVE]: ")
            time.sleep(3)
            cls()
            if (hall == 'CITI'):
               print "{King} Here you go fellow traveler."
               time.sleep(3)
               cityz = 1
               cls()
            if (hall == 'LEAVE'):
               print "You left the Town Hall"
               time.sleep(3)
               cls()
         if (mapp == 'CHURCH'):
            print "CHURCH"
            pray = raw_input("Do you want to pray? [Y/N]: ")
            if (pray == 'Y'):
               hp = maxhp
               print "Your health was restored"
               time.sleep(3)
               cls()
            if (pray == 'N'):
               print "..."
               time.sleep(3)
         if (mapp == 'INN'):
            print "INN"
            sleep = raw_input("{Inn Keeper} Want a nap? [Y/N]: ")
            time.sleep(3)
            cls()
            if (sleep == 'Y'):
               if (hp < 76):
                  hp = hp + 15
                  print "15 HP was restored, you now have",hp,"HP"
                  time.sleep(3)
                  cls()
                  if (hp > 100):
                     hp = maxhp
               if (hp > 99):
                  print "{Inn Keeper} You dont look that tired..."
                  time.sleep(3)
                  cls()
            if (sleep == 'N'):
               print "{Inn Keeper} Suit yourself..."
               time.sleep(3)
               cls()
         if (mapp == 'SHOP'):
            cls()
            print "[1] Sword(10g) [2] Bow(10g) [3] Axe(10g)"
            ch = raw_input("Choose a weapon you want to buy: ")
            cls()   
            if (ch == "1"):
               if (hsword == 1):
                  print "You already have this weapon!"
                  time.sleep(3)
               if (hsword == 0):
                  if (gold < 11):
                     print "You dont have enough money!"
                     time.sleep(3)
                  if (gold > 10):
                     print "You have bought the Sword!"
                     hsword = 1
                     att = att + 25
                     gold = gold - 10
                     time.sleep(3)
            if (ch == "2"):
               if (hbow == 1):
                  print "You already have this weapon!"
                  time.sleep(3)
               if (hbow == 0):
                  if (gold < 11):
                     print "You dont have enough money!"
                     time.sleep(3)
                  if (gold > 10):
                     print "You have bought the Bow!"
                     hbow = 1
                     att = att + 25
                     gold = gold - 10
                     time.sleep(3)
            if (ch == "3"):
               if (haxe == 1):
                  print "You already have this weapon!"
                  time.sleep(3)
               if (haxe == 0):
                  if (gold < 11):
                     print "You dont have enough money!"
                     time.sleep(3)
                  if (gold > 10):
                     print "You have bought the Axe!"
                     haxe = 1
                     att = att + 25
                     gold = gold - 10
                     time.sleep(3)
         if (mapp == 'GATE'):
            town = 1
            gate = 'Y'
   if (gate == 'N'):
      town = 0
      print "+==============================+"
      print "| HP:",hp,"XP:",xp,"Gold:",gold,"      |"
      print "+==============================+"
      time.sleep(4)
      cls()
Last edited by Yoriz on Wed Dec 18, 2013 4:52 pm, edited 1 time in total.
Reason: first post lock
Wizza
 
Posts: 6
Joined: Wed Dec 18, 2013 3:19 pm
Location: Croatia

Re: Dragon Tale.

Postby Somelauw » Wed Dec 18, 2013 7:42 pm

Why all the time.sleep's? It makes the game a bit sluggish to play.
There is a lot of sanity checking to be done. When you ask for the clas with which I want to play, you aren't checking if the class that I entered is a valid option. That might result in crashes.
Also maybe you can make an option to answer yes/no questions both by a capital Y as well as by a lowercase y.
Join the #python-forum IRC channel on irc.freenode.net!
Somelauw
 
Posts: 75
Joined: Tue Feb 12, 2013 8:30 pm

Re: Dragon Tale.

Postby metulburr » Wed Dec 18, 2013 8:41 pm

I would suggest a remake of your entire code to include at least functions... If not classes.

Code: Select all
o = 0

give meaningful variable names.
New Users, Read This
OS Ubuntu 14.04, Arch Linux, Gentoo, Windows 7/8
https://github.com/metulburr
steam
User avatar
metulburr
 
Posts: 1560
Joined: Thu Feb 07, 2013 4:47 pm
Location: Elmira, NY

Re: Dragon Tale.

Postby ochichinyezaboombwa » Fri Dec 20, 2013 2:28 am

I congratulate you for the effort, here are a few of important concerns:
1) 600+ lines and a single 1-line function: it is unbelievable. It makes code unreadable for others and will make your life a hell when you need to make modifications a month from now.
Use functions.

2) There are bugs, and you don't check the user input. Try entering something other than TRUE/LIE for
Code: Select all
guard = raw_input("[TRUTH/LIE]: ")
- you'll see what I mean.
ochichinyezaboombwa
 
Posts: 200
Joined: Tue Jun 04, 2013 7:53 pm

Re: Dragon Tale.

Postby micseydel » Mon Dec 23, 2013 11:14 pm

Classes (a tool for object oriented programming) would definitely be nice for this but they require a paradigm shift away from procedural programming, and are definitely not a viable near-term goal when there aren't even functions here.

That said, there is still some easily incorporated feedback here as a stepping stone toward differently-structured programming. As well as some simple Python knowledge that the OP got away without knowing.

The first thing I noticed is a very simple matter.
Code: Select all
os.system(['clear','cls'][os.name == 'nt'])

This is definitely something you would do before Python got its ternary operator. Now you can write the following, which is considered to be more readable
Code: Select all
os.system('cls' if os.name == 'nt' else 'clear')

Relatively minor, but this is the way the Python pros do it.

Another is that I, too, hate the sleeps. If you do really want them, I'd advise even an undocumented way to disable them. That is, even if you distribute it as you wish, leave a way that isn't known by anyone by you, the source code, and who you tell, to disable it. Even if you do leave it in there's a nicer way to write the following
Code: Select all
o = 0
while (o < 101):
   cls()
   print "Loading",o,"%"
   time.sleep(0.1)
   o = o + 1

First, I would call o something like loadingPercent instead. Next, you don't need the parenthesis around the condition for the while, and you can use += instead of the longer version of the last line. You can also use string formatting which is generally preferred stylistically, is sometimes more efficient and in this case saves you the extra ugly space character. That gets you here
Code: Select all
loadingPercent = 0
while loadingPercent < 101:
   cls()
   print "Loading {}%".format(loadingPercent) # in Python 2.6, put "0" in the braces
   time.sleep(0.1)
   loadingPercent += 1

You can cut two of these lines out entirely though by using a for loop. In general you should avoid while loops in favor of for loops, and Python works quite hard to make this possible for you.
Code: Select all
for loadingPercent in xrange(101):
   cls()
   print "Loading {}%".format(loadingPercent) # in Python 2.6, put "0" in the braces
   time.sleep(0.1)

Soon after this you assign attack and defense based on what class of character you get from the user. You currently use a bunch of ifs. This bloats the logic of your code. A common idiom in Python would be to place a constant container at the top of your code and then reference it later
Code: Select all
CHARACTER_STATS = {
   # '<class>': (<attack>, <defense>)
   'Archer': (50, 25),
   'Warrior': (30, 45),
   'Mage': (30, 45)
}
#...
clas = raw_input("What class is your character[Archer/Warrior/Mage]?: ")
att, defe = CHARACTER_STATS[clas]
hsword = 0
#...

But as has been mentioned here already, functions are awesome! It's also quite easy to do elegant error checking here. For example
Code: Select all
def get_attack_defense(clas):
    atk_def = None
    while atk_def is None:
        clas = raw_input("What class is your character[Archer/Warrior/Mage]?: ")
        atk_def = CHARACTER_STATS.get(clas, None)
    return atk_def # a tuple
#...
att, defe = get_attack_defense()

We call sometime like this abstracting away details. Someone can read the main part of your program where it shows linear progression through the game without seeing every single little tiny detail. They just see "get attack and defense". Logical separation of parts of your program will help you tremendously in the long run (there's another fantastic example of this coming up).

When I see the line
Code: Select all
while (infinite == 1):

It makes me wonder if later on infinite is going to change or not. If you put it at the top of the file in caps, that is the convention for a constant (by convention, since Python doesn't enforce it as some other languages do). In fact you don't need the == since 1 is True. I would just set a constant MAINLOOP or MAIN_LOOP at the top of the file as 1 or True and use that. It's just a bit more explicit.

It turns out that you do change it, and the only place I've seen so far is when a player dies. I would call it PLAYER_IS_ALIVE, assuming you don't want to just exit() immediately or return from a function and then reenter the game based on user input.

Here's the next thing I see
Code: Select all
fight = raw_input("Do you wish to fight him or flee? [FIGHT/FLEE]: ")

Two things come to mind. The first is that I don't like typing in ALL CAPS. Maybe you really want it in the output, which is ok, but I don't want to type it. In fact we often don't care about the capitalization of the user's input. The convention in this case is to take the user's input and make it all lowercase or uppercase (usually lower), depending on what constants you're comparing them to.

The other is a design decision. Earlier, I did erroneous user input checking. You could do so again here to make sure the user types in either of your two desired strings (or any casing version thereof). But you also might decide that "fight" is to fight and anything else means flee. And then you can do this
Code: Select all
do_fight = raw_input("...").lower().strip() == "fight" # you can .strip() too to ignore whitespace

and then later do
Code: Select all
if do_fight:

since do_fight will be a boolean variable.

The next thing I want to cover is code re-use. If you have code that looks very similar being used in multiple places, it's always better to put it in a function and then pass in as arguments any differences in the execution. Let's take as an example a fight scene. It looks like the only differences are the creature and it's level, and then on top of that you'll want to pass in player stats and return the reward and new HP. You could say that the amount of damage the creature causes is based on the level, but it looks like you can calculate that anyway. Now let's take the first time you have a fight scene and try to turn it into a function
Code: Select all
         if (fight == 'FIGHT'):
            if (hp > 0):
               spider = 65
               spidermax = 65
               while (spider > 0):
                  print "S============================S"
                  print "S       Spider Health        S"
                  print "S         ",spider," / ",spidermax,"        S"
                  print "S                            S"
                  print "S============================S"
                  print "S Your HP:",hp,"              S"
                  print "S============================S"
                  attack = raw_input("[ATTACK/FLEE]: ")
                  if (attack == 'ATTACK'):
                     spideratt = random.randint(5,10)
                     time.sleep(3)
                     cls()
                     spider = spider - att
                     hp = hp - spideratt
                     if (hp < 0):
                        print "You died!"
                        infinite = 0
                        gate = 0
                        spider = 0         
                  if (attack == 'FLEE'):
                     time.sleep(2)
                     print "You have flee'd the fight and  lost 10 HP"
                     hp = hp - 10
                     if (hp < 0):
                        print "You died!"
                        infinite = 0
                        gate = 0
                        spider = 0   
                     time.sleep(3)
                     cls()
                  if (spider < 1):
                     if (infinite == 1):
                        goldw = 10
                        gold = gold + goldw
                        xpgot = 75
                        xp = xp + xpgot
                        print "You have defeated the Spider!"
                        time.sleep(1)
                        print "REWARD:",xpgot,"XP",goldw,"Gold"
                        time.sleep(4)
                        goldw = 0
                        xpgot = 0
                        cls()
            if (hp < 1):
               if (infinite == 1):
                  print "You are too weak to fight!"
                  time.sleep(3)
                  cls()

I basically tightened it up to the following constants at the top (incomplete for the whole program) and function
Code: Select all
DEATH = (False, 0, 0, 0)

CREATURES = {
   'Spider': {
      1: {
         'maxhp': 50,
         'attack_range': (1, 5),
         'xpgot': 50,
         'goldw': 2
      }
      2: {
         'maxhp': 65
         'attack_range': (5, 10),
         'xpgot': 75,
         'goldw': 10
      }
   }
}

def do_fight(creature_name, creature_level, player_hp):
   'returns (success, player_hp, exp, goldw)'
   creature = CREATURES[creature_name][creature_level]
   creature_hp = creature_max = creature['maxhp']
   while creature_hp > 0:
      print CREATURE_PROMPT_FORMAT.format(creature_name, creature_hp, creature_max, player_hp)
      attack = raw_input("[ATTACK/FLEE]: ")
      if attack == 'ATTACK':
         creature_atk = random.randint(*creature['attack_range'])
         spider -= att
         hp -= creature_atk
         if hp < 0:
            print "You died!"
            return DEATH
      if attack == 'FLEE':
         print "You have flee'd the fight and  lost 10 HP"
         hp -= 10
         if hp < 0:
            print "You died!"
            return DEATH
      if spider < 1:
         goldw = creature['goldw']
         xpgot = creature['xpgot']
         print "You have defeated the {0}!".format(creature_name)
         print "REWARD:", xpgot, "XP", goldw, "Gold"
         return (True, hp, xpgot, goldw)

(Sleeps and clear screen calls removed for brevity.) I'll leave it as an exercise to the reader to figure out how to incorporate the function into their code. Feel free to ask questions of course.

And I think I'll stop with the advice here, since if functions and code-reuse in general were incorporated it would simplify things tremendously and make future advice much easier to give. I'll also point out that classes would be a simple way to associate all the information with a particular player or a creature into a coherent single thing, much like I do with the creatures dictionary, but better. If you're interested in pursuing programming I would recommend taking this program you've written and improving it (saving every version!) so that you can look back on it and see your progress. Starting with functions and having a reasonably simple main loop should be your first priority. Once you feel very good about that, then at that point I'd have you move onto learning OOP.
Join the #python-forum IRC channel on irc.freenode.net!

Please do not PM members regarding questions which are meant to be discussed publicly. The point of the forum is so that others can benefit from it. We don't want to help you over PMs or emails.
User avatar
micseydel
 
Posts: 1488
Joined: Tue Feb 12, 2013 2:18 am
Location: Mountain View, CA

Re: Dragon Tale.

Postby ze_telerobot » Wed Jan 08, 2014 3:46 am

is there a bug with the part that says gate is not defines?

this is the report...

Code: Select all
Traceback (most recent call last):
  File "/Users/gflz/Documents/drgons", line 69, in <module>
    if (gate == 'Y'):
NameError: name 'gate' is not defined

is there anything i can do to make it better?
Last edited by Mekire on Wed Jan 08, 2014 4:17 am, edited 1 time in total.
Reason: First post lock; code tags.
ze_telerobot
 
Posts: 2
Joined: Wed Jan 08, 2014 3:42 am


Return to Completed Scripts

Who is online

Users browsing this forum: Bing [Bot] and 2 guests