## 完整程式碼 ```python= import pygame, sys, time, random # 引用函式庫 from pygame.locals import * # ----------------------------遊戲基本設定------------------------------ # pygame初始化 pygame.init() # 設定調整程式執行速度之物件 mainClock = pygame.time.Clock() # 設定字型 basicFont = pygame.font.SysFont(None, 48) # 設定視窗 WINDOWWIDTH = 405 WINDOWHEIGHT = 450 windowSurface = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT), 0, 32) pygame.display.set_caption('貪食蛇') # 設定玩家物件 player = [(60, 60), (80, 60), (100, 60),(120, 60)] fruit = [(200, 200)] # pygame.Rect(X,Y,寬,高) # 設定軌道物件串列 lines = [] lines.append(pygame.Rect(5, 55, 1, 390)) lines.append(pygame.Rect(5, 55, 390, 1)) lines.append(pygame.Rect(5, 445, 390, 1)) lines.append(pygame.Rect(395, 55, 1, 391)) # 設定軌道物件串列 wall = [] wall.append(pygame.Rect(15, 60, 5, 375)) wall.append(pygame.Rect(15, 60, 370, 5)) wall.append(pygame.Rect(15, 435, 370, 5)) wall.append(pygame.Rect(380, 60, 5, 375)) # 隱藏滑鼠游標 pygame.mouse.set_visible(False) # ------------------------------變數設定------------------------------ # 以變數設定顏色(R,G,B) BLACK = (25, 25, 25) WHITE = (255, 255, 255) WALL = (31, 34, 50) FRUIT = (173, 31, 52) SNAKE = (48, 95, 69) BG = (238, 227, 211) # 文字顏色黑色 TEXTCOLOR = (0, 0, 0) # 設定鍵盤移動變數,預設為False moveLeft = False moveRight = False moveUp = False moveDown = False # 初始速度 MOVESPEED = 0.5 FPS = 12 # 初始分數 score = 0 # 設定字型 font = pygame.font.SysFont(None, 32) # 初始方向 nowdir = (0, 20) # 初始level level = 1 # ------------------------------函式定義------------------------------ # 設定遊戲失敗訊息 def failed_message(): windowSurface.fill(WHITE) text = basicFont.render('Score: %s'% (score), True, BLACK, BG) textRect = text.get_rect() textRect.centerx = windowSurface.get_rect().centerx textRect.centery = windowSurface.get_rect().centery windowSurface.blit(text, textRect) # 設定果實生成 def eat_fruit_message(): x = random.randrange(8, 17) y = random.randrange(8, 20) fruits = (20 * x, 20 * y) A = pygame.Rect(fruits[0], fruits[1], 20, 20) for body in snake[:]: # 當果實與蛇的身體重疊 if A.colliderect(body): x = random.randrange(3, 17) y = random.randrange(5, 20) fruits = (20 * x, 20 * y) fruit.insert(0, fruits) fruit.pop(len(fruit) - 1) # 繪製文字 def drawText(text, font, surface, x, y): textobj = font.render(text, 1, TEXTCOLOR) textrect = textobj.get_rect() textrect.topleft = (x, y) surface.blit(textobj, textrect) # ------------------------------主程式------------------------------ while True: # 遊戲本身是個無窮迴圈 snake = [] for i in range(len(player)): snake.append(pygame.Rect(player[i][0], player[i][1], 20, 20)) point = [] for i in range(len(fruit)): point.append(pygame.Rect(fruit[i][0], fruit[i][1], 20, 20)) # ------------------------------以鍵盤控制玩家------------------------------ for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() if event.type == KEYDOWN: if event.key == K_LEFT: moveRight = False moveLeft = True if event.key == K_RIGHT: moveLeft = False moveRight = True if event.key == K_UP: moveDown = False moveUp = True if event.key == K_DOWN: moveUp = False moveDown = True if event.type == KEYUP: if event.key == K_ESCAPE: pygame.quit() sys.exit() if event.key == K_LEFT: moveLeft = False if event.key == K_RIGHT: moveRight = False if event.key == K_UP: moveUp = False if event.key == K_DOWN: moveDown = False if event.key == K_c: player.x = 360 player.y = 320 # --------------------運用鍵盤移動變數調整玩家位置-------------------- if moveDown and snake[0].bottom < WINDOWHEIGHT: nowdir = (0, 20) if moveUp and snake[0].top > 0: nowdir = (0, -20) if moveLeft and snake[0].left > 0: nowdir = (-20, 0) if moveRight and snake[0].right < WINDOWWIDTH: nowdir = (20, 0) nowpos = player[0][0] + nowdir[0], player[0][1] + nowdir[1] player.insert(0, nowpos) player.pop(len(player) - 1) # ------------------------------繪製物件------------------------------ # 畫出白色背景 windowSurface.fill(BG) # 畫出玩家物件 for i in range(len(player)): pygame.draw.rect(windowSurface, SNAKE, snake[i]) # 畫出果實物件 for i in range(len(point)): pygame.draw.rect(windowSurface, FRUIT, point[i]) # 畫出軌道 for i in range(len(wall)): pygame.draw.rect(windowSurface, WALL, wall[i]) # 繪製分數 drawText('Score: %s' % (score), font, windowSurface, 150, 18) # 繪製難度 drawText('Level: %s' % (level), font, windowSurface, 10, 18) # ------------------------------碰撞偵測------------------------------ # 當玩家撞到軌道,遊戲結束 for line in lines[:]: if snake[0].colliderect(line): time.sleep(1) failed_message() pygame.display.update() time.sleep(2) pygame.quit() sys.exit() # 當玩家撞到自身,遊戲結束 for body in snake[1:]: if snake[0].colliderect(body): time.sleep(1) failed_message() pygame.display.update() time.sleep(2) pygame.quit() sys.exit() # 當玩家吃到果實,得分 # 且當分數為五的倍數時,難度+1,速度+0.5 for p in point[:]: if snake[0].colliderect(point[0]): l = len(player) Xgap = player[l - 1][0] - player[l - 2][0] Ygap = player[l - 1][1] - player[l - 2][1] addback = player[l - 1][0] + Xgap, player[l - 1][1] + Ygap player.append(addback) eat_fruit_message() score += 1 if score%5 == 0: level += 1 FPS += 0.5 pygame.display.update() pygame.display.update() mainClock.tick(FPS) ```