教你從零開始實現(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)文章
Python實現(xiàn)釘釘/企業(yè)微信自動打卡的示例代碼
這篇文章主要介紹了Python實現(xiàn)釘釘/企業(yè)微信自動打卡的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
對python_discover方法遍歷所有執(zhí)行的用例詳解
今天小編就為大家分享一篇對python_discover方法遍歷所有執(zhí)行的用例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02
python使用rstrip函數(shù)刪除字符串末位字符
rstrip函數(shù)用于刪除字符串末位指定字符,默認(rèn)為空白符,這篇文章主要介紹了python使用rstrip函數(shù)刪除字符串末位字符的方法,需要的朋友可以參考下2023-04-04
python3批量刪除豆瓣分組下的好友的實現(xiàn)代碼
下面小編就為大家?guī)硪黄猵ython3批量刪除豆瓣分組下的好友的實現(xiàn)代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06
python類的方法屬性與方法屬性的動態(tài)綁定代碼詳解
這篇文章主要介紹了python類的方法屬性與方法屬性的動態(tài)綁定代碼詳解,具有一定借鑒價值,需要的朋友可以參考下2017-12-12
python實現(xiàn)微秒級等待問題(windows)
這篇文章主要介紹了python實現(xiàn)微秒級等待問題(windows),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06

