Python的turtle模塊不僅可以用來繪製一些基本的圖形,還有與圖片結合,做出一些特殊的效果,還可以用來做二維小遊戲。本篇是介紹用turtle模塊做出的一幅動態的魚兒遊過的畫面和動態的雨景圖
一條條金龍魚
1、先看一下效果圖
2、創建屏幕對象
首先是導入實例化一個turtle屏幕對象,用setup()建立屏幕,並設置好屏幕的寬、高;然後註冊我們需要用到的3張圖片
#設置場景幕布(寬高,背景色, 飛船, 幀數)
s = Screen()
s.title('一條條金龍魚@梔子') #設置標題
w, h = 1200, 700 #設置屏幕大小
s.setup(w, h) #建立屏幕
s.bgcolor('black') #設置顏色爲黑色
s.register_shape('s0.gif')
s.register_shape('s1.gif')
s.register_shape('s2.gif')
#第一個參數爲作圖過程時長,第二個參數爲刷新間隔時長(即幀數,單位毫秒)
s.tracer(0, 5) #爲0表示禁用動畫
注意,這裏的register_shape()只能註冊gif格式的圖片。
3、畫星空
我們的背景可以自定義一張圖片,用對象名.bgpic(‘filename’)加入圖片,也可以自己畫一個,比如我畫一個星空:
#創建星空
star = Turtle()
star.shape('circle') #新建一個畫筆,設置爲圓形
star.shapesize(0.05, 0.05) #改變圓形大小
star.color('white')
star.penup()
star.speed(0)
for i in range(100):
x = randint(-w/2, w/2) #w爲開始定義的屏幕寬度,h爲高度
y = randint(-h/2, h/2)
star.goto(x, y)
star.stamp() #使畫筆留下痕跡
4、然後我們需要創建魚羣,並克隆魚到魚羣裏
#創建魚羣,用空列表來裝魚
mother_fishs = [
Turtle(shape='s0.gif', visible=False), #初始設置爲不可見
Turtle(shape='s1.gif', visible=False),
Turtle(shape='s2.gif', visible=False)
]
#克隆魚到魚羣裏
space_fishs = []
for i in range(60): #60條魚
idx = i % 3 #0,1,2
space_fish = mother_fishs[idx].clone() #克隆
space_fish._speed = random() * (idx+1) #1,2,3
space_fishs.append(space_fish) #把魚加入到魚羣中
5、無限循環
我們最後一步就是通過無限循環來控制魚羣的移動,也就是改變一條條魚的生成地點和它們的位置
在循環裏,我們需要先遍歷每一條魚,設置它們的位置
for space_fish in space_fishs:
space_fish.setx(space_fish.xcor() - space_fish._speed)
然後我們需要判斷一下這些魚是否超出了邊界,如果超出了,這條魚就先隱藏,然後重新回到出發地,繼續前進
if space_fish.xcor() < -w/2:
space_fish.hideturtle()
space_shuttle.goto(w/2+randint(0,w/2),randint(-h/2,h/2))
space_fish.showturtle()
這樣,一條條金龍魚遊動的畫面就做出來了,邏輯都很簡單,操作也不難,都是turtle的基本操作,希望大家也能輕鬆做出來
6、完整代碼
#導入庫
from turtle import *
from random import *
#設置場景幕布(寬高,背景色, 飛船, 幀數)
s = Screen()
s.title('一條條金龍魚@梔子') #設置標題
w, h = 1200, 700 #設置屏幕大小
s.setup(w, h) #建立屏幕
s.bgcolor('black') #設置顏色爲黑色
s.register_shape('s0.gif')
s.register_shape('s1.gif')
s.register_shape('s2.gif')
#第一個參數爲作圖過程時長,第二個參數爲刷新間隔時長(即幀數,單位毫秒)
s.tracer(0, 5) #爲0表示禁用動畫
#創建星空
star = Turtle()
star.shape('circle') #新建一個畫筆,設置爲圓形
star.shapesize(0.05, 0.05) #改變圓形大小
star.color('white')
star.penup()
star.speed(0)
for i in range(100):
x = randint(-w/2, w/2) #w爲開始定義的屏幕寬度,h爲高度
y = randint(-h/2, h/2)
star.goto(x, y)
star.stamp() #使畫筆留下痕跡
#創建魚羣
mother_fishs = [
Turtle(shape='s0.gif', visible=False), #初始設置爲不可見
Turtle(shape='s1.gif', visible=False),
Turtle(shape='s2.gif', visible=False)
]
#克隆魚到魚羣裏
space_fishs = []
for i in range(60): #60條魚
idx = i % 3 #0,1,2
space_fish = mother_fishs[idx].clone() #克隆
space_fish._speed = random() * (idx+1) #1,2,3
space_fishs.append(space_fish) #把魚加入到魚羣中
#設置艦隊的初始狀態
for space_fish in space_fishs:
space_fish.hideturtle() #讓飛船先隱藏起來
space_fish.penup() #把畫筆也隱藏
space_fish.goto(w/2+randint(0,w/2),randint(-h/2,h/2)) #設置出生位置,從最右邊開始,高度隨機
space_fish.showturtle() #讓飛船顯示出來
#無限循環,控制艦隊的移動
while True:
for space_fish in space_fishs:
space_fish.setx(space_fish.xcor() - space_fish._speed)
if space_fish.xcor() < -w/2:
space_fish.hideturtle()
space_shuttle.goto(w/2+randint(0,w/2),randint(-h/2,h/2))
space_fish.showturtle()
s.update() #刷新屏幕
雨景
對應上面的遊動金龍魚案例,其實就是用turtle做了一個動態的處理,把我們加入的圖片用一定的規則去改變位置,而且是簡單的一維變化位置,就是從右到左,所以說邏輯並不複雜。
而且我們隨便改一改,就可以實現另外一番效果,比如我想讓它從上到下,並且換一張圖片,就用雨滴圖片;然後我不想用星空做背景,想用一張圖片做背景,那就用turtle的bgpic()方法來設置背景。
這樣,一幅雨景效果就實現了:
練習代碼:
#導入庫
from turtle import *
from random import *
#設置場景幕布
s = Screen()
s.title('雨景@梔子') #設置標題
w, h = 1200, 700 #設置屏幕大小
s.setup(w, h) #建立屏幕
s.bgcolor('black') #設置顏色爲黑色
s.register_shape('s0.gif')
s.register_shape('s01.gif')
s.bgpic('s01.gif')
s.tracer(0, 5) #爲0表示禁用動畫
#創建雨滴羣
mother_raindrops = [
Turtle(shape='s0.gif', visible=False), #設置爲不可見
Turtle(shape='s0.gif', visible=False),
Turtle(shape='s0.gif', visible=False)
]
#克隆艦隊
space_raindrops = []
for i in range(60):
idx = i % 3 #0,1,2
space_raindrop = mother_raindrops[idx].clone() #克隆
space_raindrop._speed = random() * (idx+1) #1,2,3
space_raindrops.append(space_raindrop)
#設置初始狀態
for space_raindrop in space_raindrops:
space_raindrop.hideturtle()
space_raindrop.penup() #把畫筆也隱藏
space_raindrop.goto(randint(-w/2,w/2),h/2) #設置出生位置,從最右邊開始,高度隨機
space_raindrop.showturtle()
#無限循環
while True:
for space_raindrop in space_raindrops:
space_raindrop.sety(space_raindrop.ycor() - space_raindrop._speed) #不斷移動
if space_raindrop.ycor() < -h/2: #判斷撞牆沒有,撞牆就消失
space_raindrop.hideturtle()
space_raindrop.goto(randint(-w/2,w/2),h/2)
space_raindrop.showturtle()
s.update() #刷新屏幕
Python中的turtle真的非常有趣,有各種各樣的玩法,只要我們去嘗試就能切實體會到學Python的快感了