Scratch 3 遊戲:貪吃蛇(Snake Game)

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

貪吃蛇遊戲的遊戲規則:
  1. 蛇不斷地往前進。
  2. 用鍵盤上、下、左、右來控制蛇前進的方向。
  3. 吃到食物時,蛇尾會變長。
  4. 碰到牆壁或蛇尾時,遊戲結束。
那要如何製作一個簡易的貪吃蛇遊戲呢?請看下圖:

上圖中紅色為蛇頭,紫色為蛇的尾巴,尾巴一開始會在(5, M)的位置,當蛇頭由(2, E)往(2, D)移動時,程式只需要把蛇尾搬到(2, E)的位置就行了(也就是蛇頭上未移動前的位置),這樣就可以製造出蛇在移動的效果了。而此觀念剛好可以用鏈結串列(Linked list)來實作

根據「阿玉Scratch作品集:貪吃蛇」以Scratch來實現可以使用兩種方式:
  1. 畫筆。
  2. 分身。

使用畫筆時,遊戲開始後,蛇尾會一直增加。
使用分身的話,就可以實作類似上面鏈結串列的方法。
於是筆者自己做了一個https://scratch.mit.edu/projects/205043655/


製作步驟
步驟一:
新增兩個角色:「蛇」與「Apple」

角色「蛇」會有兩個造型:「頭」與「身體」

步驟二:角色「蛇」程式積木




步驟三:角色「Apple」程式積木


好,那在Scratch中使用分身的方式來製作貪吃蛇時,需要注意什麼那些事呢?





家用工作桌組裝

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

最近筆者坐著的時間太長了,所以購入哈特氣壓無段式升降站立桌來試試,本篇介紹筆者的組裝紀錄與心得。

組出來的成果如下圖:

收到的包裝盒:

零件與說明書

說明書寫得很詳細,有附轉動六角螺絲的工具,但需額外準備一隻十字螺絲起子

步驟一:從桌面背面柱子組起,未組好前如下圖

 此步驟的說明書


組好後

步驟二:桌腳的柱子組裝,未組好前如下圖

此步驟的說明書

組好後


步驟三:將桌面與桌腳組合,此步驟的說明書

此步驟最好有兩人以上來安裝,這樣子會比較容易將桌面的柱子對齊桌腳的柱子。

組好後

基本上這套的組裝方式不難,但千萬別用電動螺絲起子來安裝,以免損壞結合處的結構

代數:年齡問題

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

問題:「五年前小明的年齡是哥哥的1/3,現在小明的年齡是哥哥的1/2,請問小明現在幾歲?」

解法:
假設小名現在x歲,哥哥為y歲。

五年前小明的年齡是哥哥的1/3 ==> 可列出底下式子(1):\[\Large x - 5 = \frac{y}{3} \]

現在小明的年齡是哥哥的1/2 ==> 可列出底下式子(2):\[\Large x = \frac{y}{2} \]

將式子(2)帶入式子(1)得到式子(3):\[\Large\frac{y}{2} - 5 = \frac{y}{3} \]

式子(3)可得到\[\Large y = 20 \]

帶入式子(2)得到\[\Large x = 10 \]

所以小名現在為十歲。

MIT App Inventor 2 Spinner 下拉選單範例

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

如何設計Android手機遙控Otto中,筆者用了Button元件來示範,但若跳舞的指令一直增加時,就要一直增加按鈕元件,若指令有二十幾個時,版面會不好看,那有沒有比較容易一點的方式?

本文將使用Spinner元件來簡化這個問題,首先假設有四個跳舞指令如下:

索引Otto指令名稱Otto指令
1抖左腳a
2抖右腳b
3抬左腳c
4抬右腳d


於是程式用了兩個清單(list),一個是指令名稱,一個是指令本身:

把指令名稱指定給Spinner選單,若使用者選擇抬左腳, 抬左腳指令名稱清單(上圖的左邊)的索引(位置)是3,對應到指令清單(上圖的右邊)會找到c這個指令。


範例下載處(註:只能供APP Invetor的範例,mBlock部分可參考如何設計Android手機遙控Otto)

用 Corona SDK 寫遊戲

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

Corona SDK 下載
https://coronalabs.com/products/corona-sdk/,需註冊帳號才能下載。Corona SDK為跨平台的開發工具,可用來設計手機與桌上電腦程式。Corona 用的語言是Lua,底下網址提供線上Demo
http://www.lua.org/demo.html

安裝好 Corona SDK後,必須以註冊好的帳戶登入:

登入後,可看到底下畫面,選擇 New Project:

