[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[pygame] Re: Odd behaviour of sprites in a list - newbie help please?



Thanks everyone for the help. I like to method of simply moving the head and then moving the last tail piece to position1, I'll implement that. I also didn't realise I was cloning the same sprite, I thought I was creating new ones so I obviously need to brush up on how to do that.

Your comments are much appreciated.

On Monday, June 24, 2019 at 4:19:30 PM UTC+1, Adam Coombes wrote:
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()