• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      Python turtle的多學(xué)科創(chuàng)意編程

      2019-08-16 13:06:29陳斌陳天翔
      中國科技教育 2019年6期
      關(guān)鍵詞:海龜鼠標(biāo)形狀

      陳斌 陳天翔

      Python語言中內(nèi)置的海龜作圖turtle模塊設(shè)計(jì)巧妙,作圖模型簡單強(qiáng)大,能夠讓程序設(shè)計(jì)初學(xué)者很快編寫出趣味生動(dòng)的作圖程序,極大提高編程學(xué)習(xí)的興趣和積極性,在練習(xí)過程中培養(yǎng)和提高計(jì)算思維。除了繪制圖形之外,Python turtle模塊還具有基本的交互功能,加上學(xué)習(xí)門檻低,又是Python語言內(nèi)置的標(biāo)準(zhǔn)模塊,所以非常適合作為創(chuàng)意編程的學(xué)習(xí)和開發(fā)平臺(tái)。本文以Python turtle模塊為核心,展示和分析交互游戲、數(shù)學(xué)對象可視化等學(xué)科領(lǐng)域的創(chuàng)意編程實(shí)例,并介紹turtle模塊的深入編程,以供創(chuàng)意編程的教學(xué)參考,也可用于高中Python程序設(shè)計(jì)課程的教學(xué)案例。

      本文實(shí)例所涉及的代碼和截圖,均可通過鏈 接(https://github. com/chbpku/bdfz.courses/wiki)訪問獲取。

      交互游戲:接蘋果

      本作品是一個(gè)通過鼠標(biāo)控制的交互游戲。程序運(yùn)行后,在turtle窗口中會(huì)有隨機(jī)數(shù)量和位置的紅色蘋果從頂端向下掉落,掉落速度各不相同。用戶需要通過鼠標(biāo)拖動(dòng)窗口中間的三角形狀“托籃”接住每一個(gè)蘋果。托籃可以在窗口中隨意移功,如果接住蘋果,則加10分,分?jǐn)?shù)在窗口左下角實(shí)時(shí)更新顯示,但如果未能接住蘋果使其掉出窗口下沿的話,則懲罰性地減100分。由于蘋果產(chǎn)生的位置和速度均為隨機(jī),數(shù)量不定,懲罰性減分幅度大,游戲還是有相當(dāng)難度的,想一直保持正分不太容易。最后點(diǎn)擊關(guān)閉窗口即可退出游戲。游戲運(yùn)行效果如圖1所示。

      turtle功能

      本作品涉及到的turtle模塊功能主要有5個(gè)。

      第1個(gè)是海龜繪圖加速功能,通過在程序前部加tracer方法調(diào)用禁止動(dòng)畫顯示。

      將海龜basket的拖動(dòng)事件綁定到basket的goto函數(shù),這樣,當(dāng)用戶用鼠標(biāo)點(diǎn)擊這個(gè)海龜并進(jìn)行拖動(dòng)的時(shí)候,會(huì)觸發(fā)drag事件,實(shí)現(xiàn)調(diào)用basket.goto函數(shù),并將事件發(fā)生時(shí)海龜?shù)淖鴺?biāo)作為參數(shù)傳遞給basket. goto函數(shù),從而實(shí)現(xiàn)鼠標(biāo)拖動(dòng)到哪里,海龜asket就跟到哪里的交互效果。海龜?shù)氖髽?biāo)交互事件還有點(diǎn)擊事件onclick、釋放事件nrelease,都可以綁定處理函數(shù),從而實(shí)現(xiàn)點(diǎn)擊、釋放鼠標(biāo)各個(gè)按鈕的交互。

      第3個(gè)是海龜克隆功能,如程序中的第14行,海龜model的clone方法,可以將model對象復(fù)制1個(gè),賦值給basket,克隆會(huì)產(chǎn)生新的海龜對象,并且保留原海龜對象的所有屬性值。利用克隆功能,能夠很方便地復(fù)制出相互獨(dú)立而又具有相同初始屬性的多個(gè)海龜,這些海龜后續(xù)修改屬性并不會(huì)相互影響。

      第4個(gè)是海龜形狀設(shè)定功能,如程序中的第13、15行,由于鼠標(biāo)交互需要整體拖動(dòng)一個(gè)圖形,我們就可以將一個(gè)海龜?shù)男螤钤O(shè)置為這個(gè)圖形,實(shí)現(xiàn)圖形的動(dòng)畫和接受鼠標(biāo)拖動(dòng)事件。第13行在程序中用addshape函數(shù)添加注冊1個(gè)名字為“basket”的形狀,從代碼可以看出,這是1個(gè)以海龜坐標(biāo)為中心的倒三角形。第15行用shape函數(shù)將海龜basket設(shè)置成名稱為“basket”的形狀。

      我們也可以用shape函數(shù)將海龜?shù)男螤罡臑閠urtle模塊內(nèi)置的形狀,如箭頭"arrowl"、海龜"turtle"、圓"circle"、方形"square"、三角形"triangle"和經(jīng)典形狀"classic"。

      第5個(gè)是海龜?shù)摹吧w戳”復(fù)印功能,如程序中的第43行,設(shè)定好紅色蘋果形狀的海龜mould作為印模,可以在海龜當(dāng)前位置上留下自身的形狀。即便移走海龜,這個(gè)形狀仍然保持在原地。

      40 #蘋果下落,并用印模畫出蘋果

      41 apple[1] -=apple[2]

      42 mould. goto(apple[0],apple[1])

      43 mould.stamp()

      stamp函數(shù)將返回一個(gè)stampid,如果需要清除這個(gè)形狀,則可以調(diào)用clearstamp豳數(shù)清除指定stampid的形狀,或者調(diào)用clearstamps函數(shù)清除所有形狀。

      程序代碼分析

      程序可以分為2個(gè)部分:第1-28行為初始化部分,第30-57行為循環(huán)體部分。

      初始化部分中,第1-2行導(dǎo)入了必要的運(yùn)行庫。

      1 import turtle, time

      2 form random import randrange

      第4-7行關(guān)閉了turtle的動(dòng)畫效果,并創(chuàng)建了基礎(chǔ)的畫筆對象,用于后續(xù)的復(fù)制。

      4 turtle.tracer(0)

      5 model=turtle.Turtle( )

      6 model.hideturtle()

      7 model.penup()

      第9-10行設(shè)置了幾個(gè)游戲參數(shù)。

      9 FPS=30 #每秒30幀刷新率

      10 FREQ=FPS//2#平均每秒生成2個(gè)蘋果

      第12-18行創(chuàng)建了果籃對象,將其設(shè)置為自定義形狀,并綁定至鼠標(biāo)拖動(dòng)事件上。

      12 #接蘋果的籃子

      13 turtle.addshape('basket', ((-100,0),(100,0),(0,-25)))

      14 basket=model.clone()

      15 basket.shape('basket')

      16 basket.setheading(90)

      17 basket.ondrag(basket.goto) #把goto函數(shù)綁定到鼠標(biāo)拖動(dòng)事件上

      18 basket.showturtle()

      第20-23行創(chuàng)建了繪制蘋果印模的畫筆對象,并設(shè)置了其顏色與形狀。

      20 #用來顯示蘋果的印模

      21 mould=model.clone()

      22 mouldcolor('red')

      23 mould.shape('circle')

      第25-28行創(chuàng)建了繪制得分文字的畫筆,設(shè)置了顏色與位置。

      26 board = model.clone()

      27 board.goto(-300,-300)

      28 board.color('blue')

      循環(huán)體部分前聲明了蘋果列表與當(dāng)前得分,隨后進(jìn)入無限循環(huán);循環(huán)體內(nèi)首先清除了上一幀繪制的蘋果。

      30 apples=[]

      31 score=0

      32 while True:

      33 mould.clearstamps()

      隨后,根據(jù)隨機(jī)數(shù)值確定當(dāng)前幀是否生成蘋果,并將相應(yīng)生成的蘋果加入列表內(nèi),每個(gè)對象記錄了橫縱坐標(biāo)與下落速度。

      34 if randrange(FREQ)==0:

      35 #生成蘋果[x,y,s]加入列表,s是一次下落高度

      36 apples.append([randrange(-350,350),400,5+ randrange(10)])

      38-52行為主要的濤戲邏輯:首先記錄籃子橫縱坐標(biāo)為b_x與b_y,隨后遍歷蘋果列表中每個(gè)對象。

      38 b_x. b_y=basket.pos()

      39 for apple in apples:

      對每個(gè)蘋果,在40-43行,首先使其下落相應(yīng)高度,并在下落后的位置使用stamp繪制。

      40 #蘋果下落,并用印模畫出蘋果

      41 apple[1]-=apple[2]

      42 mould.goto(apple[0], apple[1])

      43 mould.stamp()

      之后,44-52行中判斷了每個(gè)蘋果的位置,若在籃子內(nèi)則加分并移除;若落出底邊則扣分并移除。

      44 #判斷蘋果的位置

      45 if,abs(apple[0]-b_x)<=100 and -<=apple[1]-b_y<=25:

      46 #籃子碰上了蘋果,加分

      47 score+=10

      48 apples.remove(apple)

      49 elif apple[1]<-400:

      50 #蘋果掉出底線,沒接到,減分

      51 score-= 100

      52 apples.remove(apple)

      最后,在54-57行,由得分板畫筆寫出當(dāng)前得分,并刷新屏幕呈現(xiàn)內(nèi)容,最后按幀率停頓相應(yīng)時(shí)間。

      54 board.clear()

      55 board.write(f'SCORE: {score}',font=('SYSTEM', 40,'normal'))

      56 turtle.update()

      57 time.sleep(1/FPS)

      【因篇幅所限,以下創(chuàng)意編程實(shí)例中的“程序代碼分析”部分,請?jiān)L問雜志官網(wǎng)閱讀?!?/p>

      數(shù)學(xué)對象可視化:玫瑰曲線

      本作品通過玫瑰曲線的數(shù)學(xué)定義,使用turtle庫繪制出來。通過改變代碼內(nèi)參數(shù)可繪制不同的玫瑰曲線。程序運(yùn)行結(jié)果如圖2。

      turtle功能

      本作品涉及的turtle功能有2個(gè)。

      第1個(gè)是通過pencolor與pensize函數(shù)設(shè)置畫筆顏色與大小,此外還有fillcolor設(shè)

      置填充色,color同時(shí)設(shè)置畫筆色與填充色,shapesize設(shè)置畫筆形狀大小等函數(shù)。例如程序10-11行。

      10 rose.pencolor('red')

      11 rose.pensize(7)

      第2個(gè)是設(shè)置動(dòng)畫移動(dòng)速度,如第12行設(shè)置其為最快。

      12 rose.speed('fastest')

      數(shù)學(xué)財(cái)象可視化:分形Koch雪花

      本作品通過科赫曲線的定義,將3條科赫曲線繪制成為雪花形狀的分形進(jìn)行呈現(xiàn)。程序運(yùn)行效果如圖3。

      turtle功能

      本作品涉及到的turtle模塊功能主要有2個(gè)。

      第1個(gè)是取消動(dòng)畫效果與手動(dòng)更新。

      3 turtle.tracer(0)#取消動(dòng)畫加快繪圖速度

      35 turtle.update()#與tracer配合使用

      第2個(gè)是turtle中的顏色系統(tǒng),不僅可以指定RGB值設(shè)置顏色,也包括很多由顏色名稱預(yù)置的顏色,如"sky blue"與"snow";此外,可以通過bgcolor設(shè)置畫布顏色,以及begin_fill與end_fill填充多邊形內(nèi)部。

      4 turtle.bgcolor('sky blue')

      26

      snow.flllcolor('snow')

      27 snow.begin_fill()

      數(shù)學(xué)對象可視化:蒙特卡洛法求圓周率

      本作品模擬了經(jīng)典的平面授點(diǎn)求圓周率的過程,將投點(diǎn)的過程與相應(yīng)的估算圓周率通過turtle可視化為動(dòng)畫。程序運(yùn)行效果如圖4。

      turtle功能

      本作品涉及到的turtle模塊功能主要有4個(gè)。

      首先是繪圖加速功能,通過turtle.tracer(0)關(guān)閉動(dòng)畫效果,輔以手動(dòng)的turtle。update()更新畫面。

      3

      turtle.tracer(0)

      42

      #刷新屏幕

      43

      turtle.update()

      其次是移動(dòng)系統(tǒng),包括坐標(biāo)移動(dòng)函數(shù)goto,前進(jìn)轉(zhuǎn)向等控制方式forward. left等,以及預(yù)定義的軌跡移動(dòng),如circle函數(shù)。

      14 t.goto(0, -R)

      15 t.pendown()

      16 t.circle(R)

      17 for i in range(4):

      18

      t.forward(R)

      19

      t.left(90)

      20

      t.forward(R)

      21 t.penup()

      第3個(gè)是dot畫點(diǎn)的功能,可以輸入?yún)?shù)指定點(diǎn)大小與顏色。

      29 if x **2+y**2<=R**2:

      30 n+=1

      31 t.dot(3,'red')

      32 else:

      33 t.dont(.,'black')

      最后是write繪制文字的功能。

      38

      #顯示文字

      39

      label.clear()

      40

      label.write(f'pi~={pi: .6f}({n:7):{m 6}),font=FONT)

      物理仿真:拋物和碰撞

      本作品通過歐拉法逐幀模擬了一個(gè)小球受到重力與空氣阻尼(正比于速度)作用,進(jìn)行斜拋運(yùn)動(dòng),并在墻面與地面發(fā)生彈性碰撞的現(xiàn)象。通過turtle庫可視化了墻面與地面的位置,以及小球的運(yùn)動(dòng)路線,并且保留繪制了小球從發(fā)射到減速停止的運(yùn)動(dòng)軌跡。程序運(yùn)行效果如圖5。

      turtle功能

      本作品涉及到的turtle功能主要有3個(gè)。

      第1個(gè)是繪制加速和千動(dòng)更新畫面。

      3

      turtle.tracer(0)

      42

      turtle.update()

      第2個(gè)是繪制路徑的基本功能。

      14 #繪制地面和墻

      15 ball.pencolor('blue')

      16 ball.penup()

      17

      ball.goto(-500,GROUND_Y)

      18 ball.pendown()

      19

      ball.goto(WALL_X,GROUND_Y)

      20 ball.goto(WALL_X,500)

      第3個(gè)是更改形狀與形狀大小。

      12

      ball = turtle.Turtle ('circle')

      13 ball.shapesize(R / 10)

      地球空間信息可視化:地圖繪制

      本作品結(jié)合了shapefile庫(通過pip install pyshp安裝)的功能,讀取ESRI Shapefile (shp)地圖矢量圖文件,并使用turtle庫將其繪制出來。程序運(yùn)行效果如圖6。

      turtle功能

      本作品涉及的turtle功能有3個(gè)。

      第1個(gè)是海龜繪圖加速功能。

      1

      import turtle, random

      2

      import shapefile#需要安裝shapefile模塊,讀取

      4 turtle.tracer(0) #海龜加速,無動(dòng)畫

      47 turtle.update()

      第2個(gè)是turtle畫布的設(shè)置,包括第17行設(shè)置窗口寬高,與第21行謾置坐標(biāo)系。

      17 turtle.setup(w+20,h+30)

      18

      19 #將海龜坐標(biāo)系設(shè)置為與地圖坐標(biāo)相同

      20

      #turtle. setworldcoordinates (layer.bbox[0], layer.bbox[l], layer.bbox[2], layer bbox[3])

      21

      turtle. setworldcoordinates( *layer. bbox)

      第3個(gè)是多邊形的繪制與上色,turtle中要繪制復(fù)雜邊界的區(qū)域,并對其內(nèi)部進(jìn)行上色時(shí),使用begin_fill與end_fill函數(shù)標(biāo)記區(qū)域邊界的起止,在落筆前調(diào)用beginfill()并在結(jié)束繪制后調(diào)用end_fill()就會(huì)根據(jù)畫筆當(dāng)前通過color或fillcolor函數(shù)設(shè)置的填充顏色對其間經(jīng)過的區(qū)域進(jìn)行上色。如代碼中32-43行。

      32 for xy in f.shape.points:

      33 map_pen.goto(xy)

      34 if new_polygon :

      35

      start xy

      36 map_pen.pendown()

      37 map_pen.fillcolor(random. choice(colors))

      38 map_pen.begin_fill()

      39 new_polygon = False

      40 elif xy == start:

      41 map_pen.endjll()

      42 map_pen.penup()

      43 new_polygon = True

      生物學(xué)仿真:標(biāo)記重捕法

      櫟記重捕法是生物學(xué)上用于研究一個(gè)地區(qū)種群數(shù)量的方法,通過捕捉少量的個(gè)體進(jìn)行標(biāo)記并放回,一段時(shí)間后重新捕捉,并通過重捕數(shù)、重捕的標(biāo)記數(shù)與標(biāo)記總數(shù)估算出整個(gè)種群的數(shù)量。本作品通過turtle可視化了標(biāo)記重捕法中標(biāo)記、放回、重捕的動(dòng)態(tài)過程,并且即時(shí)地進(jìn)行數(shù)量估算,與實(shí)際數(shù)量進(jìn)行對比,將估算公式與結(jié)果以文字形式輸出。程序運(yùn)行截圖如圖7。

      turtle功能

      本作品涉及到的turtle模塊功能主要有4個(gè)。

      首先是繪圖加速功能,通過turtletracer(0)關(guān)閉動(dòng)畫效果,輔以手動(dòng)的turtle.tracer(0)關(guān)閉動(dòng)畫效果,輔以手動(dòng)的turtle.update()更新畫面。

      4

      turtle.tracer(0)

      75

      turtle.update()

      其次是基礎(chǔ)的坐標(biāo)移動(dòng)與畫線功能。

      27

      for x in SIZEC, SIZEP:

      28

      tt.goto(-x, x)

      29

      tt.pendown()

      30

      tt.goto(-x, -x)

      31

      tt.goto(x, -x)

      32

      tt.goto(x, x)

      33

      tt.goto(-x, x)

      34

      tt.penup()

      第3個(gè)是dot畫點(diǎn)的功能。

      59

      #繪制

      60

      t_dot.goto(pos)

      61

      t_dot.dot()

      最后是write繪制文字的功能。

      71

      t_text.clear()

      72

      t_text.write(

      73

      'Actual: %\nEstimated: %s= %s'%(N, n_calc, formula), font=FON)

      Python語言是一種語法簡潔、功能強(qiáng)大而又對初學(xué)者友好的通用型編程語言,在標(biāo)準(zhǔn)的Python語言發(fā)行版中,內(nèi)置了入門快、表現(xiàn)力強(qiáng)的turtle模塊,讓初學(xué)者通過幾行代碼就能繪出精美的圖形,再通過簡單的邏輯即可進(jìn)行鍵盤鼠標(biāo)的交互。Python語言及turtle模塊的組合非常適合初學(xué)者進(jìn)行創(chuàng)意編程的起點(diǎn)和創(chuàng)作工具,本文展示了藝術(shù)化的數(shù)字圖形之外,在基礎(chǔ)教育中各學(xué)科創(chuàng)意編程的實(shí)例,希望以此拋磚引玉,讀者們可以創(chuàng)作出更多面向科學(xué)探索的創(chuàng)意編程作品。

      猜你喜歡
      海龜鼠標(biāo)形狀
      挖藕 假如悲傷有形狀……
      Progress in Neural NLP: Modeling, Learning, and Reasoning
      Engineering(2020年3期)2020-09-14 03:42:00
      海龜
      你的形狀
      可怕:一塊塑料便可“殺死”一只海龜
      海龜
      海龜
      看到的是什么形狀
      45歲的鼠標(biāo)
      心的形狀
      杭锦后旗| 扬中市| 乐都县| 陵川县| 出国| 南昌县| 三台县| 淮安市| 连州市| 翁源县| 西乡县| 章丘市| 色达县| 浪卡子县| 五指山市| 剑川县| 新余市| 曲阜市| 古丈县| 内江市| 湖南省| 京山县| 宜黄县| 枞阳县| 大丰市| 米泉市| 商都县| 阿拉善盟| 综艺| 紫金县| 承德市| 会泽县| 湘阴县| 哈尔滨市| 阳城县| 广丰县| 万全县| 长乐市| 深泽县| 阳西县| 南充市|