I've created a list of sprites to try and make a
basic 'snake' game. The idea is to shuffle each sprite to the
position of the next, starting at the end of the tail, and then
move the head. As I append new tail pieces, they should 'snake'
along. However, when I move the head sprite ( Snake[0] in my
list 'Snake'), they all seem to move to the same position. Even
when I omit the line that moves them along by commenting out
'Snake[tail] = Snake[tail-1]' in my for loop, it still moves
every sprite in the list Snake[] to the same place as Snake[0],
which is inexplicable to me as I'm not even moving them then.
Can anyone point out my mistake please? This is just a learner
project, but it's driving me nuts.
import pygame, sys
from pygame.locals import*
import random
#colours========================================================
BLACK = (0,0,0)
WHITE = (255,255,255)
RED = (255,0,0)
GREEN = (0,255,0)
BLUE = (0,0,255)
PURPLE = (128,0,128)
GREY = (128,128,128)
YELLOW = (255,255,0)
pygame.init()
Height = 1920
Width = 1080
score = 0
basicfont = pygame.font.SysFont(None, 50)
Score = basicfont.render("Score: " + str(score), True,
WHITE, GREEN)
ScoreRect = Score.get_rect()
ScoreRect.left =560
ScoreRect.bottom = 130
moveLeft = False
moveRight = False
moveUp = False
moveDown = False
PlayerSpeed = 40
def GameBoard():
pygame.display.set_caption("Snake_Game")
Window.fill(GREEN)
pygame.draw.line(Window,
BLACK,(560,140),(1360,140),4)
pygame.draw.line(Window, BLACK,(560,140),(560,940),4)
pygame.draw.line(Window,
BLACK,(1360,140),(1360,940),4)
pygame.draw.line(Window,
BLACK,(560,940),(1360,940),4)
#GAME===========================================================
mainClock = pygame.time.Clock()
Window = pygame.display.set_mode((Height,Width), 0,
32)
#PLayer=========================================================
Snake =[]
Snake.append (pygame.Rect(940,500,40,40))
playerImage = pygame.image.load("Snake.GIF")
Window.blit(playerImage,Snake[0])
#Apple==========================================================
def PlotApple():
global AppleX
global AppleY
global Apple
AppleX = random.randint(560,1320)
AppleY = random.randint(140,900)
Apple = pygame.Rect(AppleX,AppleY,40,40)
PlotApple()
AppleImage = pygame.image.load("Apple.GIF")
Window.blit(AppleImage,Apple)
pygame.display.update()
#================================================================
while True:
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == K_ESCAPE:
pygame.quit()
#===================================================
if event.type == KEYDOWN:
#===============================================
if event.key == K_LEFT:
moveRight = False
moveLeft = True
moveDown = False
moveUp = False
#===============================================
if event.key == K_RIGHT:
moveLeft = False
moveRight = True
moveDown = False
moveUp = False
#===============================================
if event.key == K_UP:
moveDown = False
moveUp = True
moveLeft = False
moveRight = False
#===============================================
if event.key ==K_DOWN:
moveUp = False
moveDown = True
moveLeft = False
moveRight = False
#KEYUP===============================================
if event.type == KEYUP:
#===================================================
if event.key == K_ESCAPE:
pygame.quit()
sys.exit()
#MovePlayer===================================================
mainClock.tick(10)
GameBoard()
for tail in range (len(Snake)-1,0,-1):
print(Snake,tail)
Snake[tail] = Snake[tail-1]
Window.blit(playerImage,Snake[tail])
print(Snake,tail)
if moveDown:
Snake[0].top += PlayerSpeed
if moveUp:
Snake[0].top -= PlayerSpeed
if moveLeft:
Snake[0].left -= PlayerSpeed
if moveRight:
Snake[0].right += PlayerSpeed
if Snake[0].bottom >=940 or Snake[0].top<+140
or Snake[0].left<=560 or Snake[0].right>=1360:
pygame.quit()
Score = basicfont.render("Score:" + str(score), True,
WHITE, GREEN)
Window.blit(playerImage,Snake[0])
Window.blit(AppleImage,Apple)
Window.blit(Score,ScoreRect)
if Snake[0].colliderect(Apple):
score = score +50
Snake.append (Snake[0])
PlotApple()
pygame.display.update()