# 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

elif keys[pygame.K_RIGHT]:
self.dirnx = 1
self.dirny = 0

elif keys[pygame.K_UP]:
self.dirnx = 0
self.dirny = -1

elif keys[pygame.K_DOWN]:
self.dirnx = 0
self.dirny = 1
```

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

elif keys[pygame.K_RIGHT]:
self.dirnx = 1
self.dirny = 0

elif keys[pygame.K_UP]:
self.dirnx = 0
self.dirny = -1

elif keys[pygame.K_DOWN]:
self.dirnx = 0
self.dirny = 1

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
```