文章出處

大部分人提起兒童編程,就會想到Scratch,然而當兒童升入中學,學習什么語言比較合適呢?我認為,Python是未來的方向,為此我將會把一些經典的Scratch案例用Python重新實現,拋磚引玉,希望能給大家帶來一定的啟發。我堅信,未來中學的編程教育,Python一定會有自己的一席之地。
作者:少兒創客幫
歡迎大家關注微信公眾號:少兒創客幫
轉載請注明作者、出處

概述

相比于簡化了編程的Scratch,python要涉及到更多細節要處理,是Scratch沒有講清楚的那一部分,對于Python程序,教師在實際教學中可以自己封裝好一些涉及到細節函數讓學生調用,然后等學生掌握整體之后講解細節的實現,我認為這是一種合適的教學策略。
在用Python實現Scratch項目的過程中,為了避免大量繁瑣的細節工作,我采用pygame這個庫來簡化實現,在《父與子的編程之旅:與小卡特一起學編程》一書中也采用pygame來實現一些比較有意思的東西。

Pygame

Pygame

要讓圖形(和聲音)在你計算機上顯示,是比較復雜的一項工作,涉及到不同的操作系統和顯卡,還需要大量的底層代碼(然而初中生很難理解這些底層代碼),所我們需要用pygame模塊來提供幫助,讓問題變得更簡單。
要讓游戲在不同的計算機和操作系統上工作,所需要的圖形和其他內容都可以用pygame來創建,而不必了解每個系統的繁瑣細節。Pygame是免費的。
——《父與子的編程之旅:與小卡特一起學編程》

Pygame參考教程,Pygame系列教程建議閱讀全文之后學習

讓小貓動起來

下面我們來做一個讓小貓動起來的例子

Scratch實現

為了便于大家用手機閱讀,Scratch程序實現的時候我采用與Scratch類似的編程貓,這樣大家可以單擊鏈接直接在手機上觀看效果;但是截圖仍然用Scratch本身的截圖。

Scratch程序實現
程序代碼,這個Scratch里面可以說最簡單的一個例子,我們用了4個代碼塊實現了讓小貓動起來,并且在碰到墻壁的時候反彈。下面我們就用python實現。
編程貓實現的小貓動起來效果

Python實現

在用Python的模塊Pygame實現小貓動起來之前,我們來分析這個程序,單擊綠旗,重復執行移動10步并且在碰到墻壁的時候反彈。我們需要解決的問題是:

  • 如何用Pygame創建舞臺
  • 如何在Pygame的舞臺上添加小貓角色
  • 如何用Pygame讓小貓動起來
  • 如何實現碰到墻壁就反彈,Scratch屏蔽了這部分細節,而我們要自己實現

用Pygame創建舞臺

#安裝Pygame,如果安裝了Python并且勾選安裝pip可以如下安裝Pygame
sudo pip install pygame

用Pygame創建舞臺實際上就是要創建一個窗口,就像我們平時打開應用程序都有窗口一樣,這個可以參考之前提供的教程,也可以如下:
如果要利用Pygame創建窗口,首先要導入pygame模塊

import pygame

然后初始化模塊

pygame.init()

如果把pygame看做是一個創建游戲的工廠,那么pygame.init()就好比告訴操作系統,我準備好生產游戲了,要開張了。
接下來就是要創建窗口了,如同工廠有不同的部門工種一樣,Pygame也有很多不同的模塊負責不同的功能

#導入pygame模塊
import pygame
#初始化pygame
pygame.init()
#創建舞臺,利用Pygame中的display模塊,來創建窗口
screen = pygame.display.set_mode((640,480),0,32)
#設置窗口標題
pygame.display.set_caption("從Scratch到Python")

這個時候大家運行就能得到一個窗口但是窗口一閃而過,那么我們就需要檢測是否關閉了窗口,我比較懶,所以放一張《父與子的編程之旅》書里的內容來解釋:

使Pygame的窗口正式工作

Pygame的作用是建立游戲,游戲本身不做任何事情,只是與玩家交互。
我們知道在Scratch中重復執行的事情比如移動10步是放到一個無限循環之中的,那么Pygame重也有一個這樣的無限循環,叫做事件循環(event loop),不斷檢測用戶在作什么,比如按鍵、移動鼠標或者關閉窗口,Pygame程序需要有個時間循環一直運行。我們的第一個Pygame中,沒有啟動時間循環,所以程序沒有正常運行。
可以用while循環讓程序一直運行,然后當單機關閉按鈕的時候讓程序退出:

#導入pygame模塊
import pygame
#初始化pygame
pygame.init()
#創建舞臺,利用Pygame中的display模塊,來創建窗口
screen = pygame.display.set_mode((640,480),0,32)
# 填充舞臺背景色為白色,利用rgb顏色
screen.fill([255,255,255])
#設置窗口標題
pygame.display.set_caption("從Scratch到Python")
while 1:
    for event in pygame.event.get():
    #這段程序大家可能比較費解,實際上是檢測quit事件,實際講課中讓學生直接模仿即可,時間足夠也可以講明白
        if event.type == pygame.QUIT:
            pygame.quit()

Sublime Text下的程序截圖

程序運行截圖

那么現在舞臺(窗口)中啥都沒有,我們來加載圖片。

添加角色

