Reputation: 79
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.
Upvotes: 2
Views: 549
Reputation: 4449
The infinite loops seems ok, since you are using while 1:
You are printing the head always one cell down of the location, that's why you get @ in the second row:
def Print_Snake_Head():
screen_surface[location[0]][location[1]:(location[1] + 1)] = snake_head
The line if location != 'O':
doens't make sence, since location is a pair of coordinates not a char.
Upvotes: 0
Reputation: 6767
The following reduces the size of your 'moves list'
def Update_Past_Moves():
past_moves.popleft()
So, when you try to print the snake, finally there will be nothing to draw:
def Print_Snake_Body():
for i in range(len(past_moves)):
# No moves left
That is why, all you see is the snake's 'head', the @ character
Upvotes: 2