title: TypeError: __init__() takes at least 2 arguments (1 given) error
body: <p>I am developing a simple text based Dungeon game using Python3. First the user is prompted to select the hero from screen.py file.</p>
  
  <pre><code>from game import *
  
  
  class GameScreen:
      '''Display the current state of a game in a text-based format.
      This class is fully implemented and needs no
      additional work from students.'''
  
      def initialize_game(self):
          '''(GameScreen) -&gt; NoneType
          Initialize new game with new user-selected hero class
          and starting room files.'''
  
          hero = None
          while hero is None:
              c = input("Select hero type:\n(R)ogue (M)age (B)arbarian\n")
              c = c.lower()
              if c == 'r':
                  hero = Rogue()
              elif c == 'm':
                  hero = Mage()
              elif c == 'b':
                  hero = Barbarian()
  
          self.game = Game("rooms/startroom", hero)
  
      def play(self):
          '''(Game) -&gt; NoneType
          The main game loop.'''
  
          exit = False
          while not exit:
              print(self)
              if self.game.game_over():
                  break
              c = input("Next: ")
              if c in ['q', 'x']:
                  print("Thanks for playing!")
                  exit = True
              elif c == 'w':  # UP
                  self.game.move_hero(-1, 0)
              elif c == 's':  # DOWN
                  self.game.move_hero(1, 0)
              elif c == 'a':  # LEFT
                  self.game.move_hero(0, -1)
              elif c == 'd':  # RIGHT
                  self.game.move_hero(0, 1)
              elif c == 'r':
                  ## RESTART GAME
                  self.initialize_game()
              else:
                  pass
  
      def __str__(self):
          '''(GameScreen) -&gt; NoneType
          Return a string representing the current room.
          Include the game's Hero string represetation and a
          status message from the last action taken.'''
  
          room = self.game.current_room
          s = ""
  
          if self.game.game_over():
              #render a GAME OVER screen with text mostly centered
              #in the space of the room in which the character died.
  
              #top row
              s += "X" * (2 + room.cols) + "\n"
              #empty rows above GAME OVER
              for i in list(range(floor((room.rows - 2) / 2))):
                  s += "X" + " " * room.cols + "X\n"
              # GAME OVER rows
              s += ("X" + " " * floor((room.cols - 4) / 2) +
                  "GAME" + " " * ceil((room.cols - 4) / 2) + "X\n")
              s += ("X" + " " * floor((room.cols - 4) / 2) +
                  "OVER" + " " * ceil((room.cols - 4) / 2) + "X\n")
              #empty rows below GAME OVER
              for i in list(range(ceil((room.rows - 2) / 2))):
                  s += "X" + " " * room.cols + "X\n"
              #bottom row
              s += "X" * (2 + room.cols) + "\n"
          else:
              for i in range(room.rows):
                  for j in room.grid[i]:
                      if j is not None:
                          if j.visible:
                              s += j.symbol()
                          else:
                              #This is the symbol for 'not yet explored' : ?
                              s += "?"
                  s += "\n"
          #hero representation
          s += str(self.game.hero)
          #last status message
          s += room.status
          return s
  
  if __name__ == '__main__':
      gs = GameScreen()
      gs.initialize_game()
      gs.play()
  </code></pre>
  
  <p>Whenever I run this code, I get this error: TypeError: <strong>init</strong>() takes at least 2 arguments (1 given) which has to do with Rogue() or other hero classes. Here's the hero.py.</p>
  
  <pre><code>class Rogue(Tile):
      '''A class representing the hero venturing into the dungeon.
      Heroes have the following attributes: a name, a list of items,
      hit points, strength, gold, and a viewing radius. Heroes
      inherit the visible boolean from Tile.'''
  
      def __init__(self, rogue, bonuses=(0, 0, 0)):
          '''(Rogue, str, list) -&gt; NoneType
          Create a new hero with name Rogue,
          an empty list of items and bonuses to
          hp, strength, gold and radius as specified
          in bonuses'''
  
          self.rogue = rogue
          self.items = []
          self.hp = 10 + bonuses[0]
          self.strength = 2 + bonuses[1]
          self.radius = 2 + bonuses[2]
          Tile.__init__(self, True)
  
      def symbol(self):
          '''(Rogue) -&gt; str
          Return the map representation symbol of Hero: O.'''
  
          #return "\u263b"
          return "O"
  
      def __str__(self):
          '''(Item) -&gt; str
          Return the Hero's name.'''
  
          return "{}\nHP:{:2d} STR:{:2d} RAD:{:2d}\n".format(
                      self.rogue, self.hp, self.strength, self.radius)
  
      def take(self, item):
          '''ADD SIGNATURE HERE
          Add item to hero's items
          and update their stats as a result.'''
  
          # IMPLEMENT TAKE METHOD HERE
          pass
  
      def fight(self, baddie):
          '''ADD SIGNATURE HERE -&gt; str
          Fight baddie and return the outcome of the
          battle in string format.'''
  
          # Baddie strikes first
          # Until one opponent is dead
              # attacker deals damage equal to their strength
              # attacker and defender alternate
          if self.hp &lt; 0:
              return "Killed by"
          return "Defeated"
  </code></pre>
  
  <p>What am I doing wrong?</p>