[Tutor] __init__ argument

Joshua Wilkerson joshjwilkerson at yahoo.com
Fri Mar 15 23:46:29 CET 2013


The program keeps telling me that the __init__ in Rock takes two arguments and only one is given. Ideas?
The point of the game is to dodge falling rocks. Two more appear every time one reaches the bottom of the screen.

# Avalanche, a dodging game
# Written by Josh Wilkerson
# Dodge falling rocks, two new rocks appear every time a rock hits the bottom.

from livewires import games, color
import random

games.init(screen_width = 640, screen_height = 480, fps = 50)

class Chef(games.Sprite):
    """
    A chef controlled by the player to dodge falling rocks.
    """
    image = games.load_image("chef.jpg")

    def __init__(self, y = 450):
        """ Initialize Chef object and create Text object for score. """
        super(Chef, self).__init__(image = Chef.image,
                                   x = games.mouse.x,
                                   bottom = games.screen.height)

        self.score = games.Text(value = 0, size = 25, color = color.black,
                                top = 5, right = games.screen.width - 10)
        games.screen.add(self.score)

def update(self):
    """ Move to mouse position x. """
    self.x = games.mouse.x

    if self.left < 0:
        self.left = 0

    if self.right > games.screen.width:
        self.right = games.screen.width

    self.check_catch()

    def check_hit(self):
        """ Check if hit by rcok. """
        for rock in self.overlapping_sprites:
            self.end_game()
            self.destroy()

class Rock(games.Sprite):
    """
    A rock which falls to the ground.
    """
    image = games.load_image("rock.jpg")
    speed = 1
    def __init__(self, x, y = 90):
        """ Initiate a rock object. """
        super(Rock, self).__init__(image = Rock.image,
                                   x = x, y = y,
                                   dy = rock.speed)

    def update(self):
        """ Check if bottom edge has reached screen bottom. """
        if self.bottom > games.screen.height:
            SPAWN = 2
            Rock.SPAWN
            

    def handle_hit(self):
        """ Destroy self if hits chef. """
        self.destroy()

    def end_game(self):
        """ End the game. """
        end_message = games.Message(value = "Game Over",
                                    size = 90,
                                    color = color.red,
                                    x = games.screen.width / 2,
                                    y = games.screen.height / 2,
                                    lifetime = 5 * games.screen.fps,
                                    after_death = games.screen.quit)
        games.screen.add(end_message)

class Dropper(games.Sprite):
    """
    An invisible object that drops the rocks.
    """
    def __init___(self, y = 55, speed = 2, odds_change = 200):
        """ Initialize the Dropper object. """
        super(Dropper, self).__init__(x = games.screen.width / 2,
                                      y = y,
                                      dx = speed)
        self.odds_change = odds_change
        self.time_til_drop = 0

    def update(self):
        """ Determines if direction needs to be reversed. """
        if self.left < 0 or self.right > games.screen.width:
            self.dx = -self.dx
        elif random.randrange(self.odds_change) == 0:
            self.dx = -self.dx

        self.check_drop()

    def check_drop(self):
        """ Decreases countdown or drop rock and reset countdown. """
        if self.time_til_drop > 0:
            self.time_til_drop -= 1
        else:
            new_rock = Rock(x = self.x)
            games.screen.add(new_rock)
        # set buffer to approx 30% of rock height, regardless of pizza speed
        self.time_til_drop = int(new_rock.height * 1.3 / Rock.speed) + 1

def main():
    """ Play the game. """
    backround_image = games.load_image("backround.jpg", transparent = False)
    games.screen.backround = backround_image

    the_chef = Chef()
    games.screen.add(the_chef)

    the_rock = Rock()
    games.screen.add(the_rock)

    the_dropper = Dropper()
    games.screen.add(the_dropper)

    games.mouse.is_visible = False
    
    games.screen.event_grab = True
    gsmes.screen.mainloop()

# start it up
main()

This is the error.

Exception AttributeError: "'Rock' object has no attribute '_gone'" in <bound method Rock.__del__ of <__main__.Rock object at 0x02C2F030>> ignored

Traceback (most recent call last):
  File "C:\Users\Joshua\Projects\Avalanche\Avalanche.py", line 129, in <module>
    main()
  File "C:\Users\Joshua\Projects\Avalanche\Avalanche.py", line 117, in main
    the_rock = Rock()
TypeError: __init__() takes at least 2 arguments (1 given)
>>> 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20130315/856796ba/attachment-0001.html>


More information about the Tutor mailing list