輸入程式名稱並選擇Blank專案:

此時Corona SDK會開啟專案資料夾:

同時會詢問用哪個軟體開始main.lua檔案,筆者是用Visual Studio Code來開啟:

在開始寫程式前,可以在Visual Studio Code裡安裝Corona Tools

在此先以官方提供的BalloonTap範例來講解Corona SDK的遊戲設計觀念,圖檔說明如下:
檔案名稱大小 (寬×高)用途
background.png360 × 570背景圖。
platform.png300 × 50讓氣球停止的平台。
balloon.png112 × 112氣球。
而在程式方面,分為底下步驟來處理:
  1. 讀取背景圖
  2. 讀取平台圖
  3. 讀取氣球圖
  4. 建立物理模擬
  5. 事件處理
  6. 計分

讀取背景圖

程式碼如下:
local background = display.newImageRect( "background.png", 360, 570 )
background.x = display.contentCenterX
background.y = display.contentCenterY

程式碼第一行讀取background.png檔案,結果如下圖,背景沒有填滿整個視窗畫面。
那要怎麼讓背景圖填滿畫面呢?程式碼第二、三行可以幫我們達成這件事:

讀取平台圖

程式碼如下:
local platform = display.newImageRect( "platform.png", 300, 50 )
platform.x = display.contentCenterX
platform.y = display.contentHeight-50

這和讀取背景圖是一樣的觀念,但是我們要將平台往上移動位置,所以就將平台的y座標減掉50,這是因為Corona SDK的座標系統的y座標向上是遞減的。結果如下圖:

讀取氣球圖

程式碼如下:
local balloon = display.newImageRect( "balloon.png", 112, 112 )
balloon.x = display.contentCenterX
balloon.y = display.contentCenterY

此外也可以設定圖片的透明度:
balloon.alpha = 0.2

alpha值越小圖片越透明,結果如下圖:

建立物理模擬

程式碼如下:
local physics = require( "physics" )
physics.start()
physics.addBody( platform, "static" )
physics.addBody( balloon, "dynamic", { radius=56, bounce=0.3 } )

程式碼第一、二行為使用Box2D物理引擎,第三行讓平台不會受物理引擎的影響,第四行讓氣球碰到平台時會彈起來,bounce的值越大,氣球碰到平台彈回的高度就越高。

結果如下:

事件處理

要讓使用者在氣球上點一下時,氣球會往上飛。程式需要處理tap這個事件,以及對應的函式,所以程式碼會類似下面的片段程式碼:
local function pushBalloon()
balloon:applyLinearImpulse( 0, -0.75, balloon.x, balloon.y )
end
balloon:addEventListener( "tap", pushBalloon )

applyLinearImpulse函式的說明請參考:https://docs.coronalabs.com/api/type/Body/applyLinearImpulse.html

結果如下:

計分

使用一個變數來計分,將此變數放在主程式main.lua的第一行。
local score = 0

增加顯示分數的文字widget,須放在讀取背景圖的後面,以免文字被背景圖給覆蓋。
local scoreText = display.newText( score, display.contentCenterX, 20, native.systemFont, 40 )

修改pushBalloon函式,在此筆者是用亂數來設定每一次所增加分數。
local function pushBalloon()
balloon:applyLinearImpulse( 0, -0.75, balloon.x, balloon.y )
score = score + math.random (5)
scoreText.text = score
end

結果如下:


完整程式碼:

參考資料:
[1] https://docs.coronalabs.com/guide/programming/01/index.html

物聯網 NodeMCU 範例:以網頁控制 LED 燈

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

本文將使用有聯網能力的 NodeMcu來實作一個用網頁上的按鈕來控制 LED 燈,參考的資料官網的教學影片:

所需軟體:
  1. Arduino IDE
  2. ESP8266 core for Arduino
  3. TUNIOT
此部分請參考本部落格文章:【物聯網 NodeMCU 開發環境建立】來建立環境。

硬體材料:
  1. NodeMCU x 1
  2. Breadboard x 1
  3. 任意顏色LED x 2
  4. 電阻 Resistor 330 ohm x 2
  5. 麵包板 Breadboard x 1
硬體電路:
  • 一顆LED的長腳接 NodeMCU D1
  • 一顆LED的長腳接 NodeMCU D2
  • LED的短腳接 NodeMCU GND

完成圖:


TUNIOT積木:







成果影片:



如何設計Android手機遙控Otto

