--- /dev/null
+import random,time,os,sys\r
+import pygame as pg\r
+from pygame import Surface\r
+from pygame.locals import *\r
+\r
+class Resources():\r
+ def __init__(self):\r
+ self.imageLibrary = {}\r
+ self.fontLibrary = {}\r
+ self.turnSwitch = {\r
+ (0,90):90,\r
+ (0,270):180,\r
+ (90,180):180,\r
+ (90,0):270,\r
+ (180,90):0,\r
+ (180,270):270,\r
+ (270,0):0,\r
+ (270,180):90\r
+ }\r
+ \r
+ def image(self,path):\r
+ image = self.imageLibrary.get(path)\r
+ if image == None:\r
+ canonicalizedPath = path.replace("/", os.sep).replace("\\", os.sep)\r
+ image = pg.image.load(canonicalizedPath)\r
+ self.imageLibrary[path] = image\r
+ return image\r
+\r
+ def font(self,path,size):\r
+ font = self.fontLibrary.get(path)\r
+ if font == None:\r
+ font = pg.font.Font(path,size)\r
+ self.fontLibrary[path] = font\r
+ return font\r
+\r
+\r
+class Snake():\r
+ def __init__(self,square = 25):\r
+ self.square = square\r
+ self.dx = 0\r
+ self.dy = 1\r
+ self.headx = 0\r
+ self.heady = 0\r
+ self.applex = 0\r
+ self.appley = 0\r
+ self.direction = 180\r
+ self.dead = False\r
+\r
+ self.screen = pg.display.get_surface()\r
+ self.screenRect = self.screen.get_rect()\r
+ self.screenW = self.screen.get_width()\r
+ self.screenH = self.screen.get_height()\r
+ \r
+ self.get = Resources()\r
+ self.headImg = pg.transform.smoothscale(self.get.image("Images/SnakeHead.png"),(self.square,self.square))\r
+ self.bodyImg = pg.transform.smoothscale(self.get.image("Images/SnakeBody.png"),(self.square,self.square))\r
+ self.turnImg = pg.transform.smoothscale(self.get.image("Images/SnakeTurn.png"),(self.square,self.square))\r
+ self.tailImg = pg.transform.smoothscale(self.get.image("Images/SnakeTail.png"),(self.square,self.square))\r
+ self.appleImg = pg.transform.smoothscale(self.get.image("Images/Apple.png"),(self.square,self.square))\r
+ self.backImg = pg.transform.smoothscale(self.get.image("Images/BackGround.png"),(self.screenW,self.screenH))\r
+ self.countdownFont = self.get.font("Fonts/Countdown.ttf",200)\r
+\r
+ self.snakeBody = [(-500,-500),(-500,-500)]\r
+ self.snakeLength = len(self.snakeBody)\r
+ self.directionList = [(0,180,self.tailImg),(0,180,self.tailImg)]\r
+ \r
+ self.addApple()\r
+\r
+ def runSnake(self):\r
+ self.headx += self.square*self.dx\r
+ self.heady += self.square*self.dy\r
+ self.snakeBody.insert(0,(self.headx-(self.square*self.dx),self.heady-(self.square*self.dy)))\r
+ if self.directionList[0][1] == self.direction:\r
+ self.directionList.insert(0,(self.direction,self.direction,self.bodyImg))\r
+ else:\r
+ self.directionList.insert(0,(self.get.turnSwitch.get((self.directionList[0][1],self.direction)),self.direction,self.turnImg))\r
+ self.snakeBody.pop()\r
+ self.directionList.pop()\r
+ self.snakeLength = len(self.snakeBody)\r
+ for cordinate in self.snakeBody:\r
+ if cordinate == (self.headx,self.heady):\r
+ self.dead = True\r
+ break\r
+ if self.headx < 0 or self.headx == self.screenW or self.heady < 0 or self.heady == self.screenH:\r
+ self.dead = True\r
+ elif (self.headx,self.heady) == (self.applex,self.appley):\r
+ if self.snakeLength < 2:\r
+ self.snakeBody.append((self.headx-(self.square*self.dx),self.heady-(self.square*self.dy)))\r
+ self.directionList.append((0,self.directionList[self.snakeLength-1][1],self.bodyImg))\r
+ else:\r
+ self.snakeBody.append((self.snakeBody[self.snakeLength-1][0]-(self.snakeBody[self.snakeLength-1][0]-self.snakeBody[self.snakeLength-2][0]),self.snakeBody[self.snakeLength-1][1]-(self.snakeBody[self.snakeLength-1][1]-self.snakeBody[self.snakeLength-2][1])))\r
+ self.directionList.append((0,self.directionList[self.snakeLength-1][1],self.bodyImg))\r
+ self.addApple()\r
+ return self.dead\r
+\r
+ def addApple(self):\r
+ hit = True\r
+ while hit:\r
+ x = random.choice([possibleSpawn for possibleSpawn in range(self.screenW) if possibleSpawn % self.square == 0])\r
+ y = random.choice([possibleSpawn for possibleSpawn in range(self.screenH) if possibleSpawn % self.square == 0])\r
+ for cordinate in self.snakeBody:\r
+ if cordinate == (x,y):\r
+ hit = True\r
+ break\r
+ else:\r
+ hit = False\r
+ self.applex = x\r
+ self.appley = y\r
+ \r
+ def drawField(self):\r
+ self.screen.blit(self.backImg,self.screenRect)\r
+\r
+ def drawSnakeGame(self):\r
+ self.drawField()\r
+ self.screen.blit(self.appleImg,(self.applex,self.appley))\r
+ for body in range(self.snakeLength-1):\r
+ pass\r
+ self.screen.blit(pg.transform.rotate(self.directionList[body][2],self.directionList[body][0]),self.snakeBody[body])\r
+ self.screen.blit(pg.transform.rotate(self.tailImg,self.directionList[len(self.directionList)-1][1]),self.snakeBody[self.snakeLength-1])\r
+ self.screen.blit(pg.transform.rotate(self.headImg,self.direction),(self.headx,self.heady))\r
+ \r
+ def drawCountdown(self,text,alpha=255,color=Color("red")):\r
+ textSurface = self.countdownFont.render(text,True,color)\r
+ alphaImg = pg.Surface(textSurface.get_rect().size,pg.SRCALPHA)\r
+ alphaImg.fill((255,255,255,alpha))\r
+ textSurface.blit(alphaImg,(0,0),special_flags=pg.BLEND_RGBA_MULT)\r
+ textRect = textSurface.get_rect(center = self.screenRect.center)\r
+ self.screen.blit(textSurface,textRect)\r
+\r
+ \r
+class Game():\r
+ def __init__(self):\r
+ pg.init()\r
+ self.screen = pg.display.set_mode((400,400))\r
+ self.snakeFunctions = Snake()\r
+ self.gameSpeed = 8\r
+ self.countdownLength = 3\r
+ self.framesPerCount = 100\r
+ self.clock = pg.time.Clock()\r
+ self.running = True\r
+ \r
+ def gameLoop(self):\r
+ self.countDown()\r
+ while self.running:\r
+ self.userEvents()\r
+ if self.snakeFunctions.runSnake():\r
+ self.running = False\r
+ self.snakeFunctions.drawSnakeGame()\r
+ pg.display.flip()\r
+ self.clock.tick(self.gameSpeed)\r
+ print(self.snakeFunctions.snakeLength+1)\r
+ \r
+ def countDown(self):\r
+ for number in range(self.countdownLength):\r
+ if not self.running:\r
+ break\r
+ number = str(self.countdownLength-number)\r
+ for frame in range(self.framesPerCount):\r
+ self.userEvents()\r
+ if not self.running:\r
+ break\r
+ self.snakeFunctions.drawField()\r
+ self.snakeFunctions.drawCountdown(number,round(255-((255/self.framesPerCount)*frame),0))\r
+ pg.display.flip()\r
+ self.clock.tick(100)\r
+ \r
+ def userEvents(self):\r
+ for event in pg.event.get():\r
+ if event.type == pg.QUIT:\r
+ self.running = False\r
+ break\r
+ elif event.type == pg.KEYDOWN:\r
+ if event.key == pg.K_d and self.snakeFunctions.dy != 0:\r
+ self.snakeFunctions.dx = 1\r
+ self.snakeFunctions.dy = 0\r
+ self.snakeFunctions.direction = 270\r
+ break\r
+ elif event.key == pg.K_a and self.snakeFunctions.dy != 0:\r
+ self.snakeFunctions.dx = -1\r
+ self.snakeFunctions.dy = 0\r
+ self.snakeFunctions.direction = 90\r
+ break\r
+ elif event.key == pg.K_s and self.snakeFunctions.dx != 0:\r
+ self.snakeFunctions.dx = 0\r
+ self.snakeFunctions.dy = 1\r
+ self.snakeFunctions.direction = 180\r
+ break\r
+ elif event.key == pg.K_w and self.snakeFunctions.dx != 0:\r
+ self.snakeFunctions.dx = 0\r
+ self.snakeFunctions.dy = -1\r
+ self.snakeFunctions.direction = 0\r
+ break\r
+ elif event.key == pg.K_SPACE:\r
+ self.gameLoop()\r
+ \r
+x = Game()\r
+x.gameLoop()\r
+pg.quit()\r