Programming Forums
User Name Password Register
 

RSS Feed
FORUM INDEX | TODAY'S POSTS | UNANSWERED THREADS | ADVANCED SEARCH

Reply
 
Thread Tools Display Modes
Old May 3rd, 2005, 7:39 PM   #1
Sane
Programming Guru
 
Sane's Avatar
 
Join Date: Apr 2005
Posts: 1,825
Rep Power: 5 Sane will become famous soon enough
How do I check...

...for the existance of a certain variable/class?

How do I make the program flow execute a certain piece of code if it finds a certain variable to be existant, or a certain class to have been called?

Because I don't want to check the condition of something that doesn't have a value.
Sane is offline   Reply With Quote
Old May 3rd, 2005, 8:54 PM   #2
al1986
Newbie
 
Join Date: Feb 2005
Posts: 24
Rep Power: 0 al1986 is on a distinguished road
You could do something like:
if vars().has_key("x"):
    # Do something
But I reckon exception handling would be a better option.
al1986 is offline   Reply With Quote
Old May 4th, 2005, 12:34 AM   #3
ZenMasterJG
Hobbyist Programmer
 
ZenMasterJG's Avatar
 
Join Date: Nov 2004
Location: Boston, MA
Posts: 148
Rep Power: 4 ZenMasterJG is on a distinguished road
Send a message via AIM to ZenMasterJG
yeah, go ahead and see if it has a value, if it doesnt, it'll throw a NameError or somthing similar
ZenMasterJG is offline   Reply With Quote
Old May 4th, 2005, 5:50 AM   #4
Sane
Programming Guru
 
Sane's Avatar
 
Join Date: Apr 2005
Posts: 1,825
Rep Power: 5 Sane will become famous soon enough
This is a video game, I don't want it throwing up an error whenever you start a battle with only 2 of your 4 characters battling. T_T
Sane is offline   Reply With Quote
Old May 4th, 2005, 8:29 AM   #5
Moldz
Programmer
 
Moldz's Avatar
 
Join Date: Feb 2005
Posts: 54
Rep Power: 4 Moldz is on a distinguished road
How about a more concrete example? For instance, do you have a list of characters that you can iterate through?
if len(charlist) < 4:
   # show a warning
Or if you have four variables:
if char1 == None or char2 == None:
   # show a warning
Give us a better feel for the code so we can give you an appropriate method.
Moldz is offline   Reply With Quote
Old May 4th, 2005, 3:13 PM   #6
Sane
Programming Guru
 
Sane's Avatar
 
Join Date: Apr 2005
Posts: 1,825
Rep Power: 5 Sane will become famous soon enough
import random

def figure_exp(lvl):
    experience = 0
    for a in range(1, lvl+1):experience += (a/2*500 + a*10)
    b = str(experience)
    return b

def return_turns(party, enemy, ratio):

    """Declare an array of values carrying the character
    number and speed, for all characters"""
    SpeedSet = []    
    Set = []    
    for a in range(len(party)):
        Set.append(10*party[a][1]+party[a][0])
        b= Set[a]
        SpeedSet.append(b)
    Set = []           
    for a in range(len(enemy)):
        Set.append(10*enemy[a][1]+enemy[a][0])
        b= Set[a]
        SpeedSet.append(b)

    """Sort from greatest to least to more easily manage"""
    SpeedSet.sort()
    SpeedSet.reverse()

    """Assign a ratio value based on the difference from
    the maximum speed, including the ratio value inputted
    in the main function argument"""
    NewSet = []
    for a in range(len(SpeedSet)):
        NewSet.append( int((( float( int( str(max(SpeedSet)) [:len(str(max(SpeedSet)))-1] ) - int( str(SpeedSet[a]) [:len(str(SpeedSet[a]))-1] )) / (int(max(SpeedSet))/ratio)+1) *100)+1 ))

    """Eliminate odd ratio values"""
    for a in range(len(NewSet)):
        if NewSet[a]%2 == 0:
            NewSet[a]+=1
            
    """Assign turns based on the divisibility of one's ratio"""
    Turns = []
    for b in range(10000):
        for a in range(len(NewSet)):
            if (b+1)%NewSet[a] == 0: Turns.append(int(str(SpeedSet[a])[len(str(SpeedSet[a]))-1]))

    """End function"""
    return Turns 


    #################################################################
    player1 = 0
    player2 = 0
    enemy1 = 0
    enemy2 = 0
    
    for a in range(len(Turns)):
        if Turns[a] == "1": player1 += 1
        if Turns[a] == "2": player2 += 1
        if Turns[a] == "3": enemy1 += 1
        if Turns[a] == "4": enemy2 += 1
    print "Player 1: Gets %d Turns, With %s Speed."%(player1, str(party[0][1]))
    print "Player 2: Gets %d Turns, With %s Speed."%(player2, str(party[1][1]))
    print "Enemy 1: Gets %d Turns, With %s Speed."%(enemy1, str(enemy[0][1]))
    print "Enemy 2: Gets %d Turns, With %s Speed."%(enemy2, str(enemy[1][1]))
    
    print Turns
    #################################################################


