從Scratch到Python——python turtle 一種比pygame更加簡潔的實現


從Scratch到Python——python turtle

一種比pygame更加簡潔的實現

現在很多學校都開設了Scratch課程,學生可以利用Scratch創作豐富的作品,然而Scratch之后的圖形化編程語言學習什么內容,是一線老師和Scratch官方共同關注的問題。
轉載請注明出處:http://www.jianshu.com/p/99729c45c839

就目前來看可以選擇的有C語言、Logo、Python和SmallBasic。就我個人而言是傾向於Python的。因為C語言雖然經典,但是學了很久也不能做出可視的成型的作品,極大的降低了孩子們的積極性;Logo語言僅僅是一門玩具型的編程語言;Smallbasic和Logo語言的情況類似;而Python語言已經做為編程入門語言得到了廣泛的任何,相比於c語言,入門簡單,而且Python可以用很少的代碼完成復雜的工作,在以后的工作學習中都會用到,對於一般人來說C語言是屠龍之技,即便是在大學里的C語言通修課也是如此,而且目前部分大學的已經開始慢慢的把通識課的入門編程語言改成Python了。畢竟人生苦短我用Python呢。

但是Python作為一種文本編程語言,對於小學生來說還是有一定難度的,所以從Scratch到Python肯定需要一個過渡,我對於這個問題思考了很長時間,我覺得在學習了Scratch基礎上,結合Scratch來學習Python是合適的。

學習任何一種編程語言,首先要了解諸如變量、循環、分支判斷這些基本的程序結構,經過Scratch的學習,學生對於這些概念基本掌握,在學習Python的時候,用Scratch來描述程序,作為思維可視化的工具,有助於學生快速的掌握Python。

閑言少敘,下面我們就開始Python的學習,話說如果一開始就講Python的變量肯定會被吐槽,全部是文本,黑咕隆咚的窗口,沒什么意思啊,那么們就從窗口開始。

安裝Python

(從官網下載Python 3.6如果是xp下載3.5,然后看下基本的Python安裝和使用介紹,啟動IDLE)

啟動IDLE

安裝python之后,開始菜單,python,IDLE,就可以啟動了。

神奇的小烏龜

在正式學習Python之前我們先來體驗下用Python來繪制圖形,如果你看不懂也沒有關系,先照着教程把代碼查下來就是了,就像是聯系書法開始肯定有個臨摹的階段,我們先體驗,后面詳細講解為什么這么做

下面我們隆重的請我們的Python小烏龜入場。

首先在IDLE的代碼編輯器輸入以下代碼

forward90.png

然后單擊運行

runmenu.png

解釋

我們來解釋下這段代碼

from turtle import *

是從Python的庫中導入turtle這個類,當導入的時候,其實小烏龜已經存在了,只是我們看不到而已。當你通過

forward(90)

命令讓小烏龜前進90個單位的時候憊懶的小烏龜才出現在舞台上,forward的意思是前進,forward后面括號里的是參數,描述烏龜前進的距離,這是一個固定的寫法。

90rst.png
是不是覺得眼熟呢,在Scratch,是不是有點像Scratch里面讓小貓動起來呢?

mblock90.png

在turtle里面,默認畫筆是落下的,所以小箭頭移動的時候就會畫圖,我們記得scratch里面有一個抬筆積木,在turtle也有,不過是

penup()

penupf.png

from turtle import *

# 神龜前進100單位
forward(90)

penup()
# 抬筆
forward(90)

首先我通過penup()命令抬筆,然后利用goto(10,90)命令讓小烏龜移動到(10,90)
其實這個時候,調用前面的向前移動forward命令也不會留下痕跡的

penupf.png

繪制正方形

下面我們來繪制一個正方形,首先我們用scratch來實現繪制正方形這個功能,我們用最簡單的順序命令來實現

Scratch程序繪制正方形

scratchqur.png

可以看到
+首先拖動綠旗模塊到舞台
+然后清空舞台
+落筆
+讓小企鵝前進90步,然后右轉90°,等1s鍾
+重復以上步驟四次
+抬筆,准備下一次繪圖
這是一個典型的繪制正方形的程序,采用了順序結構來編制程序,便於理解。

