I have been trying to learn python over the last couple of months and i decided to give making a snake game a go to further improve my knowledge. I have no idea what is wrong but it get’s stuck in my output for loop. I have tried multiple things, none of which led to success. Here’s my code:
import pygame, sys
from pygame.locals import *
from collections import deque
pygame.init()
clock = pygame.time.Clock()
background = [
['++++++++++++++++++++++++++++++'],
['+ +'],
['+ +'],
['+ +'],
['+ +'],
['+ +'],
['+ +'],
['+ +'],
['+ +'],
['+ +'],
['+ +'],
['+ +'],
['+ +'],
['+ +'],
['++++++++++++++++++++++++++++++']]
screen_surface = background
y, x = 7, 14
location = (y, x)
snake_head = '@'
snake_body = 'x'
direction = 'left'
past_moves = deque([(7, 15), (7, 16), (7, 17), (7, 18)])
def Clear_ScreenSurface():
screen_surface = background
def Draw_ScreenSurface():
for i in range(15):
a = screen_surface[i][:]
if i == 14:
return
print a
def Update_Past_Moves():
past_moves.popleft()
def Print_Snake_Body():
for i in range(len(past_moves)):
a1 = past_moves[i][0] - 1
a2 = past_moves[i][1] - 1
screen_surface[a1][a2:(a2 + 1)] = snake_body
def Print_Snake_Head():
screen_surface[location[0]][location[1]:(location[1] + 1)] = snake_head
def Check_Collision():
if location[1] == 0 or location[1] == 29:
pass
if location[0] == 0 or location[0] == 14:
pass
for a in range(len(past_moves)):
a = a - 1
if location[0] == past_moves[a][0] and location[1] == past_moves[a][1]:
pass
def main():
direction = 'left'
y, x = 7, 14
location = (y, x)
while 1:
Print_Snake_Head()
Print_Snake_Body()
Draw_ScreenSurface()
Clear_ScreenSurface()
past_moves.append(location)
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
direction = 'up'
elif event.key == pygame.K_LEFT:
direction = 'left'
elif event.key == pygame.K_DOWN:
direction = 'down'
elif event.key == pygame.K_RIGHT:
direction = 'right'
if direction == 'up':
location = (y - 1, x)
y, x = location[0], location[1]
if direction == 'left':
location = (y, x - 1)
y, x = location[0], location[1]
if direction == 'down':
location = (y + 1, x)
y, x = location[0], location[1]
if direction == 'right':
location = (y, x + 1)
y, x = location[0], location[1]
if location != 'O':
Update_Past_Moves()
Check_Collision()
clock.tick(30)
main()
And this is the output:
['x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x']
['+ +', '@', '@', '@', '@', '@', '@', '@', '@', '@', '@', '@', '@', '@', '@']
['+ +']
['+ +']
['+ +']
['+ +']
['+ +']
['+ +']
['++++++++++++++++++++++++++++++']
['+ +']
['+ +']
['+ +']
['+ +']
Traceback (most recent call last):
File "C:\Users\Coding\Python Programming\Snake Game\snake_game.py", line 112, in <module>
main()
File "C:\Users\Coding\Python Programming\Snake Game\snake_game.py", line 78, in main
Draw_ScreenSurface()
File "C:\Users\Coding\Python Programming\Snake Game\snake_game.py", line 45, in Draw_ScreenSurface
print a
KeyboardInterrupt
I have to press CTRL-c (windows) to end it and this output is repeated, I didn’t want to spam my question with unnecessary code. Thanks in advance.
The following reduces the size of your ‘moves list’
So, when you try to print the snake, finally there will be nothing to draw:
That is why, all you see is the snake’s ‘head’, the @ character