[PyGame] Snake not changing directions in Snake Game - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: Game Development (https://python-forum.io/forum-11.html) +--- Thread: [PyGame] Snake not changing directions in Snake Game (/thread-12131.html) |
Snake not changing directions in Snake Game - Bjdamaster - Aug-10-2018 I tried making a version of the snake game in python using pygame. I am not receiving any errors, however when i press an arrow key, the snake does not change directions. Here is my code: import pygame import sys import random import time pygame.init() class Snake(): def __init__(self): self.position = [100,50] self.body = [[100,50],[90,50],[80,50]] self.direction = "RIGHT" def changeDirTo(self,dir): if dir=="RIGHT" and not self.direction=="LEFT": self.direction = "RIGHT" elif dir=="LEFT" and not self.direction=="RIGHT": self.direction = "LEFT" elif dir=="UP" and not self.direction=="DOWN": self.direction = "UP" elif dir=="DOWN" and not self.direction=="UP": self.direction = "DOWN" def move(self,foodPos): if self.direction == "RIGHT": self.position[0] = self.position[0] + 10 elif self.direction == "LEFT": self.position[0] = self.position[0] - 10 elif self.direction == "UP": self.position[1] = self.position[1] - 10 elif self.direction == "DOWN": self.position[1] = self.position[1] + 10 self.body.insert(0,list(self.position)) if self.position == foodPos: return 1 else: self.body.pop() return 0 def move_Right(self): self.position[0] = self.position[0] + 10 def move_Left(self): self.position[0] = self.position[0] - 10 def move_Up(self): self.position[0] = self.position[1] - 10 def move_Down(self): self.position[0] = self.position[1] + 10 def checkCollision(self): if self.position[0] > 490 or self.position[0] < 0: return 1 elif self.position[1] > 490 or self.position[1] < 0: return 1 for bodyPart in self.body[1:]: if self.position == bodyPart: return 1 return 0 def getHeadPosition(self): return self.position def getBody(self): return self.body class FoodSpawn(): def __init__(self): self.position = [random.randint(1,50)*10,random.randint(1,50)*10] self.isFoodOnScreen = True def spawnFood(self): if self.isFoodOnScreen == False: self.position = [random.randrange(1,50)*10,random.randrange(1,50)*10] self.isFoodOnScreen == True return self.position def setFoodOnScreen(self,b): self.isFoodOnScreen = b window = pygame.display.set_mode((500,500)) pygame.display.set_caption("Snake Game") fps = pygame.time.Clock() score = 0 snake = Snake() foodSpawner = FoodSpawn() def gameOver(): pygame.quit() sys.exit() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: gameOver() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_RIGHT: snake.changeDirTo('RIGHT') elif event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: snake.changeDirTo('UP') elif event.type == pygame.KEYDOWN: if event.key == pygame.K_DOWN: snake.changeDirTo('DOWN') elif event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: snake.changeDirTo('LEFT') foodPos = foodSpawner.spawnFood() if(snake.move(foodPos)==1): score+=1 foodSpawner.setFoodOnScreen(False) window.fill(pygame.Color(225,225,225)) for pos in snake.getBody(): pygame.draw.rect(window,pygame.Color(0,225,0),pygame.Rect(pos[0],pos[1],10,10)) pygame.draw.rect(window,pygame.Color(225,0,0),pygame.Rect(foodPos[0],foodPos[1],10,10)) if(snake.checkCollision()==1): gameOver() pygame.display.set_caption("Snake | Score: " + str(score)) pygame.display.flip() fps.tick(10) pygame.quit()I've read over similar threads and I can't seem to find a solution. All help is appreciated. RE: Snake not changing directions in Snake Game - Windspar - Aug-10-2018 first keydown well catch all keydown. elif event.type == pygame.KEYDOWN: if event.key == pygame.K_RIGHT: snake.changeDirTo('RIGHT') elif event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: snake.changeDirTo('UP') elif event.type == pygame.KEYDOWN: if event.key == pygame.K_DOWN: snake.changeDirTo('DOWN') elif event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: snake.changeDirTo('LEFT')should be elif event.type == pygame.KEYDOWN: if event.key == pygame.K_RIGHT: snake.changeDirTo('RIGHT') elif event.key == pygame.K_UP: snake.changeDirTo('UP') elif event.key == pygame.K_DOWN: snake.changeDirTo('DOWN') elif event.key == pygame.K_LEFT: snake.changeDirTo('LEFT') RE: Snake not changing directions in Snake Game - Bjdamaster - Aug-11-2018 (Aug-10-2018, 05:55 PM)Windspar Wrote: first keydown well catch all keydown.Good catch. That fixed the problem I was having, however now when the snake eats the food, the food keeps changing locations rapidly.elif event.type == pygame.KEYDOWN: if event.key == pygame.K_RIGHT: snake.changeDirTo('RIGHT') elif event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: snake.changeDirTo('UP') elif event.type == pygame.KEYDOWN: if event.key == pygame.K_DOWN: snake.changeDirTo('DOWN') elif event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: snake.changeDirTo('LEFT')should beelif event.type == pygame.KEYDOWN: if event.key == pygame.K_RIGHT: snake.changeDirTo('RIGHT') elif event.key == pygame.K_UP: snake.changeDirTo('UP') elif event.key == pygame.K_DOWN: snake.changeDirTo('DOWN') elif event.key == pygame.K_LEFT: snake.changeDirTo('LEFT') RE: Snake not changing directions in Snake Game - Windspar - Aug-11-2018 You didn't assign isFoodOnScreen to True. You did comparison. def spawnFood(self): if self.isFoodOnScreen == False: self.position = [random.randrange(1,50)*10,random.randrange(1,50)*10] self.isFoodOnScreen == True # You did comparison RE: Snake not changing directions in Snake Game - Bjdamaster - Aug-13-2018 (Aug-11-2018, 08:20 PM)Windspar Wrote: You didn't assign isFoodOnScreen to True. You did comparison.Yes I also caught that a few minutes after I made the post. Hopefully somebody here can learn from my mistake.def spawnFood(self): if self.isFoodOnScreen == False: self.position = [random.randrange(1,50)*10,random.randrange(1,50)*10] self.isFoodOnScreen == True # You did comparison |