Example #1
0
class Snake(object):
    def __init__(self, stdscr, l=3, d=3, x=MAX_WIDTH / 2, y=MAX_HEIGHT / 2):
        self.stdscr = stdscr  #Need this for collision detection, I guess?
        self.l = l
        self.next_direction = d
        self.cur_direction = self.next_direction
        self.x = x
        self.y = y

        self.score = 0

        self.Q = Queue()
        self.Q.enqueue((x, y))

    def setDirection(self, direction):
        """
        N = 0
        E = 1
        S = 2
        W = 3
        
        """
        if direction > DIR_WEST or direction < DIR_NORTH:
            raise Exception("Invalid Direction: " + str(direction))

        if (self.cur_direction + direction) % 2 != 0:  # This should work...
            self.next_direction = direction

    def getNextDirection(self):
        return self.next_direction

    def getCurrentDirection(self):
        return self.cur_direction

    def getScore(self):
        return self.score

    def addToScore(self, amount):
        self.score += amount

    def getLength(self):
        return self.l

    def lengthen(self):
        self.l *= 1.5

    def __iter__(self):
        return self.Q.__iter__()

    def collision(self, x, y):
        c = self.stdscr.inch(y, x)
        if c != BLANK_SQUARE:
            if c == BONUS:
                # Get longer!
                raise BonusException
            else:
                raise CollisionException
        return False

    def move(self):
        if self.getNextDirection() == DIR_NORTH:
            self.cur_direction = DIR_NORTH
            self.y -= 1
            self.Q.enqueue((self.x, self.y))
            if self.Q.size() > self.getLength():
                self.Q.dequeue()
        elif self.getNextDirection() == DIR_EAST:
            self.cur_direction = DIR_EAST
            self.x += 1
            self.Q.enqueue((self.x, self.y))
            if self.Q.size() > self.getLength():
                self.Q.dequeue()
        elif self.getNextDirection() == DIR_SOUTH:
            self.cur_direction = DIR_SOUTH
            self.y += 1
            self.Q.enqueue((self.x, self.y))
            if self.Q.size() > self.getLength():
                self.Q.dequeue()
        elif self.getNextDirection() == DIR_WEST:
            self.cur_direction = DIR_WEST
            self.x -= 1
            self.Q.enqueue((self.x, self.y))
            if self.Q.size() > self.getLength():
                self.Q.dequeue()

        self.collision(self.x, self.y)

        return (self.x, self.y)