教你從零開始實現(xiàn)貪吃蛇Python小游戲
貪吃蛇Python小游戲(源碼+注釋+粘貼即用) 這款貪吃蛇游戲十分簡便,規(guī)避使用難以載包的pygame,下面是運(yùn)行圖:
文章中部是游戲原理及代碼講解,文末是完整代碼。
游戲代碼實現(xiàn)
繪制圖像
在繪制游戲圖像仿麥呢,我們采用的是數(shù)據(jù)庫中較之pygame更為輕便的Turtle Graphics
構(gòu)建數(shù)據(jù)庫(gamebase.py)
from turtle import * # "*"是引用所有函數(shù) def square(x, y, size, color_name): up() goto(x, y) down() color(color_name) begin_fill() forward(size) left(90) forward(size) left(90) forward(size) left(90) forward(size) left(90) end_fill()
上面是通過烏龜制圖,前進(jìn)單位距離后旋轉(zhuǎn)90度,然后再旋轉(zhuǎn)90度直至繪制出一個小方塊
繪制蘋果(snake.py)
引用剛剛我們繪圖的數(shù)據(jù)庫
from turtle import * from gamebase import square from random import randrange
然后定義畫布的大小
setup(420,420,0,0) //隱藏烏龜頭 emoj.emoj. hideturtle //隱藏軌跡 tracer(False) //繪制 done()
定義游戲程序循環(huán)(相當(dāng)于Java中的loop線程)
def gameLoop(): //隨機(jī)生成蘋果 apple_x = randrange(-200, 200) apple_y = randrange(-200, 200) //繪制蘋果 square(apple_x, apple_y, 10, "red") //刷新畫布 update()
繪制貪吃蛇(snake.py)
注意,我們可以把貪吃蛇看作一個隊列,而這個隊列之中的每一個元素都包含兩個變量(該元素的橫縱坐標(biāo))
def gameLoop(): //隨機(jī)生成蘋果 apple_x = randrange(-200, 200) apple_y = randrange(-200, 200) //繪制蛇 for n in range(len(sanke)): square(snake[n][0],snake[n][1[],10,"black) //繪制蘋果 square(apple_x, apple_y, 10, "red") //刷新畫布 update()
繪制貪吃蛇的運(yùn)動
貪吃蛇運(yùn)動原理:為了方便使蛇移動,我們要把蛇倒裝到隊列中,在它移動的時候,我們會拋出蛇隊列的第一個元素(pop()),然后,在蛇尾新增一個元素(append())
global apple_x, apple_y, snake, aim_x, aim_y #全局變量申請snake.append([ snake[-1][0] + aim_x, snake[-1][1] + aim_y ])snake.pop(0)global apple_x, apple_y, snake, aim_x, aim_y #全局變量申請 snake.append([ snake[-1][0] + aim_x, snake[-1][1] + aim_y ]) snake.pop(0)
然后,我們要加入循環(huán)刷新運(yùn)行時間,
ontimer(gameLoop, 100) # 每100毫秒運(yùn)行一下gameLoop函數(shù)
制作貪吃蛇操作響應(yīng)
我們要建立鍵盤監(jiān)聽,這對于python而言是十分簡單的
listen() #監(jiān)聽 onkey(lambda: change(0, 10), "w") onkey(lambda: change(0, -10), "s") onkey(lambda: change(-10, 0), "a") onkey(lambda: change(10, 0), "d") gameLoop()
判定蛇是否吃到蘋果
這個也是十分容易,我們只用比較蛇頭的橫縱坐標(biāo)是否都等于蘋果的橫縱坐標(biāo)(蛇頭與蘋果重合)
if snake[-1][0] != apple_x or snake[-1][1] != apple_y: snake.pop(0) else: apple_x = randrange(-20, 18) * 10 apple_y = randrange(-19, 19) * 10
判定蛇是否咬到自己
這個原理和上面蛇是否吃到蘋果原理類似
def bite(): for n in range(len(snake)-1): if snake[-1][0] == snake[n][0] and snake[-1][1] == snake[n][1]: return True return False
判定蛇是否在界內(nèi)
def inside(): if -200 <= snake[-1][0] <= 180 and -190 <= snake[-1][1]<=190: return True else : return False
游戲源碼
gamebase.py
from turtle import * # "*"是引用所有函數(shù) def square(x, y, size, color_name): up() goto(x, y) down() color(color_name) begin_fill() forward(size) left(90) forward(size) left(90) forward(size) left(90) forward(size) left(90) end_fill()
snake.py
from time import sleep apple_x = randrange(-20, 18) * 10 apple_y = randrange(-19, 19) * 10 snake = [[0, 0], [10, 0], [20, 0], [30, 0], [40, 0], [50, 0]] aim_x = 10 aim_y = 0 def inside(): if -200 <= snake[-1][0] <= 180 and -190 <= snake[-1][1]<=190: return True else : return False def change(x, y): global aim_x, aim_y aim_x = x aim_y = y def bite(): for n in range(len(snake)-1): if snake[-1][0] == snake[n][0] and snake[-1][1] == snake[n][1]: return True return False def gameLoop(): global apple_x, apple_y, snake, aim_x, aim_y #全局變量申請 snake.append([ snake[-1][0] + aim_x, snake[-1][1] + aim_y ]) if snake[-1][0] != apple_x or snake[-1][1] != apple_y: snake.pop(0) else: apple_x = randrange(-20, 18) * 10 apple_y = randrange(-19, 19) * 10 if(not inside()) or bite(): square(snake[-1][0], snake[-1][1], 10,"hotpink") update() sleep(2)# 暫停2秒 apple_x = randrange(-20, 18) * 10 apple_y = randrange(-19, 19) * 10 snake = [[0, 0], [10, 0], [20, 0], [30, 0], [40, 0], [50, 0]] aim_x = 10 aim_y = 0 n = 0 clear() square(-210,-200,410,"black") square(-200,-190,390,"white") square(apple_x, apple_y, 10, "red") for n in range(len(snake)): square(snake[n][0], snake[n][1], 10, 'black') ontimer(gameLoop, 100) # 每300毫秒運(yùn)行一下gameLoop函數(shù) update() #注意:代碼的前后順序會給游戲帶來不同的體感 setup(420, 420, 0, 0) hideturtle() tracer(False) listen() #監(jiān)聽 onkey(lambda: change(0, 10), "w") onkey(lambda: change(0, -10), "s") onkey(lambda: change(-10, 0), "a") onkey(lambda: change(10, 0), "d") gameLoop() done()
到此這篇關(guān)于教你從零開始實現(xiàn)貪吃蛇Python小游戲的文章就介紹到這了,更多相關(guān)Python貪吃蛇小游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Anaconda出現(xiàn)CondaHTTPError: HTTP 000 CONNECTION FAILED for url
使用anaconda創(chuàng)建一個新的環(huán)境,執(zhí)行“conda create -n scrapyEnv python=3.6”,結(jié)果出現(xiàn)了CondaHTTPError,下面我們就一起來了解一下解決方法吧2021-05-05python定時按日期備份MySQL數(shù)據(jù)并壓縮
這篇文章主要為大家詳細(xì)介紹了python定時按日期備份MySQL數(shù)據(jù)并壓縮,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-04-04

利用Python+PyQt5實現(xiàn)簡易瀏覽器的實戰(zhàn)記錄

Python反爬機(jī)制-驗證碼功能的具體實現(xiàn)過程

Django框架中render_to_response()函數(shù)的使用方法

python中如何實現(xiàn)將數(shù)據(jù)分成訓(xùn)練集與測試集的方法

Python刪除Java源文件中全部注釋的實現(xiàn)方法