class battle_object (object):
    def __init__(self, stats):
        self.name = stats[0]
        self.level = stats[1]
        if len(stats) == 15:
            self.curHP = stats[3]
            self.maxHP = stats[2]
            self.curMP = stats[5]
            self.maxMP = stats[4]
            self.strength = stats[6]
            self.defense = stats[7]
            self.agility = stats[8]
            self.luck = stats[9]
            self.accuracy = stats[10]
            self.experience = stats[11]
            self.weapon = stats[12]
            self.armor = stats[13]
            self.magic = stats[14]
        elif len(stats) == 10:
            self.curHP = stats[2]
            self.maxHP = stats[2]
            self.curMP = stats[3]
            self.maxHP = stats[3]
            self.strength = stats[4]
            self.defense = stats[5]
            self.agility = stats[6]
            self.luck = stats[7]
            self.accuracy = stats[8]
            self.magic = stats[9]
            self.experience = '';self.weapon = '';self.armor = ''
        else: print len(stats)
    def attack(self, target):
            target.curHP -= self.strength   

def battle (party, enemy, area):

    p = []
    if len(party) > 0: character0 = battle_object(party[0]);p.append([0, character0.agility]);characters=1
    if len(party) > 1: character1 = battle_object(party[1]);p.append([1, character1.agility]);characters=2
    if len(party) > 2: character2 = battle_object(party[2]);p.append([2, character2.agility]);characters=3
    if len(party) > 3: character3 = battle_object(party[3]);p.append([3, character3.agility]);characters=4

    e = []
    if len(enemy) > 0: enemy4 = battle_object(enemy[0]);e.append([4, enemy4.agility]);enemies=1
    if len(enemy) > 1: enemy5 = battle_object(enemy[1]);e.append([5, enemy5.agility]);enemies=2
    if len(enemy) > 2: enemy6 = battle_object(enemy[2]);e.append([6, enemy6.agility]);enemies=3
    if len(enemy) > 3: enemy7 = battle_object(enemy[3]);e.append([7, enemy7.agility]);enemies=4
    if len(enemy) > 4: enemy8 = battle_object(enemy[4]);e.append([8, enemy8.agility]);enemies=5
    if len(enemy) > 5: enemy9 = battle_object(enemy[5]);e.append([9, enemy9.agility]);enemies=6


    def enemy_simplify(area, enemyID):
        a = random.randrange(0, 8)
        if a == 0:
            if character3:
                target = character3
            elif character2:
                target = character2
            elif character1:
                target = character1
            elif character0:
                target = character0       
        if a == 1:
            if character2:
                target = character2
            elif character1:
                target = character1
            elif character0:
                target = character0
            elif character3:
                target = character3
        if a == 2:
            if character1:
                target = character1
            elif character0:
                target = character0
            elif character3:
                target = character3
            elif character2:
                target = character2
        if a == 3:
            if character0:
                target = character0
            elif character3:
                target = character3
            elif character2:
                target = character2
            elif character1:
                target = character1    
        if a == 4:
            if character3:
                target = character3
            elif character0:
                target = character0
            elif character1:
                target = character1
            elif character2:
                target = character2       
        if a == 5:
            if character2:
                target = character2
            elif character3:
                target = character3
            elif character0:
                target = character0
            elif character1:
                target = character1
        if a == 6:
            if character1:
                target = character1
            elif character2:
                target = character2
            elif character3:
                target = character3
            elif character0:
                target = character0
        if a == 7:
            if character0:
                target = character0
            elif character1:
                target = character1
            elif character2:
                target = character2
            elif character3:
                target = character3              
        if area == "area_2":
            if enemyID == 4: [enemy4.attack(target), enemy4.magic(target),
                              enemy4.attack(target), enemy4.magic(target),
                              enemy4.attack(target), enemy4.magic(target),
                              enemy4.attack(target), enemy4.magic(target),
                              enemy4.attack(target), enemy4.magic(target),
                              enemy4.attack(target), enemy4.run()         ] % (random.randrange(0,12))  
            if enemyID == 5: [enemy5.attack(target), enemy5.magic(target),
                              enemy5.attack(target), enemy5.magic(target),
                              enemy5.attack(target), enemy5.magic(target),
                              enemy5.attack(target), enemy5.magic(target),
                              enemy5.attack(target), enemy5.magic(target),
                              enemy5.attack(target), enemy5.run()         ] % (random.randrange(0,12))
            if enemyID == 6: [enemy6.attack(target), enemy6.magic(target),
                              enemy6.attack(target), enemy6.magic(target),
                              enemy6.attack(target), enemy6.magic(target),
                              enemy6.attack(target), enemy6.magic(target),
                              enemy6.attack(target), enemy6.magic(target),
                              enemy6.attack(target), enemy6.run()         ] % (random.randrange(0,12))
            if enemyID == 7: [enemy7.attack(target), enemy7.magic(target),
                              enemy7.attack(target), enemy7.magic(target),
                              enemy7.attack(target), enemy7.magic(target),
                              enemy7.attack(target), enemy7.magic(target),
                              enemy7.attack(target), enemy7.magic(target),
                              enemy7.attack(target), enemy7.run()         ] % (random.randrange(0,12))
            if enemyID == 8: [enemy8.attack(target), enemy8.magic(target),
                              enemy8.attack(target), enemy8.magic(target),
                              enemy8.attack(target), enemy8.magic(target),
                              enemy8.attack(target), enemy8.magic(target),
                              enemy8.attack(target), enemy8.magic(target),
                              enemy8.attack(target), enemy8.run()         ] % (random.randrange(0,12))
            if enemyID == 9: [enemy9.attack(target), enemy9.magic(target),
                              enemy9.attack(target), enemy9.magic(target),
                              enemy9.attack(target), enemy9.magic(target),
                              enemy9.attack(target), enemy9.magic(target),
                              enemy9.attack(target), enemy9.magic(target),
                              enemy9.attack(target), enemy9.run()         ] % (random.randrange(0,12))
            
    turns = return_turns(p, e, 5)

    battle_return = "0"
    while battle_return == "0":

        if turns[0] == 0:
            print"#Character0"
            
        elif turns[0] == 1:
            print"#Character1"
            
        elif turns[0] == 2:
            print"#Character2"
            
        elif turns[0] == 3:
            print"#Character3"
            
        elif turns[0] > 3:
            enemy_simplify(area, turns[0])

        ###if character dies, characters -= 1
            
        """Check Status"""
        if characters == 0:
            battle_return = 'You Died'
        elif enemies == 0:
            battle_return = 'You Won'

        """Advance to the next turn"""   
        turns = turns[1:]
   
