Python贪吃蛇 (完整代码+详细注释+粘贴即食)
生活随笔
收集整理的這篇文章主要介紹了
Python贪吃蛇 (完整代码+详细注释+粘贴即食)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 代碼
- 運行截圖
- 筆記補充
- 參考博客(阿里嘎多!)
代碼
#!/usr/bin/env python # -*- coding: utf-8 -*- # author:Wangdali time:2021年1月20日16:08:44 #python實現:貪吃蛇 ''' 游戲玩法:回車開始游戲;空格暫停游戲/繼續游戲;方向鍵/wsad控制小蛇走向 ''' ''' 思路:用列表存儲蛇的身體;用淺色表示身體,深色背景將身體凸顯出來; 蛇的移動:仔細觀察,是:身體除頭和尾不動、尾部消失,頭部增加,所以,新添加的元素放在列表頭部、刪除尾部元素; 游戲結束判定策略:超出邊界;觸碰到自己的身體:蛇前進的下一格子為身體的一部分(即在列表中)。 ''' #注:因為在列表中需要頻繁添加和刪除元素,所以用deque容器代替列表;是因為deque具有高效的插入和刪除效率 #初始化蛇,長度為3,放置在屏幕左上角; #導包 import random import sys import time import pygame from pygame.locals import * from collections import deque #基礎設置 Screen_Height=480 Screen_Width=600 Size=20#小方格大小 Line_Width=1 #游戲區域的坐標范圍 Area_x=(0,Screen_Width//Size-1) #0是左邊界,1是右邊界 #注:python中//為整數除法;/為浮點數除法 Area_y=(2,Screen_Height//Size-1) #食物的初步設置 #食物的分值+顏色 Food_Style_List=[(10,(255,100,100)),(20,(100,255,100)),(30,(100,100,255))] #整體顏色設置 Light=(100,100,100) Dark=(200,200,200) Black=(0,0,0) Red=(200,30,30) Back_Ground=(40,40,60) #文本輸出格式設置 def Print_Txt(screen,font,x,y,text,fcolor=(255,255,255)):#font.render參數意義:.render(內容,是否抗鋸齒,字體顏色,字體背景顏色)Text=font.render(text,True,fcolor)screen.blit(Text,(x,y)) #初始化蛇 def init_snake():snake=deque()snake.append((2,Area_y[0]))snake.append((1,Area_y[0]))snake.append((0,Area_y[0]))return snake #食物設置 #注意需要對食物出現在蛇身上的情況進行判斷 def Creat_Food(snake):'''注:randint 產生的隨機數區間是包含左右極限的,也就是說左右都是閉區間的[1, n],能取到1和n。而 randrange 產生的隨機數區間只包含左極限,也就是左閉右開的[1, n),1能取到,而n取不到。randint產生的隨機數是在指定的某個區間內的一個值,而 randrange 產生的隨機數可以設定一個步長,也就是一個間隔。'''food_x=random.randint(Area_x[0],Area_x[1]) #此處有疑問food_y=random.randint(Area_y[0],Area_y[1])#如果食物出現在蛇上,重來;while(food_x,food_y)in snake:food_x = random.randint(Area_x[0], Area_x[1])food_y = random.randint(Area_y[[0], Area_y[1]])return food_x,food_y #食物風格 def Food_Style():return Food_Style_List[random.randint(0,2)] #返回隨機的分值和顏色 def main():pygame.init()screen=pygame.display.set_mode((Screen_Width,Screen_Height)) #初始化一個準備顯示的窗口或屏幕pygame.display.set_caption('貪吃蛇') #Set the current window caption#得分字體設置font1=pygame.font.SysFont('SimHei',24)#GO字體設置font2 = pygame.font.SysFont(None, 72)fwidth, fheight = font2.size('GAME OVER') ####程序bug修復:如果蛇在向右移動,快速點擊分別施加向下、向左的命令,向下的命令會被覆蓋,只有向左的命令被接受,直接GameOver# b變量為了防止這個情況發生b=True#蛇snake=init_snake()#食物food=Creat_Food(snake)food_style=Food_Style()#方向控制pos=(1,0) ####啟動游戲相關變量初始化game_over=True #結束標志 # 是否開始,當start = True,game_over = True 時,才顯示 GAME OVERgame_start=False #開始標志score=0 #得分orispeed=0.3 #蛇初始速度speed=orispeed #蛇速度last_move_time=Nonepause=False #暫停while True:for event in pygame.event.get():if event.type==QUIT:sys.exit()elif event.type==KEYDOWN:if event.key==K_RETURN:if game_over:game_start=Truegame_over=Falseb=Truesnake=init_snake()food=Creat_Food(snake)food_style=Food_Style()pos=(1,0)#得分score=0last_move_time=time.time()elif event.key==K_SPACE:if not game_over:pause=not pause#以下為防止蛇在向右移動時按向左鍵,導致GameOverelif event.key in (K_UP,K_w):if b and not pos[1]: ###pos=(0,-1)b=Falseelif event.key in (K_DOWN,K_s):if b and not pos[1]:pos = (0, 1)b = Falseelif event.key in (K_LEFT,K_a):if b and not pos[0]:pos = (-1, 0)b = Falseelif event.key in (K_RIGHT,K_d):if b and not pos[0]:pos = (1, 0)b = False#填充背景色screen.fill(Back_Ground)####畫網格線、豎線for x in range(Size, Screen_Width, Size):pygame.draw.line(screen, Black, (x, Area_y[0] * Size), (x, Screen_Height), Line_Width)#畫網格線、橫線for y in range(Area_y[0] * Size, Screen_Height, Size):pygame.draw.line(screen, Black, (0, y), (Screen_Width, y), Line_Width)#蛇的爬行過程if not game_over:curTime=time.time()if curTime-last_move_time>speed: ###if not pause:b=Truelast_move_time=curTimenext_s = (snake[0][0] + pos[0], snake[0][1] + pos[1])#如果吃到了食物if next_s==food:snake.appendleft(next_s)score+=food_style[0]speed = orispeed - 0.03 * (score // 100)food = Creat_Food(snake)food_style = Food_Style()else:#在區域內if Area_x[0]<=next_s[0]<=Area_x[1] and Area_y[0]<=next_s[1]<=Area_y[1] and next_s not in snake:snake.appendleft(next_s)snake.pop()else :game_over=True#畫食物if not game_over:'''rect(Surface,color,Rect,width=0) 第一個參數指定矩形繪制到哪個Surface對象上第二個參數指定顏色第三個參數指定矩形的范圍(left,top,width,height)第四個參數指定矩形邊框的大小(0表示填充矩形)例如繪制三個矩形:pygame.draw.rect(screen, BLACK, (50, 50, 150, 50), 0)pygame.draw.rect(screen, BLACK, (250, 50, 150, 50), 1)pygame.draw.rect(screen, BLACK, (450, 50, 150, 50), 10)'''# 避免 GAME OVER 的時候把 GAME OVER 的字給遮住了pygame.draw.rect(screen, food_style[1], (food[0] * Size, food[1] * Size, Size, Size), 0)#畫蛇for s in snake:pygame.draw.rect(screen, Dark, (s[0] * Size + Line_Width, s[1] * Size + Line_Width,Size - Line_Width * 2, Size - Line_Width * 2), 0)Print_Txt(screen, font1, 30, 7, f'速度: {score // 100}')Print_Txt(screen, font1, 450, 7, f'得分: {score}')#畫GameOverif game_over:if game_start:#print('GameOver')Print_Txt(screen, font2, (Screen_Width - fwidth) // 2, (Screen_Height - fheight) // 2, 'GAME OVER',Red)pygame.display.update() if __name__=='__main__':main()運行截圖
筆記補充
1)
蛇的移動,首先根據方向來判斷,這里使用pos變量來記錄方向
pos(1, 0) //表示當前蛇向右的方向
pos(-1, 0) //表示當前蛇向左的方向
pos(0, 1) //表示當前蛇向下的方向
pos(0, -1) //表示當前蛇向上的方向
2)
怎么能控制蛇的速度呢?
其實是控制時間來刷新,我們知道所有的動作都在一個循環里面完成的,也就是代碼都一直在運行著。
比如我設置速度為1,表示一秒刷新一次,那么蛇的移動也就是一秒一次,我們看到的也是一秒移動一格。
當我們設置速度為0.5,表示0.5秒刷新一次,那我們就看到0.5秒移動一格,速度就相對地看起來快了。
參考博客(阿里嘎多!)
1、博客A
2、博客B
總結
以上是生活随笔為你收集整理的Python贪吃蛇 (完整代码+详细注释+粘贴即食)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse各版本对应JDK版本要求
- 下一篇: Micro Sip 配置自己的frees