Otto機器人動作之程式碼分析後,並了解Otto的程式碼概念後,我們就可以著手以mBlock來設計所有的舞步,並搭配藍牙無線技術,讓Android手機可以來控制自己設計出來的Otto動作,而本文將要說明如何做到這些目標。會分成底下幾個部分來說明:

  • Otto的mBlock舞步程式設計
  • Otto的mBlock藍牙程式設計
  • MIT App Inventor程式設計

先使用MIT App Inventor設計Android手機程式,在著手設計mBlock程式;或是先設計mBlock程式,在設計Android手機程式,都是可行的流程。不過筆者比較習慣先從Otto本身的mBlock程式設計開始,而在設計之前有件事要先想好:「手機App與Arduino的溝通方式。」

本文會使用藍牙當成Arduino與Android手機溝通的媒體,如上面投影片提到的所用的文字語言不一樣,雙方可能也無法順利溝通。因為是手機要來控制Otto機器人,那麼手機就會先發送訊息給Otto,Otto收到訊息後不見得會做預期的動作,所以要先定義好兩者的溝通方式。筆者訊息的設計方式為
手機端傳送小寫字母 s 到 otto,otto收到小寫字母 s 後做抖右腳的動作。
小寫字母 s訊息傳送過程如下圖:

手機的藍牙會先送給Otto上的藍牙模組,藍牙模組再透過TX/RX兩個腳位與Nano通訊。

mBlock 積木設計

在mBlock裡,可以使用<串口可讀取字節數><串口讀取一個字節>兩個積木來取得藍牙模組送來的訊息。下圖中的馬達歸位與抖右腳為自訂積木,抖右腳可參考筆者Otto機器人動作之程式碼分析一文,而馬達歸位就是將四個Servo的角度設定為90度。(注意:此部分不需要將藍牙模組接到Nano上。)


接著可以使用 Arduino IDE 中的序列埠監控視窗(Serial Monitor)工具來測試 mBlock 的程式,而mBlock的串口通訊預設速率為115200

此時,Otto要抖右腳三次才算正常,這時可以把藍牙模組接到Nano上。接著可進行Android手機程式設計。

MIT App Inventor積木設計

在MIT App Inventor部分,筆者使用到底下幾個積木功能:


以上幾個積木請參考各自的連結說明。筆者的版面配置如下圖:

此App的積木簡要說明如下:
Android手機是透過BluetoothClient 藍牙用戶端的 SendText(text text) 積木送訊息給Otto上的藍牙模組,也就是上圖中的 call Otto 藍牙客戶端連線.SentText積木


本文的mBlock程式範例與MIT App Inventor範例皆可在此下載

成果影片:

使用Sonic Pi 創作音樂(Creating Music with Sonic Pi)

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

介紹

Sonic Pi 官網:http://sonic-pi.net/。Sonic Pi是一套以類似Ruby的程式語言(Ruby-based)來製作音樂並可錄製成*.wav檔。Sonic Pi除可運行於Raspberry Pi上,也可以運行在其他系統:

而且又是免費下載,筆者就安裝起來玩玩看,官網也有線上可以播放的音樂。


操作介面



播放音樂

首先,可以使用 play 這個指令,此指令格式如下:
1
2
play 數字
數字代表著音符。
音符說明可參考此網頁:
http://computermusicresource.com/midikeys.html

在程式區輸入,試著改變70這個數字,例如85、96、50等任意數字。
1
play 70

接著一次用多個play指令看看有什麼不一樣:
1
2
3
play 62
play 73
play 84

在每個音符(tone)之間暫停一秒:
1
2
3
4
5
play 62
sleep 1
play 73
sleep 1
play 84

至此可以用play 數字的指令來製作出一些音樂,但要查樂譜所對應的音符數字是有點麻煩,所以可用底下的指令:
play 音符名稱

例如github上的小星星就是用play 音符名稱指令來完成的,對創作音樂有興趣的人可以試試這套軟體。

進一步學習資源
http://www.sonicpiliveandcoding.com/

棋盤擺放問題

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。


西洋棋是個8x8的棋盤,總共有64個格子,若要在這個棋盤上放上任意數量的城堡並且符合下面三個條件之城堡最多個數為何?

  1. 一行最多只能有4個城堡同時存在。
  2. 一列最多只能有4個城堡同時存在。
  3. 對角線最多只能有4個城堡同時存在。

此三點請參考下面的圖形說明:






答案是能放32個城堡。

那麼城堡要怎麼擺才能放到32個?底下為筆者想出來的答案:



那麼還有其他的解法嗎?

本文的棋盤圖檔事由此網址https://lichess.org/editor所產生。