##########################################
name="Turk"
lvl = 5
maxhp = "30"
curhp = "30"
maxmp = "5"
curmp = "5"
stn = 12
defn = 8
agi = 7
luck = 9
accuracy = 7
exp = figure_exp(lvl)
weapon = "Rusty Sword"
armor = "Rusty Armor"
magic = ["ice"]
Turk = [name, lvl, maxhp, curhp, maxmp, curmp, stn, defn, agi, luck, accuracy, exp, weapon, armor, magic]
party = [Turk]
area = "area_2"

#def average_enemy_stats([name, e_lvl, e_hp, e_mp, e_stn, e_defn, e_agi, e_luck, e_acc, magic]):
#    enemy = [name, e_lvl, e_hp, e_mp, e_stn, e_defn, e_agi, e_luck, e_acc, magic]
#    return enemy

e_lvl = (random.randrange(1,3))
enemy = [ ["Goblin",
                             (random.randrange(1,3)),
                             (((e_lvl + 5) * 2) + random.randrange(0, 3))+1,
                             (0)+1,
                             ((e_lvl) * 2)+1,
                             ((e_lvl) * 2) + random.randrange(-2, 2)+1,
                             ((e_lvl) * 2) + random.randrange(-2, 4)+1,
                             ((e_lvl) * 2) + random.randrange(-2, 1)+1,
                             ((e_lvl) +30) / 10 + random.randrange(0, e_lvl)+1,
                             ["fire"] ] ]