接下來我們用python中的turtle庫實現這個程序

Python版本的正方形繪制程序

pythonqur.png

from turtle import *

# 神龜前進100單位
forward(90)
right(90)

forward(90)
right(90)

forward(90)
right(90)

forward(90)
right(90)

看,雖然一個是圖形編程,一個是文本編程,但是都成功的繪制出了正方形。下面我繼續完善,我們知道在Scratch中是可以改變畫筆屬性的,比如畫筆粗細,畫筆的顏色等等,在python也是可以的,看下面的表格

- - -
Scratch代碼塊 Python命令 作用
pencolor() 設定畫筆顏色,用顏色選擇器選擇顏色
pencolor() Scratch通過數值,python通過顏色字符串設定顏色
pensize() 設定畫筆粗細

比如我們要畫一個邊框粗為4,顏色為紅色的正方形

Scratch版本

scratch4.png

Python版本的畫正方形

red4.png

代碼如下

from turtle import *

# 神龜前進100單位

pensize(4)
pencolor("red")

forward(90)
right(90)

forward(90)
right(90)

forward(90)
right(90)

forward(90)
right(90)

可以看到,我們用python里面的命令完成了與scratch相同的功能,是不是相當有趣呢?

變量

前面我們畫了一個邊長為90的正方形,如果我們想讓正方形的邊長是100怎么辦呢?我們先來看最原始的方法,那就是把scratch或者Python中代表邊長的數字90分別改成100:

100.png

你會發現這次不是正方形啊,哦,原來是我把最后一個右轉90°,也改成100,導致右轉了100°,你看,這樣一個個的修改不僅麻煩,而且容易出錯,怎么辦呢,我們用一個變量代表邊長。
變量是一個容器,里面存放着代表邊長的數字。

在Scratch中新建變量

經過前面多學習,大家已經掌握了在scratch中新建變量,下面我們新建一個代表邊長的變量side,然后把程序中代表邊長的100改成變量side

side2.png

然后我們改變side值,就可以輕松的繪制不同邊長的正方形了

在Python中新建變量

python是一種解釋語言,無需聲明就可以新建變量,新建變量只需要用下面的語法

side = 100

這樣就新建了一個side變量,代表100,這里的=等號的含義是,把右側100的值放到變量side中,side代表100.
我們看如何用python來實現用變量來代表數值繪制正方形

from turtle import *

# 神龜前進100單位

side = 100

pensize(4)
pencolor("red")

forward(side)
right(90)

forward(side)
right(90)

forward(side)
right(90)

forward(side)
right(90)

pyside.png

那么,親愛的朋友,你能夠新建一個angle變量,代替角度嗎?

重復循環

在日常生活中,我們經常會遇到一個枯燥而重復的事情,為了從這些勞動擺脫出來,人們發明機器以及機器人,代替人類完成這些枯燥重復的事情。與人類不同的是,計算機特別擅長做簡單重復的事情,效率和准確率比我們人類要高很多。通過合理的使用重復循環,我們可以大大提高程序的效率。

from turtle import *

forward(90)
right(90)

forward(90)
right(90)

forward(90)
right(90)

forward(90)
right(90)

仔細觀察以上代表,是不是,是不是感覺有很多地方是重復的呢?一般在計算機中超過三次重復就可以考慮使用循環來簡化代碼

在scratch中,控制積木分類中有重復積木:

loop1.png

下面我們利用scratch中的循環來簡化代碼

loop2.png

仔細觀察以上代碼,想一想在重復4次內部應該放入那些積木塊呢?這樣代碼是不是簡單了很多?

Python循環

python中的循環,需要用到for...each...語句,在這里會涉及到python一個非常有意思的地方,縮進語法

from turtle import *

for each in range(4):
    forward(90)
    right(90)

執行以上代碼,會發現,出現了一個正方形,需要注意的是,forward(90)以及right(90)語句比for縮進了4個空格,這也是python的特點之一,縮進語法,這是for的固定寫法,大家要知道,而且一定不要漏掉冒號哦。

更多類似

