--- tags: 2022 iThome 鐵人賽 title: 10/6 Arcade再進化-虛擬鍵盤的妙用(4) AUTHOR: 蔡宇倫 --- ## 第四篇 虛擬鍵盤-如何妙用在遊戲中 ### 你想將你遊戲最棒的成就記錄下來嗎? >* 本篇將帶領大家透過```虛擬鍵盤```套用在遊戲中,讓```遊戲得分最高者```可以顯示在遊戲的成就上,並顯示其分數。 >* 本篇將用[**Chase The Pizza**](https://arcade.makecode.com/S16441-99761-07357-96738)專案來演示 <br> ## 成品效果 ![圖片](https://drive.google.com/u/0/uc?id=1WFaqQitLRMQmHmzg3VVsvKesStDDPLRT&export=download) <br> * ### 原先(破紀錄前) ![圖片](https://drive.google.com/u/0/uc?id=18WtOVr2V5jkblyHAs7qESPPpHqJZtKaf&export=download) <br> * ### 後來(破紀錄後) ![圖片](https://drive.google.com/u/0/uc?id=1A5o-CgXFsaTipdNDKU_aPqqvG6AcOxOF&export=download) ``` ``` --- ## 製作教學 ### 前置操作(非常重要!!): * 點選[**此處**](https://arcade.makecode.com/S16441-99761-07357-96738)後按下```edit code```即可下載並編輯此專案 * 複製```https://github.com/riknoll/arcade-custom-menu```來擴充功能 (&uarr;&uarr;&uarr;如何擴充功能? 在[**第三篇**](https://ithelp.ithome.com.tw/articles/10302290)這裡有教學) <br> --- <br> ### 使用積木 + Javascript 積木雖可讓我們能更簡單了解程式的內容,卻無法完整呈現我們想使用的功能,需要搭配Javascript來補積木編排的不足,因此本篇將會用**積木和 Javascript**兩部分來完成 <br> --- * ### Part1 : 積木部分 積木部分主要是先完成```選單功能```以及```紀錄最高分數``` <Br> 1.選擇擴展**BlockMenu中**的```on menu option selected```積木,並將```當啟動時```積木裡的所有積木移動到裡面 ![圖片](https://drive.google.com/u/0/uc?id=19OsyfM_AFPzAlac72rjWSTcDqItgssSW&export=download) --- 2.選擇擴展**BlockMenu中**的```show grid menu fullscreen with option``` 積木 放入到 ```當啟動時 ```積木中,並將fullsceen改成bottom half、grid改為list ,並在後面的陣列輸入```新遊戲、成就``` ![圖片](https://drive.google.com/u/0/uc?id=1m-cPfO-1m9xlKOSlnQhMUIPcLvxBogyT&export=download) --- 3.建立**3個變數**分別為```name、high、record```將```變數record設為0```積木放入到```當啟動時 ```積木,並將**資訊類別**中```最高得分```積木放入到```變數record設為0```積木的裡面 ![圖片](https://drive.google.com/u/0/uc?id=1LcEPabgryTJ8ESEZPPgvzOmmURo-_es2&export=download) --- 4.使用**資訊類別**中```當倒數結束```積木,然後在裡面將積木組合成```如果(得分>變數record)那麼變數record設為得分```,最後在```如果()那麼()```積木外放入**遊戲類別**中```遊戲結束 結果( )```積木,並在( )內放入**BlockMenu中**放入```is menu open```積木 ![圖片](https://drive.google.com/u/0/uc?id=1ymZkhQq55TGCsHIN7jtE4SmxhtFNyhIk&export=download) --- 5.在```on menu option selected```積木中放入積木並組合成```如果(option = 新遊戲)那麼( )```,並將原本在```on menu option selected```裡的所有積木移動到裡面 ![圖片](https://drive.google.com/u/0/uc?id=1dsE50-uG7AhZtrUO5hvX2_eiAb7vaZiz&export=download) --- 6.放入一組積木```如果(option = 成就)那麼( )```在```on menu option selected```積木中,並將**BlockMenu中**```close menu```積木放入到```如果( )那麼( )```的裡面。(**兩組積木都要放入**) ![圖片](https://drive.google.com/u/0/uc?id=1MOwtfiY9zqWwCP1Hex4XvKZMmyzPwvaz&export=download) --- 7.在```如果(option = 成就)那麼( )```積木中再放入一組積木```如果(A鍵被按住)那麼( )```,然後在裡面放入```show list menu bottom half with option (新遊戲) (成就)``` ![圖片](https://drive.google.com/u/0/uc?id=16t1OqD6yRmVbqIAbMsJQrqiA3aYj8T8U&export=download) --- 8.在```當角色sprite類別player重疊角色othersprite類別Food```積木中放入```變數high改變"1"```積木 ![圖片](https://drive.google.com/u/0/uc?id=1aWspKm-pLgL5x60MOxcrxQxgz6qA1o4o&export=download) &uarr;&uarr;&uarr;**積木部分已結束**&uarr;&uarr;&uarr; <br> --- * ### Part2 : Javascript部分 Javascript部分主要是完成```紀錄名字的功能``` <Br> --- 9.將```變數name```的文字初始為沒有值的,讓```變數high```每次遊戲開始時都會歸零 ```javascript= //定義初始變數值 let high = 0 let name: string = null // info.onCountdownEnd(function () { if (info.score() > record) { record = info.score() } game.over(blockMenu.isMenuOpen()) }) sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { record += 1 info.changeScoreBy(1) info.startCountdown(10) otherSprite.setPosition(randint(0, scene.screenWidth()), randint(0, scene.screenHeight())) }) blockMenu.onMenuOptionSelected(function (option, index) { if (option == "新遊戲") { blockMenu.closeMenu() scene.setBackgroundColor(7) smiley = sprites.create(img` . . . . 5 5 5 5 5 5 5 . . . . . . . 5 5 5 5 5 5 5 5 5 5 5 . . . . 5 5 5 5 5 5 5 5 5 5 5 5 5 . . . 5 5 5 5 5 5 5 5 5 5 5 5 5 . . 5 5 5 5 5 f 5 5 5 f 5 5 5 5 5 . 5 5 5 5 5 f 5 5 5 f 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 f 5 5 5 5 5 5 5 f 5 5 5 . . 5 5 5 f f 5 5 5 f f 5 5 5 . . . 5 5 5 5 5 f f f 5 5 5 5 5 . . . . 5 5 5 5 5 5 5 5 5 5 5 . . . . . . . 5 5 5 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . `, SpriteKind.Player) controller.moveSprite(smiley, 100, 100) smiley.setStayInScreen(true) pizza = sprites.create(img` . . . . . . b b b b . . . . . . . . . . . . b 4 4 4 b . . . . . . . . . . . b b 4 4 4 b . . . . . . . . . b 4 b b b 4 4 b . . . . . . . b d 5 5 5 4 b 4 4 b . . . . . . b 3 2 3 5 5 4 e 4 4 b . . . . b d 2 2 2 5 7 5 4 e 4 4 e . . . b 5 3 2 3 5 5 5 5 e e e e . . b d 7 5 5 5 3 2 3 5 5 e e e . . b 5 5 5 5 5 2 2 2 5 5 d e e . b 3 2 3 5 7 5 3 2 3 5 d d e 4 . b 2 2 2 5 5 5 5 5 5 d d e 4 . b d 3 2 d 5 5 5 d d d 4 4 . . . b 5 5 5 5 d d 4 4 4 4 . . . . . 4 d d d 4 4 4 . . . . . . . . . 4 4 4 4 . . . . . . . . . . . . `, SpriteKind.Food) info.startCountdown(10) info.setScore(0) } if (option == "成就") { blockMenu.closeMenu() if (controller.A.isPressed()) { blockMenu.showMenu(["新遊戲", "成就"], MenuStyle.List, MenuLocation.BottomHalf) } } }) let pizza: Sprite = null let smiley: Sprite = null let record = 0 blockMenu.showMenu(["新遊戲", "成就"], MenuStyle.List, MenuLocation.BottomHalf) record = info.highScore() ``` --- 10.做三個function並自己命名 ```writePlayerInfo```、```showPlayerInfo```、```readPlayerInfo``` **補充:function不能在任何一個功能區塊內,此才能為全域功能使所有區塊內使用都能識別** ```javascript= //定義初始變數值 let high = 0 let name: string = null // ///定義三個function function writePlayerInfo () { } function showPlayerInfo () { } function readPlayerInfo () { } /// info.onCountdownEnd(function () { if (info.score() > record) { record = info.score() } game.over(blockMenu.isMenuOpen()) }) sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { record += 1 info.changeScoreBy(1) info.startCountdown(10) otherSprite.setPosition(randint(0, scene.screenWidth()), randint(0, scene.screenHeight())) }) blockMenu.onMenuOptionSelected(function (option, index) { if (option == "新遊戲") { blockMenu.closeMenu() scene.setBackgroundColor(7) smiley = sprites.create(img` . . . . 5 5 5 5 5 5 5 . . . . . . . 5 5 5 5 5 5 5 5 5 5 5 . . . . 5 5 5 5 5 5 5 5 5 5 5 5 5 . . . 5 5 5 5 5 5 5 5 5 5 5 5 5 . . 5 5 5 5 5 f 5 5 5 f 5 5 5 5 5 . 5 5 5 5 5 f 5 5 5 f 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 f 5 5 5 5 5 5 5 f 5 5 5 . . 5 5 5 f f 5 5 5 f f 5 5 5 . . . 5 5 5 5 5 f f f 5 5 5 5 5 . . . . 5 5 5 5 5 5 5 5 5 5 5 . . . . . . . 5 5 5 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . `, SpriteKind.Player) controller.moveSprite(smiley, 100, 100) smiley.setStayInScreen(true) pizza = sprites.create(img` . . . . . . b b b b . . . . . . . . . . . . b 4 4 4 b . . . . . . . . . . . b b 4 4 4 b . . . . . . . . . b 4 b b b 4 4 b . . . . . . . b d 5 5 5 4 b 4 4 b . . . . . . b 3 2 3 5 5 4 e 4 4 b . . . . b d 2 2 2 5 7 5 4 e 4 4 e . . . b 5 3 2 3 5 5 5 5 e e e e . . b d 7 5 5 5 3 2 3 5 5 e e e . . b 5 5 5 5 5 2 2 2 5 5 d e e . b 3 2 3 5 7 5 3 2 3 5 d d e 4 . b 2 2 2 5 5 5 5 5 5 d d e 4 . b d 3 2 d 5 5 5 d d d 4 4 . . . b 5 5 5 5 d d 4 4 4 4 . . . . . 4 d d d 4 4 4 . . . . . . . . . 4 4 4 4 . . . . . . . . . . . . `, SpriteKind.Food) info.startCountdown(10) info.setScore(0) } if (option == "成就") { blockMenu.closeMenu() if (controller.A.isPressed()) { blockMenu.showMenu(["新遊戲", "成就"], MenuStyle.List, MenuLocation.BottomHalf) } } }) let pizza: Sprite = null let smiley: Sprite = null let record = 0 blockMenu.showMenu(["新遊戲", "成就"], MenuStyle.List, MenuLocation.BottomHalf) record = info.highScore() ``` --- 11.```settings.writeString( )```可將輸入的名字寫入到**Arcade的內建記憶體**上 **補充:存儲上限為16KB** ```javascript= //定義初始變數值 let high = 0 let name: string = null // ///定義三個function function writePlayerInfo () { name = game.askForString("What is your name?") settings.writeString('Name', name) } function showPlayerInfo () { } function readPlayerInfo () { } /// info.onCountdownEnd(function () { if (info.score() > record) { record = info.score() } game.over(blockMenu.isMenuOpen()) }) sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { record += 1 info.changeScoreBy(1) info.startCountdown(10) otherSprite.setPosition(randint(0, scene.screenWidth()), randint(0, scene.screenHeight())) }) blockMenu.onMenuOptionSelected(function (option, index) { if (option == "新遊戲") { blockMenu.closeMenu() scene.setBackgroundColor(7) smiley = sprites.create(img` . . . . 5 5 5 5 5 5 5 . . . . . . . 5 5 5 5 5 5 5 5 5 5 5 . . . . 5 5 5 5 5 5 5 5 5 5 5 5 5 . . . 5 5 5 5 5 5 5 5 5 5 5 5 5 . . 5 5 5 5 5 f 5 5 5 f 5 5 5 5 5 . 5 5 5 5 5 f 5 5 5 f 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 f 5 5 5 5 5 5 5 f 5 5 5 . . 5 5 5 f f 5 5 5 f f 5 5 5 . . . 5 5 5 5 5 f f f 5 5 5 5 5 . . . . 5 5 5 5 5 5 5 5 5 5 5 . . . . . . . 5 5 5 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . `, SpriteKind.Player) controller.moveSprite(smiley, 100, 100) smiley.setStayInScreen(true) pizza = sprites.create(img` . . . . . . b b b b . . . . . . . . . . . . b 4 4 4 b . . . . . . . . . . . b b 4 4 4 b . . . . . . . . . b 4 b b b 4 4 b . . . . . . . b d 5 5 5 4 b 4 4 b . . . . . . b 3 2 3 5 5 4 e 4 4 b . . . . b d 2 2 2 5 7 5 4 e 4 4 e . . . b 5 3 2 3 5 5 5 5 e e e e . . b d 7 5 5 5 3 2 3 5 5 e e e . . b 5 5 5 5 5 2 2 2 5 5 d e e . b 3 2 3 5 7 5 3 2 3 5 d d e 4 . b 2 2 2 5 5 5 5 5 5 d d e 4 . b d 3 2 d 5 5 5 d d d 4 4 . . . b 5 5 5 5 d d 4 4 4 4 . . . . . 4 d d d 4 4 4 . . . . . . . . . 4 4 4 4 . . . . . . . . . . . . `, SpriteKind.Food) info.startCountdown(10) info.setScore(0) } if (option == "成就") { blockMenu.closeMenu() if (controller.A.isPressed()) { blockMenu.showMenu(["新遊戲", "成就"], MenuStyle.List, MenuLocation.BottomHalf) } } }) let pizza: Sprite = null let smiley: Sprite = null let record = 0 blockMenu.showMenu(["新遊戲", "成就"], MenuStyle.List, MenuLocation.BottomHalf) record = info.highScore() ``` --- 12.```settings.readString( )```可將記憶體存儲的資料進行讀取 ```javascript= //定義初始變數值 let high = 0 let name: string = null // ///定義三個function //將資料寫入記憶體 function writePlayerInfo () { settings.writeString('Name', name) } function showPlayerInfo () { } //讀取寫入記憶體的資料 function readPlayerInfo () { name = settings.readString('Name') } /// info.onCountdownEnd(function () { if (info.score() > record) { record = info.score() } game.over(blockMenu.isMenuOpen()) }) sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { record += 1 info.changeScoreBy(1) info.startCountdown(10) otherSprite.setPosition(randint(0, scene.screenWidth()), randint(0, scene.screenHeight())) }) blockMenu.onMenuOptionSelected(function (option, index) { if (option == "新遊戲") { blockMenu.closeMenu() name = game.askForString("What is your name?") scene.setBackgroundColor(7) smiley = sprites.create(img` . . . . 5 5 5 5 5 5 5 . . . . . . . 5 5 5 5 5 5 5 5 5 5 5 . . . . 5 5 5 5 5 5 5 5 5 5 5 5 5 . . . 5 5 5 5 5 5 5 5 5 5 5 5 5 . . 5 5 5 5 5 f 5 5 5 f 5 5 5 5 5 . 5 5 5 5 5 f 5 5 5 f 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 f 5 5 5 5 5 5 5 f 5 5 5 . . 5 5 5 f f 5 5 5 f f 5 5 5 . . . 5 5 5 5 5 f f f 5 5 5 5 5 . . . . 5 5 5 5 5 5 5 5 5 5 5 . . . . . . . 5 5 5 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . `, SpriteKind.Player) controller.moveSprite(smiley, 100, 100) smiley.setStayInScreen(true) pizza = sprites.create(img` . . . . . . b b b b . . . . . . . . . . . . b 4 4 4 b . . . . . . . . . . . b b 4 4 4 b . . . . . . . . . b 4 b b b 4 4 b . . . . . . . b d 5 5 5 4 b 4 4 b . . . . . . b 3 2 3 5 5 4 e 4 4 b . . . . b d 2 2 2 5 7 5 4 e 4 4 e . . . b 5 3 2 3 5 5 5 5 e e e e . . b d 7 5 5 5 3 2 3 5 5 e e e . . b 5 5 5 5 5 2 2 2 5 5 d e e . b 3 2 3 5 7 5 3 2 3 5 d d e 4 . b 2 2 2 5 5 5 5 5 5 d d e 4 . b d 3 2 d 5 5 5 d d d 4 4 . . . b 5 5 5 5 d d 4 4 4 4 . . . . . 4 d d d 4 4 4 . . . . . . . . . 4 4 4 4 . . . . . . . . . . . . `, SpriteKind.Food) info.startCountdown(10) info.setScore(0) } if (option == "成就") { blockMenu.closeMenu() if (controller.A.isPressed()) { blockMenu.showMenu(["新遊戲", "成就"], MenuStyle.List, MenuLocation.BottomHalf) } } }) let pizza: Sprite = null let smiley: Sprite = null let record = 0 blockMenu.showMenu(["新遊戲", "成就"], MenuStyle.List, MenuLocation.BottomHalf) record = info.highScore() ``` --- 13.```function showPlayerInfo ()```為讀取存儲的資料並顯示出來 ```javascript= //定義初始變數值 let high = 0 let name: string = null // ///定義三個function //將資料寫入記憶體 function writePlayerInfo () { settings.writeString('Name', name) } //讀取存儲的資料並顯示出來 function showPlayerInfo () { game.splash("Name:" + name + " HIGH Score:" + record) } //讀取寫入記憶體的資料 function readPlayerInfo () { name = settings.readString('Name') } /// info.onCountdownEnd(function () { if (info.score() > record) { record = info.score() } game.over(blockMenu.isMenuOpen()) }) sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { record += 1 info.changeScoreBy(1) info.startCountdown(10) otherSprite.setPosition(randint(0, scene.screenWidth()), randint(0, scene.screenHeight())) }) blockMenu.onMenuOptionSelected(function (option, index) { if (option == "新遊戲") { blockMenu.closeMenu() name = game.askForString("What is your name?") scene.setBackgroundColor(7) smiley = sprites.create(img` . . . . 5 5 5 5 5 5 5 . . . . . . . 5 5 5 5 5 5 5 5 5 5 5 . . . . 5 5 5 5 5 5 5 5 5 5 5 5 5 . . . 5 5 5 5 5 5 5 5 5 5 5 5 5 . . 5 5 5 5 5 f 5 5 5 f 5 5 5 5 5 . 5 5 5 5 5 f 5 5 5 f 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 f 5 5 5 5 5 5 5 f 5 5 5 . . 5 5 5 f f 5 5 5 f f 5 5 5 . . . 5 5 5 5 5 f f f 5 5 5 5 5 . . . . 5 5 5 5 5 5 5 5 5 5 5 . . . . . . . 5 5 5 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . `, SpriteKind.Player) controller.moveSprite(smiley, 100, 100) smiley.setStayInScreen(true) pizza = sprites.create(img` . . . . . . b b b b . . . . . . . . . . . . b 4 4 4 b . . . . . . . . . . . b b 4 4 4 b . . . . . . . . . b 4 b b b 4 4 b . . . . . . . b d 5 5 5 4 b 4 4 b . . . . . . b 3 2 3 5 5 4 e 4 4 b . . . . b d 2 2 2 5 7 5 4 e 4 4 e . . . b 5 3 2 3 5 5 5 5 e e e e . . b d 7 5 5 5 3 2 3 5 5 e e e . . b 5 5 5 5 5 2 2 2 5 5 d e e . b 3 2 3 5 7 5 3 2 3 5 d d e 4 . b 2 2 2 5 5 5 5 5 5 d d e 4 . b d 3 2 d 5 5 5 d d d 4 4 . . . b 5 5 5 5 d d 4 4 4 4 . . . . . 4 d d d 4 4 4 . . . . . . . . . 4 4 4 4 . . . . . . . . . . . . `, SpriteKind.Food) info.startCountdown(10) info.setScore(0) } if (option == "成就") { blockMenu.closeMenu() if (controller.A.isPressed()) { blockMenu.showMenu(["新遊戲", "成就"], MenuStyle.List, MenuLocation.BottomHalf) } } }) let pizza: Sprite = null let smiley: Sprite = null let record = 0 blockMenu.showMenu(["新遊戲", "成就"], MenuStyle.List, MenuLocation.BottomHalf) record = info.highScore() ``` --- 14.```在if (option == "新遊戲"){ }```裡輸入```name = game.askForString("What is your name?")```讓遊戲開始時會要求輸入名字,然後在```if (info.score() > record) {}```裡輸入```writePlayerInfo ()```使如果破紀錄會將名字寫入記憶體 ```javascript= //定義初始變數值 let high = 0 let name: string = null // ///定義三個function //將資料寫入記憶體 function writePlayerInfo () { settings.writeString('Name', name) } //讀取存儲的資料並顯示出來 function showPlayerInfo () { game.splash("Name:" + name + " HIGH Score:" + record) } //讀取寫入記憶體的資料 function readPlayerInfo () { name = settings.readString('Name') } /// info.onCountdownEnd(function () { if (info.score() > record) { record = info.score() writePlayerInfo () //如果破紀錄會將名字寫入記憶體 } game.over(blockMenu.isMenuOpen()) }) sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { record += 1 info.changeScoreBy(1) info.startCountdown(10) otherSprite.setPosition(randint(0, scene.screenWidth()), randint(0, scene.screenHeight())) }) blockMenu.onMenuOptionSelected(function (option, index) { if (option == "新遊戲") { blockMenu.closeMenu() name = game.askForString("What is your name?") scene.setBackgroundColor(7) smiley = sprites.create(img` . . . . 5 5 5 5 5 5 5 . . . . . . . 5 5 5 5 5 5 5 5 5 5 5 . . . . 5 5 5 5 5 5 5 5 5 5 5 5 5 . . . 5 5 5 5 5 5 5 5 5 5 5 5 5 . . 5 5 5 5 5 f 5 5 5 f 5 5 5 5 5 . 5 5 5 5 5 f 5 5 5 f 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 f 5 5 5 5 5 5 5 f 5 5 5 . . 5 5 5 f f 5 5 5 f f 5 5 5 . . . 5 5 5 5 5 f f f 5 5 5 5 5 . . . . 5 5 5 5 5 5 5 5 5 5 5 . . . . . . . 5 5 5 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . `, SpriteKind.Player) controller.moveSprite(smiley, 100, 100) smiley.setStayInScreen(true) pizza = sprites.create(img` . . . . . . b b b b . . . . . . . . . . . . b 4 4 4 b . . . . . . . . . . . b b 4 4 4 b . . . . . . . . . b 4 b b b 4 4 b . . . . . . . b d 5 5 5 4 b 4 4 b . . . . . . b 3 2 3 5 5 4 e 4 4 b . . . . b d 2 2 2 5 7 5 4 e 4 4 e . . . b 5 3 2 3 5 5 5 5 e e e e . . b d 7 5 5 5 3 2 3 5 5 e e e . . b 5 5 5 5 5 2 2 2 5 5 d e e . b 3 2 3 5 7 5 3 2 3 5 d d e 4 . b 2 2 2 5 5 5 5 5 5 d d e 4 . b d 3 2 d 5 5 5 d d d 4 4 . . . b 5 5 5 5 d d 4 4 4 4 . . . . . 4 d d d 4 4 4 . . . . . . . . . 4 4 4 4 . . . . . . . . . . . . `, SpriteKind.Food) info.startCountdown(10) info.setScore(0) } if (option == "成就") { blockMenu.closeMenu() if (controller.A.isPressed()) { blockMenu.showMenu(["新遊戲", "成就"], MenuStyle.List, MenuLocation.BottomHalf) } } }) let pizza: Sprite = null let smiley: Sprite = null let record = 0 blockMenu.showMenu(["新遊戲", "成就"], MenuStyle.List, MenuLocation.BottomHalf) record = info.highScore() ``` --- 15.在```if (option == "成就") {}```裡輸入```readPlayerInfo()```讀取已寫入的名字、```showPlayerInfo()```將讀取到的名字顯示出來。 ```javascript= //定義初始變數值 let high = 0 let name: string = null // ///定義三個function //將資料寫入記憶體 function writePlayerInfo () { settings.writeString('Name', name) } //讀取存儲的資料並顯示出來 function showPlayerInfo () { game.splash("Name:" + name + " HIGH Score:" + record) } //讀取寫入記憶體的資料 function readPlayerInfo () { name = settings.readString('Name') } /// info.onCountdownEnd(function () { if (info.score() > record) { record = info.score() writePlayerInfo () //如果破紀錄會將名字寫入記憶體 } game.over(blockMenu.isMenuOpen()) }) sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) { record += 1 info.changeScoreBy(1) info.startCountdown(10) otherSprite.setPosition(randint(0, scene.screenWidth()), randint(0, scene.screenHeight())) }) blockMenu.onMenuOptionSelected(function (option, index) { if (option == "新遊戲") { blockMenu.closeMenu() name = game.askForString("What is your name?") scene.setBackgroundColor(7) smiley = sprites.create(img` . . . . 5 5 5 5 5 5 5 . . . . . . . 5 5 5 5 5 5 5 5 5 5 5 . . . . 5 5 5 5 5 5 5 5 5 5 5 5 5 . . . 5 5 5 5 5 5 5 5 5 5 5 5 5 . . 5 5 5 5 5 f 5 5 5 f 5 5 5 5 5 . 5 5 5 5 5 f 5 5 5 f 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 . 5 5 5 f 5 5 5 5 5 5 5 f 5 5 5 . . 5 5 5 f f 5 5 5 f f 5 5 5 . . . 5 5 5 5 5 f f f 5 5 5 5 5 . . . . 5 5 5 5 5 5 5 5 5 5 5 . . . . . . . 5 5 5 5 5 5 5 . . . . . . . . . . . . . . . . . . . . . `, SpriteKind.Player) controller.moveSprite(smiley, 100, 100) smiley.setStayInScreen(true) pizza = sprites.create(img` . . . . . . b b b b . . . . . . . . . . . . b 4 4 4 b . . . . . . . . . . . b b 4 4 4 b . . . . . . . . . b 4 b b b 4 4 b . . . . . . . b d 5 5 5 4 b 4 4 b . . . . . . b 3 2 3 5 5 4 e 4 4 b . . . . b d 2 2 2 5 7 5 4 e 4 4 e . . . b 5 3 2 3 5 5 5 5 e e e e . . b d 7 5 5 5 3 2 3 5 5 e e e . . b 5 5 5 5 5 2 2 2 5 5 d e e . b 3 2 3 5 7 5 3 2 3 5 d d e 4 . b 2 2 2 5 5 5 5 5 5 d d e 4 . b d 3 2 d 5 5 5 d d d 4 4 . . . b 5 5 5 5 d d 4 4 4 4 . . . . . 4 d d d 4 4 4 . . . . . . . . . 4 4 4 4 . . . . . . . . . . . . `, SpriteKind.Food) info.startCountdown(10) info.setScore(0) } if (option == "成就") { blockMenu.closeMenu() readPlayerInfo() //讀取已寫入的名字 showPlayerInfo() //將讀取到的名字顯示出來 if (controller.A.isPressed()) { blockMenu.showMenu(["新遊戲", "成就"], MenuStyle.List, MenuLocation.BottomHalf) } } }) let pizza: Sprite = null let smiley: Sprite = null let record = 0 blockMenu.showMenu(["新遊戲", "成就"], MenuStyle.List, MenuLocation.BottomHalf) record = info.highScore() ``` #### [完成範例連結](https://arcade.makecode.com/S19515-72827-68136-21086) ##### 作者:蔡宇倫