[PyGame] Snake controls not working - 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 controls not working (/thread-6867.html) |
Snake controls not working - jakegold98 - Dec-11-2017 I have been following a class on udemy for pygame and were starting with this snake game. I get no errors but there has to be something I am missing in the code because the snake doesn't move with the controls I made, WASD, or the arrow keys. Hopefully someone can help me figure out why! import pygame, sys, random, time pygame.init() # Play surface playSurface = pygame.display.set_mode((720, 460)) pygame.display.set_caption('Snake') # Colors red = pygame.Color(255, 0, 0) #gameover green = pygame.Color(0, 255, 0) #snake black = pygame.Color(0, 0, 0) #score white = pygame.Color(255, 255, 255) #background gold = pygame.Color(255, 215, 0) #food #FPS Controller fpsController = pygame.time.Clock() #Important variables snakePos = [100, 50] snakeBody = [[100, 50], [90, 50], [80, 50]] foodPos = [random.randrange(1,72)*10, random.randrange(1,46)*10] foodSpawn = True direction = 'RIGHT' changeTo = direction #Game Over Function def gameOver(): myFont = pygame.font.SysFont('monaco', 72) GOsurf = myFont.render('You Suck', True, red) GOrect = GOsurf.get_rect() GOrect.midtop = ((360, 15)) playSurface.blit(GOsurf, GOrect) pygame.display.update() time.sleep(5) pygame.QUIT() #pygame exit sys.exit() #console exit #Main Logic while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_RIGHT or event.key == ord('d'): changeto = 'RIGHT' if event.key == pygame.K_LEFT or event.key == ord('a'): changeto = 'LEFT' if event.key == pygame.K_UP or event.key == ord('w'): changeto = 'UP' if event.key == pygame.K_DOWN or event.key == ord('s'): changeto = 'DOWN' if event.key == pygame.K_ESCAPE: pygame.event.post(pygame.event.event(QUIT)) # validation of direction if changeTo == 'RIGHT' and not direction == 'LEFT': direction = 'RIGHT' if changeTo == 'LEFT' and not direction == 'RIGHT': direction == 'LEFT' if changeTo == 'UP' and not direction == 'DOWN': direction == 'UP' if changeTo == 'DOWN' and not direction == 'UP': direction == 'DOWN' if direction == 'RIGHT': snakePos[0] += 10 if direction == 'LEFT': snakePos[0] -= 10 if direction == 'UP': snakePos[1] -= 10 if direction == 'DOWN': snakePos[1] += 10 # Snake body mechanics snakeBody.insert(0, list(snakePos)) if snakePos[0] == foodPos[0] and snakePos[1] == foodPos[1]: foodSpawn = False else: snakeBody.pop() # Food spawn if foodSpawn == False: foodPos = [random.randrange(1,72)*10, random.randrange(1,46)*10] foodSpawn = True playSurface.fill(white) for pos in snakeBody: pygame.draw.rect(playSurface, green, pygame.Rect(pos[0], pos[1], 10, 10)) pygame.display.update() fpsController.tick(25) RE: Snake controls not working - Windspar - Dec-11-2017 You have a few errors line 38 should be pygame.quit() line 49, 51, 53, 55 should be changeTo line 63, 65, 67 should be = not == Just to let you know pygame has builtin colors. all your def colors are builtin. pygame.Color('red')Builtin colors describe here RE: Snake controls not working - metulburr - Dec-11-2017 There is a lot of extra code here that is not needed. First of all Quote:if event.key == pygame.K_RIGHT or event.key == ord('d'):pygame has a keys for every possible keyboard input, including WASD movements. Im not sure why you chose to do ord()? https://www.pygame.org/docs/ref/key.html You can substitute that for pygame.K_w for 'W' and so on. You can also just use the in operator and do if event.key in [pygame.K_RIGHT, pygame.K_d]: Quote:If you input the right arrow key than you wouldnt be inputting the left one. This is just redundant code that doesnt need to be there.if changeTo == 'RIGHT' and not direction == 'LEFT': So is this Quote:if direction == 'RIGHT':You are already checking the event.key for pygame.RIGHT....why do it again? you can remove all that and just do if event.key in [pygame.K_RIGHT, pygame.K_d]: snakePos[0] += 10Please save yourself the headache and dont do this Quote:#Game Over Function def gameOver(): myFont = pygame.font.SysFont('monaco', 72) GOsurf = myFont.render('You Suck', True, red) GOrect = GOsurf.get_rect() GOrect.midtop = ((360, 15)) playSurface.blit(GOsurf, GOrect) pygame.display.update() time.sleep(5) pygame.QUIT() #pygame exit sys.exit() #console exit A rule of thumb is you should only every have to type this once EVER in your game pygame.display.update()If you do it more then you are creating spaghetti code. The proper way would be to use a state machine. Which would be a game over state to handle what happens if a player died etc. A proper structure would be in the tutorials in how to organize the code. You also shouldnt be doing this anyways Quote:why bother when pygame has pygame.Rect whihc handles position and collision which you will need anyways. Its also more simple to read player.rect.x rather than snakePos[0]snakePos = [100, 50] RE: Snake controls not working - jakegold98 - Dec-11-2017 Thank you so much for all your help! But also as I stated I am just following what the course I am doing says. I do not know a lot of things so learning anything is vital to me for now. Regardless of how useless it is, I do agree though I realized in the tutorials and guides that some of the code didn't really make sense to me and that confused me so I guess it makes sense now. I have been struggling to find a solid book, or course or something in really learning pygame most of the time the tutorials are very general or just don't explain enough into what you are actually writing. RE: Snake controls not working - metulburr - Dec-11-2017 Well at least you are aware of it is all you need. Some people are not. Pygame doesnt really have a good book. When i say good book i mean one that uses OOP. There are some books/tutorials http://programarcadegames.com/ https://inventwithpython.com/pygame/ but there is no real in depth book that covers everything. A lot of what i learned was more from forums asking question as i came up to the problem i had. RE: Snake controls not working - Windspar - Dec-12-2017 You are learning a very ugly way. What do you want to know ? I an others will help you. Here are some example of boiler plates. # simple pygame boiler plate import pygame def main(): pygame.init() pygame.display.set_caption("Simple Pygame Boiler Plate") screen = pygame.display.set_mode((720, 460)) clock = pygame.time.Clock() running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False screen.fill((0,0,40)) # draw code here pygame.display.flip() clock.tick(30) pygame.quit() if __name__ == '__main__': main() # class base boiler plate import pygame class Game: SIZE = None def __init__(self, caption, size, ): Game.SIZE = size pygame.display.set_caption(caption) self.screen = pygame.display.set_mode(size) self.clock = pygame.time.Clock() def loop(self): self.running = True while self.running: for event in pygame.event.get(): if event.type == pygame.QUIT: self.running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: self.running = False self.screen.fill((0,0,40)) # draw code here pygame.display.flip() self.clock.tick(30) pygame.quit() def main(): pygame.init() game = Game('Class Boiler Plate', (720, 460)) game.loop() if __name__ == '__main__': main()This is my intense boiler plate. My Boiler Plate Github |