turtle模塊還能這樣玩?(一條條金龍魚、雨景)


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的快感了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章