教你從零開始實現(xiàn)貪吃蛇Python小游戲
貪吃蛇Python小游戲(源碼+注釋+粘貼即用) 這款貪吃蛇游戲十分簡便,規(guī)避使用難以載包的pygame,下面是運行圖:


文章中部是游戲原理及代碼講解,文末是完整代碼。
游戲代碼實現(xiàn)
繪制圖像
在繪制游戲圖像仿麥呢,我們采用的是數(shù)據(jù)庫中較之pygame更為輕便的Turtle Graphics
構建數(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()
上面是通過烏龜制圖,前進單位距離后旋轉(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)(相當于Java中的loop線程)
def gameLoop(): //隨機生成蘋果 apple_x = randrange(-200, 200) apple_y = randrange(-200, 200) //繪制蘋果 square(apple_x, apple_y, 10, "red") //刷新畫布 update()
繪制貪吃蛇(snake.py)
注意,我們可以把貪吃蛇看作一個隊列,而這個隊列之中的每一個元素都包含兩個變量(該元素的橫縱坐標)
def gameLoop(): //隨機生成蘋果 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()
繪制貪吃蛇的運動
貪吃蛇運動原理:為了方便使蛇移動,我們要把蛇倒裝到隊列中,在它移動的時候,我們會拋出蛇隊列的第一個元素(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)刷新運行時間,
ontimer(gameLoop, 100) # 每100毫秒運行一下gameLoop函數(shù)
制作貪吃蛇操作響應
我們要建立鍵盤監(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()
判定蛇是否吃到蘋果
這個也是十分容易,我們只用比較蛇頭的橫縱坐標是否都等于蘋果的橫縱坐標(蛇頭與蘋果重合)
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毫秒運行一下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()
到此這篇關于教你從零開始實現(xiàn)貪吃蛇Python小游戲的文章就介紹到這了,更多相關Python貪吃蛇小游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
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-05
python定時按日期備份MySQL數(shù)據(jù)并壓縮
這篇文章主要為大家詳細介紹了python定時按日期備份MySQL數(shù)據(jù)并壓縮,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-04-04
利用Python+PyQt5實現(xiàn)簡易瀏覽器的實戰(zhàn)記錄
Django框架中render_to_response()函數(shù)的使用方法
python中如何實現(xiàn)將數(shù)據(jù)分成訓練集與測試集的方法
Python刪除Java源文件中全部注釋的實現(xiàn)方法

