I'm trying to make a snake game for a school project in pygame, but I am having difficulty working out how to make the snake grow. Not looking for the most efficient code possible just a way of doing it. Also not looking for a whole rewritten project or anything, I want it to be my own work just looking for a method on how i can maybe solve this problem. I know it will involve looping a list and maybe another class but this is what I have so far:
import pygame, sys
import os, random
pygame.init()
height = 720
width = 1280
screen = pygame.display.set_mode((width,height))
class Snake(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((25,25))
self.image.set_colorkey(black)
snakeimage = pygame.image.load("block.png")
self.image.blit(snakeimage,(0,0))
self.rect = self.image.get_rect()
class Food(pygame.sprite.Sprite):
def __init__(self,x ,y):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface((25,25))
self.image.set_colorkey(black)
foodimage = pygame.image.load("apple.png")
self.image.blit(foodimage, (0,0))
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
black = (0,0,0)
red = (255,0,0)
white = (255,255,255)
green = (0,100,0)
yellow = (255, 255, 0)
lgreen = (0,255,0)
lred = (255,108,108)
lyellow = (255,255,224)
snakesgroup = pygame.sprite.Group()
foodgroup = pygame.sprite.Group()
largefont = pygame.font.SysFont("comicsansms", 110)
pausedlabel = largefont.render("GAME PAUSED", 1, (black))
pygame.display.set_caption("Snake Game")
clock = pygame.time.Clock()
buttonfont2 = pygame.font.SysFont("Britannic Bold", 35)
def gamewindow1 ():
stopped = True
while stopped:
playbut = pygame.Rect(100, 550, 100, 50)
quitbut = pygame.Rect(500,550,100,50)
leadbut = pygame.Rect(900,550,220,50)
mouse = pygame.mouse.get_pos()
screen.fill(black)
myfont=pygame.font.SysFont("Britannic Bold", 80)
buttonfont = pygame.font.SysFont("Britannic Bold", 40)
leadfont = pygame.font.SysFont("Britannic Bold", 30)
nlabel=myfont.render("WELCOME TO SNAKE", 1, (255, 0, 0))
leadlabel = myfont.render("LEADERBOARDS ARE NOT YET AVAILIBLE", 1, (black))
scorefont = pygame.font.SysFont("Brittanic Bold", 30)
pygame.display.flip()
clock.tick(60)
playbutfont = buttonfont.render("Play!", 1,(black))
quitbutfont = buttonfont.render("Quit!", 1 ,(black))
leadbutfont = buttonfont.render("Leaderboards!", 1,(black))
screen.blit(nlabel,(380,110 ))
if 500+100 > mouse[0] > 500 and 550 + 50 > mouse[1] > 550:
pygame.draw.rect(screen, (lred), quitbut)
else:
pygame.draw.rect(screen, [255, 0, 0], quitbut)
if 100+100 > mouse[0] > 100 and 550 + 50 > mouse[1] > 550:
pygame.draw.rect(screen, (lgreen), playbut)
else:
pygame.draw.rect(screen, (green), playbut)
if 900+220 > mouse[0] > 900 and 550 + 50 > mouse[1] > 550:
pygame.draw.rect(screen, (lyellow), leadbut)
else:
pygame.draw.rect(screen, (yellow), leadbut)
screen.blit(playbutfont,(115,560))
screen.blit(quitbutfont, (515, 560))
screen.blit(leadbutfont,(915, 560))
pygame.display.update()
clock.tick(20)
for event in pygame.event.get():
if event.type == pygame.QUIT:
stopped = False
sys.exit
pygame.quit()
if event.type == pygame.MOUSEBUTTONDOWN:
if quitbut.collidepoint(mouse):
pygame.quit()
stopped = False
sys.exit
if leadbut.collidepoint(mouse):
stopped = False
screen.fill(white)
inlead = True
screen.blit(leadlabel, (100,360))
pygame.display.set_caption("Leaderboards")
pygame.display.flip()
while inlead:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
stopped = False
sys.exit
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.display.set_caption("Snake Game")
pygame.mouse.set_visible(True)
inlead = False
stopped = True
if playbut.collidepoint(mouse):
pygame.display.set_caption("Game")
screen.fill(black)
pygame.mouse.set_visible(False)
pygame.display.flip()
stopped = False
ingame = True
score = 0
snake = Snake()
snake.rect.x = random.randint(10,1180)
snake.rect.y = random.randint(10,650)
xcoord = random.randint(10,1180)
ycoord = random.randint(10,650)
food = Food(xcoord,ycoord)
foodgroup.add(food)
snakesgroup.add(snake)
speed = (0,0)
while ingame:
for event in pygame.event.get():
if event.type == pygame.QUIT:
ingame = False
sys.exit
pygame.quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.display.set_caption("Snake Game")
pygame.mouse.set_visible(True)
foodgroup.remove(food)
snakesgroup.remove(snake)
ingame = False
stopped = True
if event.key == pygame.K_p:
paused = True
ingame = False
resumebut = pygame.Rect(100, 550, 100, 50)
quitbut = pygame.Rect(900,550,100,50)
resumebutfont = buttonfont2.render("Resume", 1 , (black))
while paused:
mouse = pygame.mouse.get_pos()
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
if quitbut.collidepoint(mouse):
pygame.quit()
paused = False
sys.exit
if resumebut.collidepoint(mouse):
pygame.mouse.set_visible(False)
paused = False
ingame = True
if event.type == pygame.QUIT:
paused = False
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
foodgroup.remove(food)
snakesgroup.remove(snake)
paused = False
stopped = True
screen.fill(white)
if 900+100 > mouse[0] > 900 and 550 + 50 > mouse[1] > 550:
pygame.draw.rect(screen, (lred), quitbut)
else:
pygame.draw.rect(screen, [255, 0, 0], quitbut)
if 100+100 > mouse[0] >100 and 550 + 50 > mouse[1] >550:
pygame.draw.rect(screen, (green), resumebut)
else:
pygame.draw.rect(screen,(lgreen),resumebut)
pygame.display.set_caption("Paused")
pygame.mouse.set_visible(True)
screen.blit(pausedlabel,(200,100))
screen.blit(resumebutfont, (100,560))
screen.blit(quitbutfont, (915, 560))
pygame.display.update()
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
speed = (-5,0)
if keys[pygame.K_RIGHT]:
speed = (5,0)
if keys[pygame.K_UP]:
speed = (0,-5)
if keys[pygame.K_DOWN]:
speed = (0,5)
if snake.rect.colliderect(food) :
score = score + 1
foodgroup.remove(food)
xcoord = random.randint(2,1278)
ycoord = random.randint(2,718)
food = Food(xcoord, ycoord)
foodgroup.add(food)
if snake.rect.x < 2 or snake.rect.x > 1278:
ingame = False
stopped = True
foodgroup.remove(food)
snakesgroup.remove(snake)
pygame.mouse.set_visible(True)
if snake.rect.y < 2 or snake.rect.y > 718 :
ingame = False
stopped = True
foodgroup.remove(food)
snakesgroup.remove(snake)
pygame.mouse.set_visible(True)
scorelabel = scorefont.render("Score: " + str(score), 1,white)
screen.fill(black)
snake.rect.x += speed[0]
snake.rect.y += speed[1]
foodgroup.draw(screen)
snakesgroup.draw(screen)
screen.blit(scorelabel, (0,0))
clock.tick(60)
pygame.display.flip()
gamewindow1()
What I have tried:
I have tried adding in lists and using for loops but I am having no luck.