Following a Python Snake Game tutorial – I don't understand this part

Question:

I’m following a snake game tutorial I found on google, I don’t understand this part of the code:

foodx = round(random.randrange(0, dis_width – snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, dis_height – snake_block) / 10.0) * 10.0

1-Why does dividing the display’s width/height by 10 (the size of each square of the snake is comprised of, which is stored in the variable snake_block) then multiplying everything by 10 work?

2- why subtract the width/height of the display by the snake block? Just so to be sure: the width in this case is 600, 10 is subtracted, so it’ll generate a random float from 0-589, then that number is divided by 10, then rounded up and then multiplied by 10, right?

context: foodx and foody are the x,y coordinates of the square(food) the snake eats to grow.

below is the full code:

import pygame
import time
import random
 
pygame.init()
 
white = (255, 255, 255)
yellow = (255, 255, 102)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)
 
dis_width = 600
dis_height = 400
 
dis = pygame.display.set_mode((dis_width, dis_height))
pygame.display.set_caption('Snake Game by Edureka')
 
clock = pygame.time.Clock()
 
snake_block = 10
snake_speed = 15
 
font_style = pygame.font.SysFont("bahnschrift", 25)
score_font = pygame.font.SysFont("comicsansms", 35)
 
 
def Your_score(score):
    value = score_font.render("Your Score: " + str(score), True, yellow)
    dis.blit(value, [0, 0])
 
 
 
def our_snake(snake_block, snake_list):
    for x in snake_list:
        pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])
 
 
def message(msg, color):
    mesg = font_style.render(msg, True, color)
    dis.blit(mesg, [dis_width / 6, dis_height / 3])
 
 
def gameLoop():
    game_over = False
    game_close = False
 
    x1 = dis_width / 2
    y1 = dis_height / 2
 
    x1_change = 0
    y1_change = 0
 
    snake_List = []
    Length_of_snake = 1
 
    foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
    foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
 
    while not game_over:
 
        while game_close == True:
            dis.fill(blue)
            message("You Lost! Press C-Play Again or Q-Quit", red)
            Your_score(Length_of_snake - 1)
            pygame.display.update()
 
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        game_over = True
                        game_close = False
                    if event.key == pygame.K_c:
                        gameLoop()
 
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    x1_change = -snake_block
                    y1_change = 0
                elif event.key == pygame.K_RIGHT:
                    x1_change = snake_block
                    y1_change = 0
                elif event.key == pygame.K_UP:
                    y1_change = -snake_block
                    x1_change = 0
                elif event.key == pygame.K_DOWN:
                    y1_change = snake_block
                    x1_change = 0
 
        if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
            game_close = True
        x1 += x1_change
        y1 += y1_change
        dis.fill(blue)
        pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block])
        snake_Head = []
        snake_Head.append(x1)
        snake_Head.append(y1)
        snake_List.append(snake_Head)
        if len(snake_List) > Length_of_snake:
            del snake_List[0]
 
        for x in snake_List[:-1]:
            if x == snake_Head:
                game_close = True
 
        our_snake(snake_block, snake_List)
        Your_score(Length_of_snake - 1)
 
        pygame.display.update()
 
        if x1 == foodx and y1 == foody:
            foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
            foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
            Length_of_snake += 1
 
        clock.tick(snake_speed)
 
    pygame.quit()
    quit()
 
 
gameLoop()
Asked By: farhm

||

Answers:

The goal is to find a random position for the food that is divisible by 10, because 10 is the size of a tile of the playground. The food should be perfectly aligned with the tiles. To do this, the random position is divided by 10, then rounded to an integral number and finally multiplied by 10 again e.g:

pos = 94
pos = pos / 10    # 9.4
pos = round(pos)  # 9.0
pos = pos * 10    # 90

Anyway, the code can be simplified using the step argument of random.randrange:

foodx = random.randrange(0, dis_width - snake_block, 10)
foody = random.randrange(0, dis_height - snake_block, 10)
Answered By: Rabbid76

When you

  1. divide something by 10,
  2. round it and then
  3. multiply it back by 10,

it is somewhat equivalent to rounding with ten’s precision. Consider this example:

num = 123.4567
num /= 10         # -> 12.34567
num = round(num)  # -> 12
num *= 10         # -> 120
Answered By: Captain Trojan
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.