為了添加角色,我們需要一張小貓的圖片,同時要求是png圖片有alpha通道的。
Pygame可以很容的繪制點、線、面,但是如何利用從網上、拍照,圖像軟件創作的圖片呢?
最簡單的辦法就是利用image模塊的load函數加載圖片。

# 我的cat.png和cat.py文件在同一個文件夾下面
# 所以可以直接這樣加載圖片的
# laod函數加載圖片
cat = pygame.image.load("cat.png")
# blit函數的作用是把加載的圖片放到舞臺的(50,50)坐標的位置
screen.blit(cat,(50,50))
#然后更新舞臺顯示
pygame.display.flip()

Flip函數的作用

python可以在交互式命令行下用help函數查看函數的功能,比如flip函數的作用就是把顯示Surface更新到屏幕,可以簡單的理解成一次性的更新窗口內容的顯示

加載小貓角色

加載小貓角色

我們可以看到小貓被成功的加載到了舞臺

讓小貓動起來

我們已經把小貓角色加載到了舞臺(窗口),那么我們就讓小貓動起來,沒錯我們要做一些計算機動畫,計算機動畫就是把圖像(像素組)從一個位置不斷的移動到另外一個位置。
在利用計算機圖形做動畫的時候,移動一個東西需要兩個步驟:

  • 在新的位置上畫出圖形
  • 把原來的圖形擦掉

實際上《父與子的編程之旅:跟小卡特學Python》一書中給出的解決辦法并不是通俗易懂,我們在這里直接把讓小貓移動的代碼寫到while循環,用到的相關知識也少,這樣與Scratch也更加類似,即在每個循環里更新cat角色的位置,然后更新畫面,當然《卡特》這本書里更好的講解了計算機動畫的原理,不過我懶啊,所以就偷懶了:

import pygame
#初始化pygame
pygame.init()
#創建舞臺,利用Pygame中的display模塊,來創建窗口
screen = pygame.display.set_mode((640,480),0,32)
# 填充舞臺背景色為白色,利用rgb顏色
screen.fill([255,255,255])
#設置窗口標題
pygame.display.set_caption("從Scratch到Python")
cat = pygame.image.load("cat.png")
cat_x, cat_y = 0, 0
while 1:
    for event in pygame.event.get():
    #這段程序大家可能比較費解,實際上是檢測quit事件,
    #實際講課中讓學生直接模仿即可,時間足夠也可以講明白
        if event.type == pygame.QUIT:
            pygame.quit()
    screen.blit(cat,(cat_x,cat_y))
    cat_x += 1
    pygame.display.update()

詭異的效果
之所以會形成上面詭異的效果,是因為前面提到用計算機做動畫的時候,需要在新的位置上繪制出圖形,然后把原來的擦掉,我沒有擦掉,所以就會出現這種殘影的效果,那么怎么辦嗯?只需要改一個地方

cat = pygame.image.load("cat.png")

改成

cat = pygame.image.load("cat.png").convert()

就正常了

convert把圖像轉變成一個面

正常移動的貓

小結:上面實現了會移動的貓

小貓碰到墻壁就反彈

碰到墻壁就反彈其實很簡單,如果小貓的x坐標大于屏幕640,就讓他向左移動,如果小于0就向右移動

判斷小貓的坐標是否大于640
import pygame
#初始化pygame
pygame.init()
#創建舞臺,利用Pygame中的display模塊,來創建窗口
screen = pygame.display.set_mode((640,480),0,32)
# 填充舞臺背景色為白色,利用rgb顏色
screen.fill([255,255,255])
#設置窗口標題
pygame.display.set_caption("從Scratch到Python")
cat = pygame.image.load("cat.png").convert()
cat_x, cat_y = 0, 0 # 貓的坐標
h_direction = 1; # 水平方向
while 1:
    for event in pygame.event.get():
    #這段程序大家可能比較費解,實際上是檢測quit事件,
    #實際講課中讓學生直接模仿即可,時間足夠也可以講明白
        if event.type == pygame.QUIT:
            pygame.quit()
    screen.blit(cat,(cat_x,cat_y))
    cat_x += 0.5 * h_direction
   # 如果貓的坐標超出了640,就讓小貓反向
   # 如果貓的坐標小于了0,也讓小貓反向,這樣就實現了碰到墻壁反彈的效果
    if cat_x > 640:
        h_direction = -h_direction
    elif cat_x < 0:
        h_direction = -h_direction
    pygame.display.update()

小貓動起來

以上就是用Python實現會動的貓的過程,這個只是個簡單的例子,后面還會有系列文章來講解,通過學習pygame實現會動的小貓,學生能夠了解計算機動畫的原理,從而自己繪制動畫。利用convert函數,可以簡化計算機動畫的實現,如果有心的讀者運行代碼后會發現一個小的bug,這里先賣個關子,這個跟pygame的原理有關。接下來我會依次用pygame來實現Scratch的各個代碼塊,便于讀者自行編寫動畫。
通過這篇文章探索用python實現Scratch一些程序的可能,同時程序涉及了更多的細節,但是這些世界其實又很容易理解,進一步加深學生對于計算機動畫的理解,了解計算機背后的原理,激發學生的興趣。
后面將陸續退出:

  • pygame中的繪圖
  • pygame中的大小控制
  • 按鍵控制舞臺角色移動

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()