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()
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)
When you
- divide something by
10
,
round
it and then
- 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
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()
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)
When you
- divide something by
10
, round
it and then- 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