Правила длины змеи - snakepygame
Я пытаюсь сделать змеиную игру для школьного проекта в pygame, но мне трудно понять, как заставить змею расти. Не ища самый эффективный код, а просто способ сделать это. Кроме того, я не ищу целый переписанный проект или что-то еще, я хочу, чтобы это была моя собственная работа, просто ищу метод, как я могу решить эту проблему. Я знаю, что это будет включать в себя циклический список и, возможно, еще один класс, но это то, что у меня есть до сих пор:
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()
Что я уже пробовал:
Я пробовал добавлять в списки и использовать для циклов, но мне не везет.