Tutorial #2
Subscribe to Tech with Tim
Snake Class - Move Method
Now we will continue coding the snake class by completing the move() method.
This method will first check for any events.
class snake(object): ... def move(): for event in pygame.event.get(): if event.type == pygame.QUIT: # Check if user hit the red x pygame.quit() keys = pygame.key.get_pressed() # See which keys are being pressed for key in keys: # Loop through all the keys if keys[pygame.K_LEFT]: self.dirnx = -1 self.dirny = 0 self.turns[self.head.pos[:]] = [self.dirnx, self.dirny] elif keys[pygame.K_RIGHT]: self.dirnx = 1 self.dirny = 0 self.turns[self.head.pos[:]] = [self.dirnx, self.dirny] elif keys[pygame.K_UP]: self.dirnx = 0 self.dirny = -1 self.turns[self.head.pos[:]] = [self.dirnx, self.dirny] elif keys[pygame.K_DOWN]: self.dirnx = 0 self.dirny = 1 self.turns[self.head.pos[:]] = [self.dirnx, self.dirny]
The most complicated part of this game is turning the snake. We need to remember where we turned our snake and which direction so that when the cubes after the head reach that spot we can turn them as well. This is why whenever we turn we add the position of our head to a turn dictionary where the value is the direction we turned. This way when the other cubes reach this position we know which way to turn them.
class snake(object): ... def move(self): for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() keys = pygame.key.get_pressed() for key in keys: if keys[pygame.K_LEFT]: self.dirnx = -1 self.dirny = 0 self.turns[self.head.pos[:]] = [self.dirnx, self.dirny] elif keys[pygame.K_RIGHT]: self.dirnx = 1 self.dirny = 0 self.turns[self.head.pos[:]] = [self.dirnx, self.dirny] elif keys[pygame.K_UP]: self.dirnx = 0 self.dirny = -1 self.turns[self.head.pos[:]] = [self.dirnx, self.dirny] elif keys[pygame.K_DOWN]: self.dirnx = 0 self.dirny = 1 self.turns[self.head.pos[:]] = [self.dirnx, self.dirny] for i, c in enumerate(self.body): # Loop through every cube in our body p = c.pos[:] # This stores the cubes position on the grid if p in self.turns: # If the cubes current position is one where we turned turn = self.turns[p] # Get the direction we should turn c.move(turn[0],turn[1]) # Move our cube in that direction if i == len(self.body)-1: # If this is the last cube in our body remove the turn from the dict self.turns.pop(p) else: # If we are not turning the cube # If the cube reaches the edge of the screen we will make it appear on the opposite side if c.dirnx == -1 and c.pos[0] <= 0: c.pos = (c.rows-1, c.pos[1]) elif c.dirnx == 1 and c.pos[0] >= c.rows-1: c.pos = (0,c.pos[1]) elif c.dirny == 1 and c.pos[1] >= c.rows-1: c.pos = (c.pos[0], 0) elif c.dirny == -1 and c.pos[1] <= 0: c.pos = (c.pos[0],c.rows-1) else: c.move(c.dirnx,c.dirny) # If we haven't reached the edge just move in our current direction
Drawing the Snake
To draw the snake we are simply going to draw each cube object in the body. We will do this in the snakes draw() method.
class snake(object): ... def draw(self): for i, c in enumerate(self.body): if i == 0: # for the first cube in the list we want to draw eyes c.draw(surface, True) # adding the true as an argument will tell us to draw eyes else: c.draw(surface) # otherwise we will just draw a cube
Now before we can start actually using snake.draw we must code the cube class.
Starting the Cube Class
We are going to start the cube class by coding the move() and init() methods.
class cube(object): rows = 20 w = 500 def __init__(self,start,dirnx=1,dirny=0,color=(255,0,0)): self.pos = start self.dirnx = 1 self.dirny = 0 self.color = color def move(self, dirnx, dirny): self.dirnx = dirnx self.dirny = dirny self.pos = (self.pos[0] + self.dirnx, self.pos[1] + self.dirny) # change our position