help with 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: help with snake game (/thread-28587.html) |
help with snake game - blacklight - Jul-24-2020 question: I have a check if the snake.left(x coordinate) == fruit.left, the rand function should be called and the fruit spawns at a different location. It works for the first time their x coordinates are the same, but afterwords it doesn't work anymore. Can anyone help me with this problem? import pygame import time import random # global variables game = True width, height = 500, 500 x, y = 20, 20 x2, y2 = 240, 250 # setting up screen WIN = pygame.display.set_mode((500,500)) pygame.display.set_caption("Snake by Sam") # load the background BG = pygame.image.load("snake.png") BG_resize = pygame.transform.scale(BG, (width, height)) WIN.blit(BG_resize,(0,0)) # draw square on screen snake = pygame.draw.rect(WIN, (255,0,0), (x,y,20,20)) key = None # draw fruit(circle), setup fruit = pygame.draw.rect(WIN, (255,0,0), (x2,y2,20,20)) def rand(): global x2, y2 x2 = random.randint(0, 490) y2 = random.randint(0, 490) def move(): global key global snake global x global y global fruit if key == "d": x = snake.left time.sleep(0.03) x = x + 10 WIN.blit(BG_resize,(0,0)) snake = pygame.draw.rect(WIN, (255,0,0), (x,y,20,20)) fruit = pygame.draw.rect(WIN, (255,0,0), (x2,y2,20,20)) if key == "s": y = snake.top time.sleep(0.03) y = y + 10 WIN.blit(BG_resize,(0,0)) snake = pygame.draw.rect(WIN, (255,0,0), (x,y,20,20)) fruit = pygame.draw.rect(WIN, (255,0,0), (x2,y2,20,20)) if key == "w": y = snake.top time.sleep(0.03) y = y - 10 WIN.blit(BG_resize,(0,0)) snake = pygame.draw.rect(WIN, (255,0,0), (x,y,20,20)) fruit = pygame.draw.rect(WIN, (255,0,0), (x2,y2,20,20)) if key == "a": x = snake.left time.sleep(0.03) x = x - 10 WIN.blit(BG_resize,(0,0)) snake = pygame.draw.rect(WIN, (255,0,0), (x,y,20,20)) fruit = pygame.draw.rect(WIN, (255,0,0), (x2,y2,20,20)) # mainloop while game: for event in pygame.event.get(): if event.type == pygame.QUIT: game = False if event.type == pygame.KEYDOWN: if event.key == pygame.K_d: WIN.blit(BG_resize,(0,0)) key = "d" if event.key == pygame.K_w: WIN.blit(BG_resize,(0,0)) key = "w" if event.key == pygame.K_s: WIN.blit(BG_resize,(0,0)) key = "s" if event.key == pygame.K_a: WIN.blit(BG_resize,(0,0)) key = "a" move() # border control if snake.left > 490: snake = pygame.draw.rect(WIN, (255,0,0), (250,250,20,20)) x,y = 250, 250 key = None if snake.left == 0: WIN.blit(BG_resize,(0,0)) snake = pygame.draw.rect(WIN, (255,0,0), (250,250,20,20)) x,y = 250, 250 key = None if snake.top > 490: snake = pygame.draw.rect(WIN, (255,0,0), (250,250,20,20)) x,y = 250, 250 key = None if snake.top == 0: WIN.blit(BG_resize,(0,0)) snake = pygame.draw.rect(WIN, (255,0,0), (250,250,20,20)) x,y = 250, 250 key = None # check if the snake has made contact with the fruit. if snake.left == fruit.left: WIN.blit(BG_resize,(0,0)) rand() fruit = pygame.draw.rect(WIN, (255,0,0), (x2,y2,20,20)) pygame.display.update() RE: help with snake game - nilamo - Jul-25-2020 When in doubt, print it out! I added this to your loop: print(f"{snake.left} == {fruit.left}: {snake.left == fruit.left}") , and saw the issue almost immediately.Your rand() function sets x2 to a random int. In my case, 159. But the snake moves in multiples of 10. So it'll never be at 159. 150 or 160, sure, but never 159.
RE: help with snake game - blacklight - Jul-26-2020 Hi, thanks for your help. After reading your explanation it was clear as day. Didn't realize that because I set the change of the snake to 10 it could never be like 249 or something like that. I also put your print function in my loop and I think it only prints out the x coordinate if x coordinates of both objects are the same. I don't however understand, how you put a conditional in the print statement like that. Could you please explain that to me. It would be much appreciated. RE: help with snake game - nilamo - Jul-30-2020 That's an "f" string, which means anything inside the curly braces is just python code. You can do whatever you want inside the braces, and whatever it returns (in that case, True/False) will be added to the string. It's not a great idea to do complicated stuff in there, but I didn't really want to write more than one line. |