import pygame, sys
import random

pygame.init()

class GameState:
	def __init__(self):

		self.resolution = (500,500)
		self.screen = pygame.display.set_mode(self.resolution)
		pygame.display.set_caption('Snake but from memory')

		self.x = 200
		self.y = 200

		self.fx = 0
		self.fy = 0

		self.lastkey = [(50,0)]
		self.followers = 0
		self.pastkeys = []

		self.body = []

		self.reset()
		self.generate_fruit()

	def reset(self):
		self.x = 200
		self.y = 200
		self.followers = 0
		self.lastkey = [(50,0)]
		self.pastkeys = []
		self.body = []

	def generate_fruit(self):
		self.fx = random.randint(0,9) * 50
		self.fy = random.randint(0,9) * 50
		if self.fx == self.x and self.fy == self.y:
			print('Cant spawn there, snake head is occupying the space!')
			self.generate_fruit()
		else:
			for rect in self.body:
				if rect.x == self.fx and rect.y == self.fy:
					print('Cant spawn there, snake body is occupying the space!')
					self.generate_fruit()
					break
			self.fx = self.fx + 2
			self.fy = self.fy + 2

def main():
	gamestate = GameState()
	player = pygame.draw.rect(gamestate.screen,(255,255,255),(1000,1000,50,50))
	fruit = pygame.draw.rect(gamestate.screen,(255,0,0),(1000,1000,25,25))
	while True:
		for event in pygame.event.get():
			if event.type == pygame.QUIT: sys.exit()

			if event.type==pygame.KEYDOWN:
				if event.key==pygame.K_RIGHT:
					gamestate.lastkey.append((50,0))
				elif event.key==pygame.K_LEFT:
					gamestate.lastkey.append((-50,0))
				elif event.key==pygame.K_UP:
					gamestate.lastkey.append((0,-50))
				elif event.key==pygame.K_DOWN:
					gamestate.lastkey.append((0,50))
				elif event.key==pygame.K_r:
					gamestate.generate_fruit()
				#print(lastkey)
		gamestate.x = gamestate.x + gamestate.lastkey[0][0]
		gamestate.y = gamestate.y + gamestate.lastkey[0][1]
		#print(pastkeys)

		if len(gamestate.lastkey) > 1:
			gamestate.lastkey.remove(gamestate.lastkey[0])

		if gamestate.x >= gamestate.resolution[0]:
			gamestate.x = 0
		elif gamestate.x < 0:
			gamestate.x = gamestate.resolution[0] - 50

		if gamestate.y >= gamestate.resolution[1]:
			gamestate.y = 0
		elif gamestate.y < 0:
			gamestate.y = gamestate.resolution[1] - 50

		gamestate.pastkeys.insert(0,(gamestate.x, gamestate.y))


		fruit = pygame.draw.rect(gamestate.screen,(255,0,0),(gamestate.fx,gamestate.fy,25,25))

		player = pygame.draw.rect(gamestate.screen,(100,255,100),(gamestate.x,gamestate.y,30,30))

		for _ in range(gamestate.followers):
			#print(_)
			if _ == 0:
				continue
			gamestate.body.append(pygame.draw.rect(gamestate.screen,(150,255,150),(gamestate.pastkeys[_][0],gamestate.pastkeys[_][1],30,30)))
			while len(gamestate.body) > gamestate.followers - 1:
				gamestate.body.remove(gamestate.body[0])
			#print(body)


		if pygame.Rect.colliderect(player,fruit):
			gamestate.generate_fruit()
			if gamestate.followers == 0:
				gamestate.followers = gamestate.followers + 2
			else:
				gamestate.followers = gamestate.followers + 1

		if pygame.Rect.collidelist(player,gamestate.body) > -1:
			pygame.time.wait(4000)
			gamestate.reset()

		pygame.display.update()
		#print(x, ' ', y)
		gamestate.screen.fill((0,0,0))
		pygame.time.delay(250)

if __name__ == "__main__":
  main()