aW1wb3J0IHB5Z2FtZQppbXBvcnQgdGltZQppbXBvcnQgcmFuZG9tCgojIOWIneWni+WMlgpweWdhbWUuaW5pdCgpCgojIOmhj+iJsuWumue+qQp3aGl0ZSA9ICgyNTUsIDI1NSwgMjU1KQpibGFjayA9ICgwLCAwLCAwKQpyZWQgPSAoMjEzLCA1MCwgODApCmdyZWVuID0gKDAsIDI1NSwgMCkKYmx1ZSA9ICg1MCwgMTUzLCAyMTMpCgojIOimlueql+Wkp+Wwjwp3aWR0aCwgaGVpZ2h0ID0gNjAwLCA0MDAKc2NyZWVuID0gcHlnYW1lLmRpc3BsYXkuc2V0X21vZGUoKHdpZHRoLCBoZWlnaHQpKQpweWdhbWUuZGlzcGxheS5zZXRfY2FwdGlvbign6LKq5ZCD6JuHJykKCiMg5pmC6ZaT6Kit5a6aCmNsb2NrID0gcHlnYW1lLnRpbWUuQ2xvY2soKQpzbmFrZV9ibG9jayA9IDEwCnNuYWtlX3NwZWVkID0gMTUKCmZvbnRfc3R5bGUgPSBweWdhbWUuZm9udC5TeXNGb250KCZxdW90O2JhaG5zY2hyaWZ0JnF1b3Q7LCAyNSkKCmRlZiBkcmF3X3NuYWtlKHNuYWtlX2Jsb2NrLCBzbmFrZV9saXN0KToKICAgIGZvciB4IGluIHNuYWtlX2xpc3Q6CiAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGJsYWNrLCBbeFswXSwgeFsxXSwgc25ha2VfYmxvY2ssIHNuYWtlX2Jsb2NrXSkKCmRlZiBtZXNzYWdlKG1zZywgY29sb3IpOgogICAgbWVzZyA9IGZvbnRfc3R5bGUucmVuZGVyKG1zZywgVHJ1ZSwgY29sb3IpCiAgICBzY3JlZW4uYmxpdChtZXNnLCBbd2lkdGggLyA2LCBoZWlnaHQgLyAzXSkKCmRlZiBnYW1lTG9vcCgpOgogICAgZ2FtZV9vdmVyID0gRmFsc2UKICAgIGdhbWVfY2xvc2UgPSBGYWxzZQoKICAgIHgxID0gd2lkdGggLyAyCiAgICB5MSA9IGhlaWdodCAvIDIKCiAgICB4MV9jaGFuZ2UgPSAwCiAgICB5MV9jaGFuZ2UgPSAwCgogICAgc25ha2VfbGlzdCA9IFtdCiAgICBsZW5ndGhfb2Zfc25ha2UgPSAxCgogICAgZm9vZHggPSByb3VuZChyYW5kb20ucmFuZHJhbmdlKDAsIHdpZHRoIC0gc25ha2VfYmxvY2spIC8gMTAuMCkgKiAxMC4wCiAgICBmb29keSA9IHJvdW5kKHJhbmRvbS5yYW5kcmFuZ2UoMCwgaGVpZ2h0IC0gc25ha2VfYmxvY2spIC8gMTAuMCkgKiAxMC4wCgogICAgd2hpbGUgbm90IGdhbWVfb3ZlcjoKCiAgICAgICAgd2hpbGUgZ2FtZV9jbG9zZToKICAgICAgICAgICAgc2NyZWVuLmZpbGwoYmx1ZSkKICAgICAgICAgICAgbWVzc2FnZSgmcXVvdDvpgYrmiLLntZDmnZ/vvIHmjIkgUSDpm6LplovmiJYgQyDph43mlrDplovlp4smcXVvdDssIHJlZCkKICAgICAgICAgICAgcHlnYW1lLmRpc3BsYXkudXBkYXRlKCkKCiAgICAgICAgICAgIGZvciBldmVudCBpbiBweWdhbWUuZXZlbnQuZ2V0KCk6CiAgICAgICAgICAgICAgICBpZiBldmVudC50eXBlID09IHB5Z2FtZS5LRVlET1dOOgogICAgICAgICAgICAgICAgICAgIGlmIGV2ZW50LmtleSA9PSBweWdhbWUuS19xOgogICAgICAgICAgICAgICAgICAgICAgICBnYW1lX292ZXIgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgICAgIGdhbWVfY2xvc2UgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgIGlmIGV2ZW50LmtleSA9PSBweWdhbWUuS19jOgogICAgICAgICAgICAgICAgICAgICAgICBnYW1lTG9vcCgpCgogICAgICAgIGZvciBldmVudCBpbiBweWdhbWUuZXZlbnQuZ2V0KCk6CiAgICAgICAgICAgIGlmIGV2ZW50LnR5cGUgPT0gcHlnYW1lLlFVSVQ6CiAgICAgICAgICAgICAgICBnYW1lX292ZXIgPSBUcnVlCiAgICAgICAgICAgIGlmIGV2ZW50LnR5cGUgPT0gcHlnYW1lLktFWURPV046CiAgICAgICAgICAgICAgICBpZiBldmVudC5rZXkgPT0gcHlnYW1lLktfTEVGVDoKICAgICAgICAgICAgICAgICAgICB4MV9jaGFuZ2UgPSAtc25ha2VfYmxvY2sKICAgICAgICAgICAgICAgICAgICB5MV9jaGFuZ2UgPSAwCiAgICAgICAgICAgICAgICBlbGlmIGV2ZW50LmtleSA9PSBweWdhbWUuS19SSUdIVDoKICAgICAgICAgICAgICAgICAgICB4MV9jaGFuZ2UgPSBzbmFrZV9ibG9jawogICAgICAgICAgICAgICAgICAgIHkxX2NoYW5nZSA9IDAKICAgICAgICAgICAgICAgIGVsaWYgZXZlbnQua2V5ID09IHB5Z2FtZS5LX1VQOgogICAgICAgICAgICAgICAgICAgIHkxX2NoYW5nZSA9IC1zbmFrZV9ibG9jawogICAgICAgICAgICAgICAgICAgIHgxX2NoYW5nZSA9IDAKICAgICAgICAgICAgICAgIGVsaWYgZXZlbnQua2V5ID09IHB5Z2FtZS5LX0RPV046CiAgICAgICAgICAgICAgICAgICAgeTFfY2hhbmdlID0gc25ha2VfYmxvY2sKICAgICAgICAgICAgICAgICAgICB4MV9jaGFuZ2UgPSAwCgogICAgICAgIGlmIHgxICZndDs9IHdpZHRoIG9yIHgxICZsdDsgMCBvciB5MSAmZ3Q7PSBoZWlnaHQgb3IgeTEgJmx0OyAwOgogICAgICAgICAgICBnYW1lX2Nsb3NlID0gVHJ1ZQoKICAgICAgICB4MSArPSB4MV9jaGFuZ2UKICAgICAgICB5MSArPSB5MV9jaGFuZ2UKICAgICAgICBzY3JlZW4uZmlsbChibHVlKQogICAgICAgIHB5Z2FtZS5kcmF3LnJlY3Qoc2NyZWVuLCBncmVlbiwgW2Zvb2R4LCBmb29keSwgc25ha2VfYmxvY2ssIHNuYWtlX2Jsb2NrXSkKICAgICAgICBzbmFrZV9oZWFkID0gW10KICAgICAgICBzbmFrZV9oZWFkLmFwcGVuZCh4MSkKICAgICAgICBzbmFrZV9oZWFkLmFwcGVuZCh5MSkKICAgICAgICBzbmFrZV9saXN0LmFwcGVuZChzbmFrZV9oZWFkKQogICAgICAgIGlmIGxlbihzbmFrZV9saXN0KSAmZ3Q7IGxlbmd0aF9vZl9zbmFrZToKICAgICAgICAgICAgZGVsIHNuYWtlX2xpc3RbMF0KCiAgICAgICAgZm9yIHggaW4gc25ha2VfbGlzdFs6LTFdOgogICAgICAgICAgICBpZiB4ID09IHNuYWtlX2hlYWQ6CiAgICAgICAgICAgICAgICBnYW1lX2Nsb3NlID0gVHJ1ZQoKICAgICAgICBkcmF3X3NuYWtlKHNuYWtlX2Jsb2NrLCBzbmFrZV9saXN0KQogICAgICAgIHB5Z2FtZS5kaXNwbGF5LnVwZGF0ZSgpCgogICAgICAgIGlmIHgxID09IGZvb2R4IGFuZCB5MSA9PSBmb29keToKICAgICAgICAgICAgZm9vZHggPSByb3VuZChyYW5kb20ucmFuZHJhbmdlKDAsIHdpZHRoIC0gc25ha2VfYmxvY2spIC8gMTAuMCkgKiAxMC4wCiAgICAgICAgICAgIGZvb2R5ID0gcm91bmQocmFuZG9tLnJhbmRyYW5nZSgwLCBoZWlnaHQgLSBzbmFrZV9ibG9jaykgLyAxMC4wKSAqIDEwLjAKICAgICAgICAgICAgbGVuZ3RoX29mX3NuYWtlICs9IDEKCiAgICAgICAgY2xvY2sudGljayhzbmFrZV9zcGVlZCkKCiAgICBweWdhbWUucXVpdCgpCiAgICBxdWl0KCkKCmdhbWVMb29wKClpbXBvcnQgcHlnYW1lCmltcG9ydCB0aW1lCmltcG9ydCByYW5kb20KCiMg5Yid5aeL5YyWCnB5Z2FtZS5pbml0KCkKCiMg6aGP6Imy5a6a576pCndoaXRlID0gKDI1NSwgMjU1LCAyNTUpCmJsYWNrID0gKDAsIDAsIDApCnJlZCA9ICgyMTMsIDUwLCA4MCkKZ3JlZW4gPSAoMCwgMjU1LCAwKQpibHVlID0gKDUwLCAxNTMsIDIxMykKCiMg6KaW56qX5aSn5bCPCndpZHRoLCBoZWlnaHQgPSA2MDAsIDQwMApzY3JlZW4gPSBweWdhbWUuZGlzcGxheS5zZXRfbW9kZSgod2lkdGgsIGhlaWdodCkpCnB5Z2FtZS5kaXNwbGF5LnNldF9jYXB0aW9uKCfosqrlkIPom4cnKQoKIyDmmYLplpPoqK3lrpoKY2xvY2sgPSBweWdhbWUudGltZS5DbG9jaygpCnNuYWtlX2Jsb2NrID0gMTAKc25ha2Vfc3BlZWQgPSAxNQoKZm9udF9zdHlsZSA9IHB5Z2FtZS5mb250LlN5c0ZvbnQoJnF1b3Q7YmFobnNjaHJpZnQmcXVvdDssIDI1KQoKZGVmIGRyYXdfc25ha2Uoc25ha2VfYmxvY2ssIHNuYWtlX2xpc3QpOgogICAgZm9yIHggaW4gc25ha2VfbGlzdDoKICAgICAgICBweWdhbWUuZHJhdy5yZWN0KHNjcmVlbiwgYmxhY2ssIFt4WzBdLCB4WzFdLCBzbmFrZV9ibG9jaywgc25ha2VfYmxvY2tdKQoKZGVmIG1lc3NhZ2UobXNnLCBjb2xvcik6CiAgICBtZXNnID0gZm9udF9zdHlsZS5yZW5kZXIobXNnLCBUcnVlLCBjb2xvcikKICAgIHNjcmVlbi5ibGl0KG1lc2csIFt3aWR0aCAvIDYsIGhlaWdodCAvIDNdKQoKZGVmIGdhbWVMb29wKCk6CiAgICBnYW1lX292ZXIgPSBGYWxzZQogICAgZ2FtZV9jbG9zZSA9IEZhbHNlCgogICAgeDEgPSB3aWR0aCAvIDIKICAgIHkxID0gaGVpZ2h0IC8gMgoKICAgIHgxX2NoYW5nZSA9IDAKICAgIHkxX2NoYW5nZSA9IDAKCiAgICBzbmFrZV9saXN0ID0gW10KICAgIGxlbmd0aF9vZl9zbmFrZSA9IDEKCiAgICBmb29keCA9IHJvdW5kKHJhbmRvbS5yYW5kcmFuZ2UoMCwgd2lkdGggLSBzbmFrZV9ibG9jaykgLyAxMC4wKSAqIDEwLjAKICAgIGZvb2R5ID0gcm91bmQocmFuZG9tLnJhbmRyYW5nZSgwLCBoZWlnaHQgLSBzbmFrZV9ibG9jaykgLyAxMC4wKSAqIDEwLjAKCiAgICB3aGlsZSBub3QgZ2FtZV9vdmVyOgoKICAgICAgICB3aGlsZSBnYW1lX2Nsb3NlOgogICAgICAgICAgICBzY3JlZW4uZmlsbChibHVlKQogICAgICAgICAgICBtZXNzYWdlKCZxdW90O+mBiuaIsue1kOadn++8geaMiSBRIOmboumWi+aIliBDIOmHjeaWsOmWi+WniyZxdW90OywgcmVkKQogICAgICAgICAgICBweWdhbWUuZGlzcGxheS51cGRhdGUoKQoKICAgICAgICAgICAgZm9yIGV2ZW50IGluIHB5Z2FtZS5ldmVudC5nZXQoKToKICAgICAgICAgICAgICAgIGlmIGV2ZW50LnR5cGUgPT0gcHlnYW1lLktFWURPV046CiAgICAgICAgICAgICAgICAgICAgaWYgZXZlbnQua2V5ID09IHB5Z2FtZS5LX3E6CiAgICAgICAgICAgICAgICAgICAgICAgIGdhbWVfb3ZlciA9IFRydWUKICAgICAgICAgICAgICAgICAgICAgICAgZ2FtZV9jbG9zZSA9IEZhbHNlCiAgICAgICAgICAgICAgICAgICAgaWYgZXZlbnQua2V5ID09IHB5Z2FtZS5LX2M6CiAgICAgICAgICAgICAgICAgICAgICAgIGdhbWVMb29wKCkKCiAgICAgICAgZm9yIGV2ZW50IGluIHB5Z2FtZS5ldmVudC5nZXQoKToKICAgICAgICAgICAgaWYgZXZlbnQudHlwZSA9PSBweWdhbWUuUVVJVDoKICAgICAgICAgICAgICAgIGdhbWVfb3ZlciA9IFRydWUKICAgICAgICAgICAgaWYgZXZlbnQudHlwZSA9PSBweWdhbWUuS0VZRE9XTjoKICAgICAgICAgICAgICAgIGlmIGV2ZW50LmtleSA9PSBweWdhbWUuS19MRUZUOgogICAgICAgICAgICAgICAgICAgIHgxX2NoYW5nZSA9IC1zbmFrZV9ibG9jawogICAgICAgICAgICAgICAgICAgIHkxX2NoYW5nZSA9IDAKICAgICAgICAgICAgICAgIGVsaWYgZXZlbnQua2V5ID09IHB5Z2FtZS5LX1JJR0hUOgogICAgICAgICAgICAgICAgICAgIHgxX2NoYW5nZSA9IHNuYWtlX2Jsb2NrCiAgICAgICAgICAgICAgICAgICAgeTFfY2hhbmdlID0gMAogICAgICAgICAgICAgICAgZWxpZiBldmVudC5rZXkgPT0gcHlnYW1lLktfVVA6CiAgICAgICAgICAgICAgICAgICAgeTFfY2hhbmdlID0gLXNuYWtlX2Jsb2NrCiAgICAgICAgICAgICAgICAgICAgeDFfY2hhbmdlID0gMAogICAgICAgICAgICAgICAgZWxpZiBldmVudC5rZXkgPT0gcHlnYW1lLktfRE9XTjoKICAgICAgICAgICAgICAgICAgICB5MV9jaGFuZ2UgPSBzbmFrZV9ibG9jawogICAgICAgICAgICAgICAgICAgIHgxX2NoYW5nZSA9IDAKCiAgICAgICAgaWYgeDEgJmd0Oz0gd2lkdGggb3IgeDEgJmx0OyAwIG9yIHkxICZndDs9IGhlaWdodCBvciB5MSAmbHQ7IDA6CiAgICAgICAgICAgIGdhbWVfY2xvc2UgPSBUcnVlCgogICAgICAgIHgxICs9IHgxX2NoYW5nZQogICAgICAgIHkxICs9IHkxX2NoYW5nZQogICAgICAgIHNjcmVlbi5maWxsKGJsdWUpCiAgICAgICAgcHlnYW1lLmRyYXcucmVjdChzY3JlZW4sIGdyZWVuLCBbZm9vZHgsIGZvb2R5LCBzbmFrZV9ibG9jaywgc25ha2VfYmxvY2tdKQogICAgICAgIHNuYWtlX2hlYWQgPSBbXQogICAgICAgIHNuYWtlX2hlYWQuYXBwZW5kKHgxKQogICAgICAgIHNuYWtlX2hlYWQuYXBwZW5kKHkxKQogICAgICAgIHNuYWtlX2xpc3QuYXBwZW5kKHNuYWtlX2hlYWQpCiAgICAgICAgaWYgbGVuKHNuYWtlX2xpc3QpICZndDsgbGVuZ3RoX29mX3NuYWtlOgogICAgICAgICAgICBkZWwgc25ha2VfbGlzdFswXQoKICAgICAgICBmb3IgeCBpbiBzbmFrZV9saXN0WzotMV06CiAgICAgICAgICAgIGlmIHggPT0gc25ha2VfaGVhZDoKICAgICAgICAgICAgICAgIGdhbWVfY2xvc2UgPSBUcnVlCgogICAgICAgIGRyYXdfc25ha2Uoc25ha2VfYmxvY2ssIHNuYWtlX2xpc3QpCiAgICAgICAgcHlnYW1lLmRpc3BsYXkudXBkYXRlKCkKCiAgICAgICAgaWYgeDEgPT0gZm9vZHggYW5kIHkxID09IGZvb2R5OgogICAgICAgICAgICBmb29keCA9IHJvdW5kKHJhbmRvbS5yYW5kcmFuZ2UoMCwgd2lkdGggLSBzbmFrZV9ibG9jaykgLyAxMC4wKSAqIDEwLjAKICAgICAgICAgICAgZm9vZHkgPSByb3VuZChyYW5kb20ucmFuZHJhbmdlKDAsIGhlaWdodCAtIHNuYWtlX2Jsb2NrKSAvIDEwLjApICogMTAuMAogICAgICAgICAgICBsZW5ndGhfb2Zfc25ha2UgKz0gMQoKICAgICAgICBjbG9jay50aWNrKHNuYWtlX3NwZWVkKQoKICAgIHB5Z2FtZS5xdWl0KCkKICAgIHF1aXQoKQoKZ2FtZUxvb3AoKQ==
import pygame
import time
import random
# 初始化
pygame.init()
# 顏色定義
white = (255, 255, 255)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)
# 視窗大小
width, height = 600, 400
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('貪吃蛇')
# 時間設定
clock = pygame.time.Clock()
snake_block = 10
snake_speed = 15
font_style = pygame.font.SysFont("bahnschrift", 25)
def draw_snake(snake_block, snake_list):
for x in snake_list:
pygame.draw.rect(screen, black, [x[0], x[1], snake_block, snake_block])
def message(msg, color):
mesg = font_style.render(msg, True, color)
screen.blit(mesg, [width / 6, height / 3])
def gameLoop():
game_over = False
game_close = False
x1 = width / 2
y1 = height / 2
x1_change = 0
y1_change = 0
snake_list = []
length_of_snake = 1
foodx = round(random.randrange(0, width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, height - snake_block) / 10.0) * 10.0
while not game_over:
while game_close:
screen.fill(blue)
message("遊戲結束!按 Q 離開或 C 重新開始", red)
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 >= width or x1 < 0 or y1 >= height or y1 < 0:
game_close = True
x1 += x1_change
y1 += y1_change
screen.fill(blue)
pygame.draw.rect(screen, 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
draw_snake(snake_block, snake_list)
pygame.display.update()
if x1 == foodx and y1 == foody:
foodx = round(random.randrange(0, width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, height - snake_block) / 10.0) * 10.0
length_of_snake += 1
clock.tick(snake_speed)
pygame.quit()
quit()
gameLoop()import pygame
import time
import random
# 初始化
pygame.init()
# 顏色定義
white = (255, 255, 255)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)
# 視窗大小
width, height = 600, 400
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('貪吃蛇')
# 時間設定
clock = pygame.time.Clock()
snake_block = 10
snake_speed = 15
font_style = pygame.font.SysFont("bahnschrift", 25)
def draw_snake(snake_block, snake_list):
for x in snake_list:
pygame.draw.rect(screen, black, [x[0], x[1], snake_block, snake_block])
def message(msg, color):
mesg = font_style.render(msg, True, color)
screen.blit(mesg, [width / 6, height / 3])
def gameLoop():
game_over = False
game_close = False
x1 = width / 2
y1 = height / 2
x1_change = 0
y1_change = 0
snake_list = []
length_of_snake = 1
foodx = round(random.randrange(0, width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, height - snake_block) / 10.0) * 10.0
while not game_over:
while game_close:
screen.fill(blue)
message("遊戲結束!按 Q 離開或 C 重新開始", red)
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 >= width or x1 < 0 or y1 >= height or y1 < 0:
game_close = True
x1 += x1_change
y1 += y1_change
screen.fill(blue)
pygame.draw.rect(screen, 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
draw_snake(snake_block, snake_list)
pygame.display.update()
if x1 == foodx and y1 == foody:
foodx = round(random.randrange(0, width - snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, height - snake_block) / 10.0) * 10.0
length_of_snake += 1
clock.tick(snake_speed)
pygame.quit()
quit()
gameLoop()