<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                >大部分人提起兒童編程,就會想到Scratch,然而當兒童升入中學,學習什么語言比較合適呢?我認為,Python是未來的方向,為此我將會把一些經典的Scratch案例用Python重新實現,拋磚引玉,希望能給大家帶來一定的啟發。我堅信,未來中學的編程教育,Python一定會有自己的一席之地。 作者:少兒創客幫 轉載請注明作者、出處 ## 概述 相比于簡化了編程的Scratch,python要涉及到更多細節要處理,是Scratch沒有講清楚的那一部分,對于Python程序,教師在實際教學中可以自己封裝好一些涉及到細節函數讓學生調用,然后等學生掌握整體之后講解細節的實現,我認為這是一種合適的教學策略。 在用Python實現Scratch項目的過程中,為了避免大量繁瑣的細節工作,我采用pygame這個庫來簡化實現,在《父與子的編程之旅:與小卡特一起學編程》一書中也采用pygame來實現一些比較有意思的東西。 ## Pygame ![Pygame](http://upload-images.jianshu.io/upload_images/1108512-0bc54a56ccc51fb1.gif?imageMogr2/auto-orient/strip) >要讓圖形(和聲音)在你計算機上顯示,是比較復雜的一項工作,涉及到不同的操作系統和顯卡,還需要大量的底層代碼(然而初中生很難理解這些底層代碼),所我們需要用pygame模塊來提供幫助,讓問題變得更簡單。 要讓游戲在不同的計算機和操作系統上工作,所需要的圖形和其他內容都可以用pygame來創建,而不必了解每個系統的繁瑣細節。Pygame是免費的。 ——《父與子的編程之旅:與小卡特一起學編程》 >Pygame參考教程,[Pygame系列教程](http://eyehere.net/2011/python-pygame-novice-professional-1/)建議閱讀全文之后學習 ## 讓小貓動起來 下面我們來做一個讓小貓動起來的例子 ### Scratch實現 為了便于大家用手機閱讀,Scratch程序實現的時候我采用與Scratch類似的編程貓,這樣大家可以單擊鏈接直接在手機上觀看效果;但是截圖仍然用Scratch本身的截圖。 ![Scratch程序實現](http://upload-images.jianshu.io/upload_images/1108512-f9fc092c34da7ba6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 程序代碼,這個Scratch里面可以說最簡單的一個例子,我們用了4個代碼塊實現了讓小貓動起來,并且在碰到墻壁的時候反彈。下面我們就用python實現。 [編程貓實現的小貓動起來效果](https://www.codemao.cn/my#269565) ### 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的窗口正式工作](http://upload-images.jianshu.io/upload_images/1108512-0f0069b3fbc59532.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 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下的程序截圖](http://upload-images.jianshu.io/upload_images/1108512-782a4ce1139598d3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![程序運行截圖](http://upload-images.jianshu.io/upload_images/1108512-4f93d522844243bf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 那么現在舞臺(窗口)中啥都沒有,我們來加載圖片。 #### 添加角色 為了添加角色,我們需要一張小貓的圖片,同時要求是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函數的作用](http://upload-images.jianshu.io/upload_images/1108512-102e8c8f7c9610c3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) >python可以在交互式命令行下用help函數查看函數的功能,比如flip函數的作用就是把顯示Surface更新到屏幕,可以簡單的理解成一次性的更新窗口內容的顯示 ![加載小貓角色](http://upload-images.jianshu.io/upload_images/1108512-f4c482366ba89b2f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![加載小貓角色](http://upload-images.jianshu.io/upload_images/1108512-3a17f574976bffee.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 我們可以看到小貓被成功的加載到了舞臺 ##### 讓小貓動起來 我們已經把小貓角色加載到了舞臺(窗口),那么我們就讓小貓動起來,沒錯我們要做一些計算機動畫,計算機動畫就是把圖像(像素組)從一個位置不斷的移動到另外一個位置。 在利用計算機圖形做動畫的時候,移動一個東西需要兩個步驟: * 在新的位置上畫出圖形 * 把原來的圖形擦掉 實際上《父與子的編程之旅:跟小卡特學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() ``` ![詭異的效果](http://upload-images.jianshu.io/upload_images/1108512-b14a3af5c6fd5836.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 之所以會形成上面詭異的效果,是因為前面提到用計算機做動畫的時候,需要在新的位置上繪制出圖形,然后把原來的擦掉,我沒有擦掉,所以就會出現這種殘影的效果,那么怎么辦嗯?只需要改一個地方 把 ``` cat = pygame.image.load("cat.png") ``` 改成 ``` cat = pygame.image.load("cat.png").convert() ``` 就正常了 ![convert把圖像轉變成一個面](http://upload-images.jianshu.io/upload_images/1108512-632ee0374a7adb1e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![正常移動的貓](http://upload-images.jianshu.io/upload_images/1108512-eb392ce80ae239e5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) >小結:上面實現了會移動的貓 #### 小貓碰到墻壁就反彈 碰到墻壁就反彈其實很簡單,如果小貓的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() ``` ![小貓動起來](http://upload-images.jianshu.io/upload_images/1108512-40ef8cea8434b3c7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) >以上就是用Python實現會動的貓的過程,這個只是個簡單的例子,后面還會有系列文章來講解,通過學習pygame實現會動的小貓,學生能夠了解計算機動畫的原理,從而自己繪制動畫。利用convert函數,可以簡化計算機動畫的實現,如果有心的讀者運行代碼后會發現一個小的bug,這里先賣個關子,這個跟pygame的原理有關。接下來我會依次用pygame來實現Scratch的各個代碼塊,便于讀者自行編寫動畫。 通過這篇文章探索用python實現Scratch一些程序的可能,同時程序涉及了更多的細節,但是這些世界其實又很容易理解,進一步加深學生對于計算機動畫的理解,了解計算機背后的原理,激發學生的興趣。 后面將陸續退出: * pygame中的繪圖 * pygame中的大小控制 * 按鍵控制舞臺角色移動
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看