I am trying to run this program in python 2.7. But get an error Traceback (most recent call last):

  File "C:/Python27/Rpg1.py", line 95, in <module>
    p = Player()
  File "C:/Python27/Rpg1.py", line 25, in __init__
AttributeError: class Character has no attribute '__init__'

When run this pragram can someone help me out, I am new to python and do not understand it fully yet.... Thanks

from random import randint
class Character:
   class Character:
      def __init__(self):
         self.name =""
         self.health = 1
         self.health_max = 1
         def do_damage(self, enemy):
            damage = min(
                       max(randint(0, self.health) - randint(0, enemy.health), 0),
            enemy.health = enemy.health - damage
            if damage == 0: print "%s evades %s's attack." % (enemy.name, self.name)
            else: print "%s hurts %s!" % (self.name, enemy.name)
            return enemy.health <= 0

class Enemy(Character):
  def __init__(self, player):
    self.name = 'a goblin'
    self.health = randint(1, player.health)

class Player(Character):
  def __init__(self):
    self.state = 'normal'
    self.health = 10
    self.health_max = 10
  def quit(self):
    print "%s can't find the way back home, and dies of starvation.\nR.I.P." % self.name
    self.health = 0
  def help(self): print Commands.keys()
  def status(self): print "%s's health: %d/%d" % (self.name, self.health, self.health_max)
  def tired(self):
    print "%s feels tired." % self.name
    self.health = max(1, self.health - 1)
  def rest(self):
    if self.state != 'normal': print "%s can't rest now!" % self.name; self.enemy_attacks()
      print "%s rests." % self.name
      if randint(0, 1):
        self.enemy = Enemy(self)
        print "%s is rudely awakened by %s!" % (self.name, self.enemy.name)
        self.state = 'fight'
        if self.health < self.health_max:
          self.health = self.health + 1
        else: print "%s slept too much." % self.name; self.health = self.health - 1
  def explore(self):
    if self.state != 'normal':
      print "%s is too busy right now!" % self.name
      print "%s explores a twisty passage." % self.name
      if randint(0, 1):
        self.enemy = Enemy(self)
        print "%s encounters %s!" % (self.name, self.enemy.name)
        self.state = 'fight'
        if randint(0, 1): self.tired()
  def flee(self):
    if self.state != 'fight': print "%s runs in circles for a while." % self.name; self.tired()
      if randint(1, self.health + 5) > randint(1, self.enemy.health):
        print "%s flees from %s." % (self.name, self.enemy.name)
        self.enemy = None
        self.state = 'normal'
      else: print "%s couldn't escape from %s!" % (self.name, self.enemy.name); self.enemy_attacks()
  def attack(self):
    if self.state != 'fight': print "%s swats the air, without notable results." % self.name; self.tired()
      if self.do_damage(self.enemy):
        print "%s executes %s!" % (self.name, self.enemy.name)
        self.enemy = None
        self.state = 'normal'
        if randint(0, self.health) < 10:
          self.health = self.health + 1
          self.health_max = self.health_max + 1
          print "%s feels stronger!" % self.name
      else: self.enemy_attacks()
  def enemy_attacks(self):
    if self.enemy.do_damage(self): print "%s was slaughtered by %s!!!\nR.I.P." %(self.name, self.enemy.name)

Commands = {
  'quit': Player.quit,
  'help': Player.help,
  'status': Player.status,
  'rest': Player.rest,
  'explore': Player.explore,
  'flee': Player.flee,
  'attack': Player.attack,

p = Player()
p.name = raw_input("What is your character's name? ")
print "(type help to get a list of actions)\n"
print "%s enters a dark cave, searching for adventure." % p.name

while(p.health > 0):
  line = raw_input("> ")
  args = line.split()
  if len(args) > 0:
    commandFound = False
    for c in Commands.keys():
      if args[0] == c[:len(args[0])]:
        commandFound = True
    if not commandFound:
      print "%s doesn't understand the suggestion." % p.name[[/ICODE]

Edited by mike_2000_17: Fixed formatting

6 Years
Discussion Span
Last Post by pyTony

Character seems to be inside class ie namespace. So you must use Character.Character instead of only Character if you use the class from outside of the namespace.

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.