battle(party, enemy, area)
##########################################

I want the bold lines to execute the indentation, only if the variable exists (has been declared). I know you could add a temporary variable that is called 1 when the variable is called, and is otherwise 0. But I'd still like to know if there is a very simple method.
Sane is offline   Reply With Quote
Old May 4th, 2005, 7:56 PM   #7
hydroxide
Programmer
 
Join Date: Apr 2005
Posts: 73
Rep Power: 4 hydroxide is on a distinguished road
If you have your characters in a list you should do something along the lines of:
import random
charlist = ["Joe", "Mary", "Kim"] # in reality this would be a list of
                                  # player character objects

class Monster(str):  # In reality this would be a proper object
    def select_target(self):
        mytarget = random.choice(charlist)
        print self, "attacking", mytarget

m1 = Monster("goblin")
m2 = Monster("imp")
for i in range(5):
    m1.select_target()
    m2.select_target()
Using random.choice() means that not only can you cut out a lot of code, you can have any number of characters. Making individual objects select their targets means that you can have individual behaviours:
class KHater(str): # Attacks players whose name begins with "K"
    def select_target(self):
        ktargets = [char for char in charlist if char.startswith("K")]
        if ktargets:
            target = random.choice(ktargets)
            print "I'm attacking ktarget", target
        else:
            target = random.choice(charlist)
            print "Couldn't find a ktarget - attacking", target
khater = KHater("K Hater")
khater.select_target()
khater.select_target()
charlist.remove("Kim")
khater.select_target()
khater.select_target()

--OH.
hydroxide is offline   Reply With Quote
Old May 4th, 2005, 8:45 PM   #8
Moldz
Programmer
 
Moldz's Avatar
 
Join Date: Feb 2005
Posts: 54
Rep Power: 4 Moldz is on a distinguished road
Ok, I ran your code and got the NameError exception. The quick solution is to just add the following right after the import statement:
character1 = None
character2 = None
character3 = None
character4 = None
You will now get some other errors which I didn't try to debug. Man, you really need to refactor your code to clean it up. For example, you have a lot of variables just floating around, like:
name="Turk"
lvl = 5
maxhp = "30"
curhp = "30"
maxmp = "5"
curmp = "5"
stn = 12
defn = 8
agi = 7
luck = 9
accuracy = 7
You could replace all of this with a dictionary to clean up your namespace:
stats['lvl'] = 5
stats['maxhp'] = 30
stats['curhp'] = 30
And so on. Also, having such a huge block of if's is usually a sign that you need to rethink your function.
Moldz is offline   Reply With Quote
Old May 5th, 2005, 6:12 AM   #9
Sane
Programming Guru
 
Sane's Avatar
 
Join Date: Apr 2005
Posts: 1,825
Rep Power: 5 Sane will become famous soon enough
That block isn't part of the code. I just put it there to make the function able to be called.

Although that random_choice() is helpful, all I wanted to know was if there was a statement to check if a variable exists. I guess not. I'll be fine.
Sane is offline   Reply With Quote
Old May 5th, 2005, 9:04 AM   #10
Moldz
Programmer
 
Moldz's Avatar
 
Join Date: Feb 2005
Posts: 54
Rep Power: 4 Moldz is on a distinguished road
Well al1986 already gave you an answer a few posts back:
Quote:
Originally Posted by al1986
You could do something like:
if vars().has_key("x"):
    # Do something
But I reckon exception handling would be a better option.
IOW, vars() returns a dictionary of the local symbol table. You could check if it contains the symbols character1, character2, ... by replacing the x in the snippet above with the variable name. Check out the built-in functions doc.
Moldz is offline   Reply With Quote
Reply

Bookmarks

« Previous Thread in Forum | Next Thread in Forum »

Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump




DaniWeb IT Discussion Community
All times are GMT -5. The time now is 10:15 PM.

Powered by vBulletin® Version 3.7.0, Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Copyright ©2007 DaniWeb® LLC