有人說,不是python turtle小烏龜嗎,為什么只有箭頭呢?scratch舞台上有各種各樣的角色,python turtle只有個箭頭是不是太寒酸了呢?turtle也可以多種多樣哦!
需要改變箭頭的形狀要用到shape()命令,下面我們來試一下

from turtle import *

shape('turtle')

for each in range(4):
    forward(90)
    right(90)

shape.png

有沒有覺得小烏龜太小了?我們來改變小烏龜的大小

from turtle import *

shape('turtle')
shapesize(5,5,5)

for each in range(4):
    forward(90)
    right(90)

運行以上代碼,是不是發現小烏龜變大了呢?

shapesize.png

當然python turtle中小烏龜的形象不僅可以是小烏龜,箭頭,還是是圓和正方形。

小結:python urtle某種程度上跟logo小烏龜是比較類似的,肯定有人會疑問為什么不直接學習logo呢?因為logo基本上已經被淘汰了,我們最主要的目的還是學習python,python turtle以及結合scratch只是防止單純的學習python過於枯燥的弱點,當然真正的掌握了python以后就不會有這樣的感覺,基本上scratch大部分功能都可以用python turtle來實現,這樣就可以順利的幫助小孩子從scratch過渡到python。

先來看最經典的例子

在scratch教程中,一般開始都是先做一個小貓來回跑動的例子,來吸引小盆友,python turtle做這樣的例子其實很簡單的,我們先來看用scratch怎么做:

scratchmove.png

下面我們用python來實現,現在看不懂不要緊,看完后面的就能看懂了。

from turtle import *

shapesize(4,4,4)

penup()

x = 0

v = 5

while 1:
    goto(x, 0)
    x += v
    if x < -200:
        v = -v # 當箭頭到了左側邊界,讓x增加
    if x > 200:
        v = -v # 黨建頭到了右側邊界,讓x減少
    

以上代碼實現了箭頭來回走動,其實原理很簡單的v = 5
move10.png
的作用類似,是用來設定角色移動的速度,而與
bound.png
對應的則是以下代碼:

	if x < -200:
        v = -v
    if x > 200:
        v = -v

我來解釋下這段程序,首先導入必要的庫,然后利用shapesize()命令設置箭頭的大小,然后while循環的作用於scratch的重復類似,不停的執行以下代碼,首先讓箭頭移動到(0, 0)坐標,然后把x坐標增加步數v,然后判斷改變后的x坐標是否大於200,大於200則意味着箭頭超過了右側的邊界,那么x就應該向相反方向移動,這也就是scratch中的
bound.png
含義,本來向右移動是讓x坐標不斷的增加步數v,如果要向左移動,就要減去步數,所以當箭頭的橫坐標大於x的時候就讓x減去步數;同樣的當x的坐標比-200小時,意味着箭頭到了左側邊界,那么不再讓x坐標減去步數v,而是讓x坐標增加。

關於事件

在scratch中事件是很常用的功能,比如當鼠標被單擊的時候,角色說話:

scratchclick.png

其實小烏龜也是可以的,不過呢這里要用到函數的功能,不知道各位看官在Scratch里有沒有學習函數的功能呢,這里要介紹python里面函數的語法

def function_name():
    pass

可以看到,首先要有def關鍵字,然后空一格,然后是函數名,括號以及冒號,冒號是必不可少的內容!

from turtle import *

shape('turtle')

def sayhello(x, y):
    write('2007-2017高考十年')

onclick(sayhello)


gk10.png

運行上述代碼,會發現當你單擊小烏龜的時候,小烏龜會說出我們指定的話語,'2007-2017高考十年',有沒有很唏噓。
這里需要注意但是函數sayhello有兩個參數x,y分別代表小烏龜當前的橫縱坐標。同時onclick函數的參數,是一個函數名,這里面涉及到了回調,當然我們知道怎么一回事就可以了,當你希望被單擊的時候執行那個函數對應的功能呢,你就在onclick的參數里面寫上這個函數就可以了。

關於動作積木塊的類比

- - -
Scratch代碼塊 Python命令 作用
setx() 設定x坐標
sety() 設定y坐標
xcor();ycor() 獲取xy坐標


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM