def game_loop():
while True:
game_over = False
game_close = False
x = WIDTH / 2
y = HEIGHT / 2
x_change = 0
y_change = 0
snake_blocks = []
snake_length = 1
food_x = round(random.randrange(0, WIDTH - BLOCK_SIZE) / 20.0) * 20.0
food_y = round(random.randrange(0, HEIGHT - BLOCK_SIZE) / 20.0) * 20.0
while not game_over:
while game_close:
screen.fill(BLACK)
message("You Lost! Press Q-Quit or C-Play Again", RED)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
pygame.quit()
sys.exit()
if event.key == pygame.K_c:
game_over = True # Exit inner loop to restart
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
x_change = -BLOCK_SIZE
y_change = 0
elif event.key == pygame.K_RIGHT:
x_change = BLOCK_SIZE
y_change = 0
elif event.key == pygame.K_UP:
y_change = -BLOCK_SIZE
x_change = 0
elif event.key == pygame.K_DOWN:
y_change = BLOCK_SIZE
x_change = 0
x += x_change
y += y_change
if x >= WIDTH or x < 0 or y >= HEIGHT or y < 0:
game_close = True
screen.fill(BLACK)
pygame.draw.rect(screen, RED, [food_x, food_y, BLOCK_SIZE, BLOCK_SIZE])
snake_head = [x, y]
snake_blocks.append(snake_head)
if len(snake_blocks) > snake_length:
del snake_blocks[0]
for block in snake_blocks[:-1]:
if block == snake_head:
game_close = True
draw_snake(snake_blocks)
pygame.display.update()
if x == food_x and y == food_y:
food_x = round(random.randrange(0, WIDTH - BLOCK_SIZE) / 20.0) * 20.0
food_y = round(random.randrange(0, HEIGHT - BLOCK_SIZE) / 20.0) * 20.0
snake_length += 1
clock.tick(15)
ZGVmIGdhbWVfbG9vcCgpOgogICAgd2hpbGUgVHJ1ZToKICAgICAgICBnYW1lX292ZXIgPSBGYWxzZQogICAgICAgIGdhbWVfY2xvc2UgPSBGYWxzZQoKICAgICAgICB4ID0gV0lEVEggLyAyCiAgICAgICAgeSA9IEhFSUdIVCAvIDIKCiAgICAgICAgeF9jaGFuZ2UgPSAwCiAgICAgICAgeV9jaGFuZ2UgPSAwCgogICAgICAgIHNuYWtlX2Jsb2NrcyA9IFtdCiAgICAgICAgc25ha2VfbGVuZ3RoID0gMQoKICAgICAgICBmb29kX3ggPSByb3VuZChyYW5kb20ucmFuZHJhbmdlKDAsIFdJRFRIIC0gQkxPQ0tfU0laRSkgLyAyMC4wKSAqIDIwLjAKICAgICAgICBmb29kX3kgPSByb3VuZChyYW5kb20ucmFuZHJhbmdlKDAsIEhFSUdIVCAtIEJMT0NLX1NJWkUpIC8gMjAuMCkgKiAyMC4wCgogICAgICAgIHdoaWxlIG5vdCBnYW1lX292ZXI6CgogICAgICAgICAgICB3aGlsZSBnYW1lX2Nsb3NlOgogICAgICAgICAgICAgICAgc2NyZWVuLmZpbGwoQkxBQ0spCiAgICAgICAgICAgICAgICBtZXNzYWdlKCJZb3UgTG9zdCEgUHJlc3MgUS1RdWl0IG9yIEMtUGxheSBBZ2FpbiIsIFJFRCkKICAgICAgICAgICAgICAgIHB5Z2FtZS5kaXNwbGF5LnVwZGF0ZSgpCgogICAgICAgICAgICAgICAgZm9yIGV2ZW50IGluIHB5Z2FtZS5ldmVudC5nZXQoKToKICAgICAgICAgICAgICAgICAgICBpZiBldmVudC50eXBlID09IHB5Z2FtZS5LRVlET1dOOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBldmVudC5rZXkgPT0gcHlnYW1lLktfcToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5Z2FtZS5xdWl0KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5leGl0KCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXZlbnQua2V5ID09IHB5Z2FtZS5LX2M6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYW1lX292ZXIgPSBUcnVlICAjIEV4aXQgaW5uZXIgbG9vcCB0byByZXN0YXJ0CgogICAgICAgICAgICBmb3IgZXZlbnQgaW4gcHlnYW1lLmV2ZW50LmdldCgpOgogICAgICAgICAgICAgICAgaWYgZXZlbnQudHlwZSA9PSBweWdhbWUuUVVJVDoKICAgICAgICAgICAgICAgICAgICBweWdhbWUucXVpdCgpCiAgICAgICAgICAgICAgICAgICAgc3lzLmV4aXQoKQogICAgICAgICAgICAgICAgaWYgZXZlbnQudHlwZSA9PSBweWdhbWUuS0VZRE9XTjoKICAgICAgICAgICAgICAgICAgICBpZiBldmVudC5rZXkgPT0gcHlnYW1lLktfTEVGVDoKICAgICAgICAgICAgICAgICAgICAgICAgeF9jaGFuZ2UgPSAtQkxPQ0tfU0laRQogICAgICAgICAgICAgICAgICAgICAgICB5X2NoYW5nZSA9IDAKICAgICAgICAgICAgICAgICAgICBlbGlmIGV2ZW50LmtleSA9PSBweWdhbWUuS19SSUdIVDoKICAgICAgICAgICAgICAgICAgICAgICAgeF9jaGFuZ2UgPSBCTE9DS19TSVpFCiAgICAgICAgICAgICAgICAgICAgICAgIHlfY2hhbmdlID0gMAogICAgICAgICAgICAgICAgICAgIGVsaWYgZXZlbnQua2V5ID09IHB5Z2FtZS5LX1VQOgogICAgICAgICAgICAgICAgICAgICAgICB5X2NoYW5nZSA9IC1CTE9DS19TSVpFCiAgICAgICAgICAgICAgICAgICAgICAgIHhfY2hhbmdlID0gMAogICAgICAgICAgICAgICAgICAgIGVsaWYgZXZlbnQua2V5ID09IHB5Z2FtZS5LX0RPV046CiAgICAgICAgICAgICAgICAgICAgICAgIHlfY2hhbmdlID0gQkxPQ0tfU0laRQogICAgICAgICAgICAgICAgICAgICAgICB4X2NoYW5nZSA9IDAKCiAgICAgICAgICAgIHggKz0geF9jaGFuZ2UKICAgICAgICAgICAgeSArPSB5X2NoYW5nZQoKICAgICAgICAgICAgaWYgeCA+PSBXSURUSCBvciB4IDwgMCBvciB5ID49IEhFSUdIVCBvciB5IDwgMDoKICAgICAgICAgICAgICAgIGdhbWVfY2xvc2UgPSBUcnVlCgogICAgICAgICAgICBzY3JlZW4uZmlsbChCTEFDSykKICAgICAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIFJFRCwgW2Zvb2RfeCwgZm9vZF95LCBCTE9DS19TSVpFLCBCTE9DS19TSVpFXSkKCiAgICAgICAgICAgIHNuYWtlX2hlYWQgPSBbeCwgeV0KICAgICAgICAgICAgc25ha2VfYmxvY2tzLmFwcGVuZChzbmFrZV9oZWFkKQoKICAgICAgICAgICAgaWYgbGVuKHNuYWtlX2Jsb2NrcykgPiBzbmFrZV9sZW5ndGg6CiAgICAgICAgICAgICAgICBkZWwgc25ha2VfYmxvY2tzWzBdCgogICAgICAgICAgICBmb3IgYmxvY2sgaW4gc25ha2VfYmxvY2tzWzotMV06CiAgICAgICAgICAgICAgICBpZiBibG9jayA9PSBzbmFrZV9oZWFkOgogICAgICAgICAgICAgICAgICAgIGdhbWVfY2xvc2UgPSBUcnVlCgogICAgICAgICAgICBkcmF3X3NuYWtlKHNuYWtlX2Jsb2NrcykKCiAgICAgICAgICAgIHB5Z2FtZS5kaXNwbGF5LnVwZGF0ZSgpCgogICAgICAgICAgICBpZiB4ID09IGZvb2RfeCBhbmQgeSA9PSBmb29kX3k6CiAgICAgICAgICAgICAgICBmb29kX3ggPSByb3VuZChyYW5kb20ucmFuZHJhbmdlKDAsIFdJRFRIIC0gQkxPQ0tfU0laRSkgLyAyMC4wKSAqIDIwLjAKICAgICAgICAgICAgICAgIGZvb2RfeSA9IHJvdW5kKHJhbmRvbS5yYW5kcmFuZ2UoMCwgSEVJR0hUIC0gQkxPQ0tfU0laRSkgLyAyMC4wKSAqIDIwLjAKICAgICAgICAgICAgICAgIHNuYWtlX2xlbmd0aCArPSAxCgogICAgICAgICAgICBjbG9jay50aWNrKDE1KQo=