Scratch 3 猜拳遊戲(Rock Paper Scissors Game)

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

猜拳遊戲是很多人都會玩的遊戲,猜拳的規則如下:
  • 出拳時可以出剪刀(Scissor)、石頭(Rock)、布(Paper)。
  • 石頭勝剪刀、剪刀勝布、布勝石頭。
  • 兩人對戰。
  • 猜拳時需喊口令。
可見下圖(此圖取自維基百科)


Scratch積木程式先備知識:
變數(Variable)、亂數(Random number)、角色(Sprite)、造型(Costume)、廣播(Broadcast)的使用。


遊戲製作步驟(底下程式積木僅供參考,設計方式不是只有一種。)
步驟一:下載圖檔
可用 Google 尋找,但要注意版權,此文所用石頭、剪刀、布的圖檔取自 https://iconarchive.com/show/windows-8-icons-by-icons8.html

步驟二:建立 Human 角色
按下角色的貓臉(右上角有加號)圖示,選擇繪圖,角色名稱為 Human

在造型的頁面,點選貓臉(右上角有加號)圖示,選擇上傳

選擇的石頭、剪刀、布的圖檔
此時,Human角色的造型如圖:

更改造型的順序,讓
  • 造型 1 為剪刀
  • 造型 2 為表布
  • 造型 3 為表石頭

步驟三:建立 Computer 角色
在 Human 角色上按下右鍵,點選複製,將角色命名為 Computer


步驟四:修改 Computer 角色造型
可任意修改 Computer 角色的造型,本文是用繪圖裡的填滿工具來改變 Computer 角色的石頭、剪刀、布的顏色

更改造型的順序,讓
  • 造型 1 為剪刀
  • 造型 2 為表布
  • 造型 3 為表石頭

步驟五:建立變數
建立電腦出拳的 ComHand 變數,以及玩家出拳的 HumHand 變數。

在此範例會使用變數的數字來表示出了什麼拳:
  • 數字 1 代表剪刀
  • 數字 2 代表布
  • 數字 3 代表石頭

步驟六:設計 Human 角色積木程式


步驟七:設計 Computer 角色積木程式

步驟八:設計背景畫面
此部分筆者設計四個背景畫面:遊戲進行中( Normal )、玩家勝利( YouWin )、玩家輸了( YouLose )、平手( Draw )。

步驟九:在背景設計判斷輸贏積木程式

此部分的程式邏輯為:

步驟十:試玩遊戲(https://scratch.mit.edu/projects/413785684/)

遊戲操作方式:
  • 按下 r, s, p 開始猜拳
  • 按下 r 出石頭
  • 按下 s 出剪刀
  • 按下 p 出布

雲林縣東興國小2019下學期樂高社團活動紀錄

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

此次社團所使用的主要樂高積木組為:LEGO MINDSTORMS Education NXT Base Set (9797)。

2020/03/07
第一次上課就玩一下 LDD 模擬軟體吧!


2020/03/20
現在的小朋友真的很厲害!自己組好,程式也自己完成!


2020/04/17
沒有實體可碰觸的積木時,我們用軟體來過過癮吧!


2020/05/03
手轉的戰鬥陀螺不好玩...
LDD還是很有趣
自由發揮的這一組,請繼續組「大一點」喔!



2020/05/17
認識蝙蝠怎麼看世界囉!



2020/06/19
迴力車比賽


活動總結照片:

心得:一開始時,擔心那些第一次上樂高的學童們,因為本人上課的方式都是先讓學童自己試著看教材自己動手做,我不會手把手一直教,而是在旁邊觀察那些學童需要幫助的。幾次上課後,有些學童就會開始說:「不要什麼都一直問老師啦!自己先試試看,我也可以幫你喔。」聽到類似這些話的我,覺得辛苦有收穫了,因為【培養會嘗試自學的孩子】是我的目標之一。

資訊安全:組合語言 Debug 工具簡介

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

此文章的測試環境為 Virtualbox 虛擬機上的 Windows XP Pro版本。此篇文章是以 MS Dos 的 Debug 工具來撰寫組合語言。

MS DOS Debug 軟體介紹
MS DOS 下的 DEBUG 為可以檢視記憶體內容、直接存取記憶體內容、撰寫簡易組合語言程式以及程式除錯等功能的工具程式。執行方式為【開啟命令提示字元(Command Prompt)

接著鍵入【Debug】,就會進入到 Debug 程式裡。

而Debug 的指令說明如下:
C:\DOCUME~1\admin>debug
-?
assemble     A [address]
compare      C range address
dump         D [range]
enter        E address [list]
fill         F range list
go           G [=address] [addresses]
hex          H value1 value2
input        I port
load         L [address] [drive] [firstsector] [number]
move         M range address
name         N [pathname] [arglist]
output       O port byte
proceed      P [=address] [number]
quit         Q
register     R [register]
search       S range list
trace        T [=address] [value]
unassemble   U [range]
write        W [address] [drive] [firstsector] [number]
allocate expanded memory        XA [#pages]
deallocate expanded memory      XD [handle]
map expanded memory pages       XM [Lpage] [Ppage] [handle]
display expanded memory status  XS

那先來寫個 Hello World 範例(此範例來自於:Old school assembly "Hello World!": Method 2)
-a 100
08FA:0100 jmp 111
08FA:0102
-e 102 'Hello World!',0D,0A,'$'
-a 111
08FA:0111 mov dx,102
08FA:0114 mov ah, 09
08FA:0116 int 21
08FA:0118 int 20
08FA:011A
-h 011a 0100
021A 001A
-n hello.com
-rcx
CX 0000 :001a
-w
Writing 001A bytes
-q
使用 Debug 撰寫程式碼:

執行結果:

以上為用 Debug 程式輸出 "Hello World" 字串。

接著做簡易加法的範例(此範例來自於:https://www.codeproject.com/Articles/37762/How-To-Use-Debug):
-a «                 ; start to write code
mov ax,03 «      ; pass AX 03, AX will be 03
mov bx,04 «      ; pass BX 03, AX will be 04
add ax,bx «       ; add AX with BX, the sum is in AX
int 3 «              ; break
使用 Debug 撰寫程式碼:

執行結果:



現在讀者可以使用 x86 assembly language(x86 組合語言)來實作看看,可參考此影片
x86 Assembly: Hello World!。當然可以用線上的 IDE:https://www.tutorialspoint.com/compile_assembly_online.php

簡短回顧如何使用 MS- Dos Debug 撰寫組合語言的程式:
  1. 開啟 MS-DOS Prompt
  2. 啟動 Debug 程式
  3. a(ssemble) 指令與 g(o)指令
範例:

MS-DOS Debug 是 16-bit/32-bit 時代的軟體,若要學組合語言,筆者建議學習 NASM

Scratch 3 的基本操作

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

在積木程式上點一下(積木程式會亮黃光)會在舞台區看到結果:


移動定位到隨機位置積木程式到腳本區:


增加音效積木程式到腳本區:


增加重複無限次積木程式:



說出「我會瞬間移動」:


加上綠旗

使用尺寸改變積木來做大小變化:


使用造型換成下一個來切換造型:


完成後可按下綠旗來播放動畫,拖曳積木程式到腳本區是基本的操作,要熟悉一下喔。

練習題目:
  • 讓貓咪角色在畫面上左右移動。
  • 讓貓咪角色在畫面上滑行。
  • 讓貓咪角色在畫面上旋轉。
  • 讓貓咪角色的顏色一直變化。
  • 自由發揮。

2020 雲林縣仁和國小 mBot 夏令營活動紀錄

2020/07/15 ~ 2020/07/17 三天,筆者受邀至雲林縣仁和國小進行 mBot 夏令營的活動,在此紀錄,也感謝仁和國小 余老師的邀請。


2020/07/15 mBot 夏令營 Day 1:
  • mBot元件認識
  • mBot 介紹
  • mBot 三模式
  • 認識Scratch 積木,打地鼠遊戲製作
  • 燈光音樂秀
Day 1 上課講義


Day 1 活動剪影

Day 1 Scratch 打地鼠作品


Day 1 心得:
小朋友的音感實在好。
小朋友很有才。
請繼續發揮自己的想法喔。


2020/07/16 mBot 夏令營 Day 2:
  • 光線感測器
  • 走長方形
  • 推紙杯
  • 軌道設計
  • 巡跡程式設計
  • 最後來個遙控器相撲比賽

Day 2 上課講義

Day 2 活動剪影

Day 2 相撲比賽


心得:
每位小朋友都認真地完成屬於自己的積木程式,也走完巡跡路線,明天一起繼續自我挑戰喔!

2020/07/17 mBot 夏令營 Day 3:巡跡競賽。
  • 1. 直線競速
  • 2. 巡跡賽
  • 3. 創意軌道賽


疑,直線不是容易走嗎?
為什麼有紅色線呢?
是黑色就可以用嗎?
...etc...


Day 3 上課講義

Day 3 活動剪影

Day 3 直線競速


Day 3 循跡賽


Day 3 創意軌道賽


心得:
認真又積極的一群好孩子,有緣再會啦!

心得總結:
一開始有點擔心學童對程式設計會有害怕的情況,於是在開始積木程式教學時,就對學童說:「程式設計沒有標準答案,有想法,先試試,我也會協助你們喔。」在製作 Scratch 打地鼠時,學童就開始很積極地詢問:「怎麼計算分數」、「怎麼計時」等功能,學童在設計打地鼠一直意猶未盡地想繼續修改。而在循跡部分,也請學童自己設計軌道與設計程式,試著走走看,走完後,在一起討論所發現的疑問,例如:「同樣的程式,為什麼每次走的結果都不一樣」、「同樣的程式,在不同車子會有不同的結果」等。課程結束時,學童們也是意猶未盡地想繼續比賽,真是一群認真又積極的好孩子!我們有緣再見喔!

Scratch 3 介面說明

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

線上版 Scratch 3 開啟後的畫面如下:


主要可分為幾個區域:
功能表:地球圖示可更改語言,檔案用來開啟舊檔、新建專案、存檔,教程為Scratch官方提供的自學教材。

積木區:可從積木區的左方將積木程式拖曳到右方空白的積木區上,此部分就是Scratch的積木程式碼。

執行區(也可說舞台區,筆者比較習慣稱呼執行區):可看到積木區程式的執行結果。

角色區:新增或刪除與配置角色。

造型區

編輯角色的外觀圖形,Scratch有內建的角色圖檔,檔案可分為點陣圖向量圖


音效區

編輯音效聲波的振幅與頻率,Scratch有內建的音效檔案。

簡單認識 Scratch 3 之後,可以試著編輯角色、音效、程式積木,先玩玩一些東西。也可練習底下的牛刀小試
  1. 讓角色旋轉。
  2. 讓角色不停旋轉。
  3. 讓角色移動。
  4. 讓角色不停左右移動。
  5. 讓角色發出聲音。
  6. 在音效區設計自己喜歡的音效。
  7. 在造型區設計自己喜歡的角色圖案。

20200704 程式實作題 P1. 購物分析 參考解法

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

此題在高中生程式解題系統的題號為:f579. 1. 購物車
題目來源:20200704 APCS 題目整理與詳解

題敘

給定二數字 X,Y,及多個購物清單,問至少買入各一 X,Y 物之訂單有多少筆?買入一物的定義是,該物品加入購物籃的次數大於被拿出購物籃的次數。

購物清單格式:
每筆以 0 結尾,結尾前的各數字若為正整數 k,代表將商品 k 放入購物籃,若為 k 則代表將 k 拿出。

範例測資

Sample 1

Sample Input 1

1 8
5
1 8 0
5 6 0
2 7 0
8 1 0
33 22 0

Output 1

2

範圍

圖解範例



底下為筆者所想出來的一些解法。

解法一:只用變數
 aCnt:記錄 a 物品放入購物籃的數目
 bCnt:記錄 b 物品放入購物籃的數目
 cnt: 紀錄 T 行中有多少行皆放入 a, b兩物品

C++程式碼:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>

using namespace std;

int main()
{
    int a, b, t;

    // 讀取 a, b, t
    while(cin >> a >> b >> t)
    {
        // aCnt:記錄 a 物品放入購物籃的數目
        // bCnt:記錄 b 物品放入購物籃的數目
        // cnt: 紀錄 T 行中有多少行皆放入 a, b兩物品
        int x, aCnt, bCnt, cnt = 0;

        //  有 T 行資料
        while(t--)
        {
            aCnt = 0, bCnt = 0;

            // 每行資料輸入有多個數 x (以 0 結尾)
            while(cin >> x, x)
            {
                if(x == a) aCnt++;
                if(x == -a) aCnt--;
                if(x == b) bCnt++;
                if(x == -b) bCnt--;
            }

            // 若 a, b 放入購物籃的數目超皆過一個以上
            if(aCnt > 0 && bCnt > 0)
                cnt++;
        }

        cout << cnt << endl;
    }
    return 0;
}

Python 程式碼:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
while True:
    try:
        a, b = input().split()
        a = int(a)
        b = int(b)
    
        t = int(input()) # 有 T 行資料
        cnt = 0 # cnt: 紀錄 T 行中有多少行皆放入 a, b兩物品

        while t > 0:
            aCnt = 0 # aCnt:記錄 a 物品放入購物籃的數目
            bCnt = 0 # bCnt:記錄 b 物品放入購物籃的數目
            data = input().split()

            for x in data:
                x = int(x)
                if x == a: aCnt = aCnt + 1
                if x == -a: aCnt = aCnt - 1
                if x == b: bCnt += 1
                if x == -b: bCnt -= 1

            # 若 a, b 放入購物籃的數目超皆過一個以上
            if aCnt > 0 and bCnt > 0:
                cnt += 1
            t = t - 1
        print(cnt)
    except EOFError:
        break


解法二:用陣列
cnt: 紀錄 T 行中有多少行皆放入 a, b兩物品
num[]:紀錄每種物品的購買數目

C++程式碼:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>

using namespace std;

int main()
{
    int a, b, t;

    // 讀取 a, b, t
    while(cin >> a >> b >> t)
    {
        // cnt: 紀錄 T 行中有多少行皆放入 a, b兩物品
        int x, cnt = 0;

        //  有 T 行資料
        while(t--)
        {
            // num[]:紀錄每種物品的購買數目
            int num[101] = {0};


            // 每行資料輸入有多個數 x (以 0 結尾)
            while(cin >> x, x)
            {
                if(x > 0)
                    num[x] += 1;
                if(x < 0)
                    num[-x] -= 1;
            }

            // 若 a, b 放入購物籃的數目超皆過一個以上
            if(num[a] > 0 &&  num[b] > 0)
                cnt++;
        }

        cout << cnt << endl;
    }
    return 0;
}



解法三:用key-value的 map
恩,這個語法和陣列差異不大。
cnt: 紀錄 T 行中有多少行皆放入 a, b兩物品
num:紀錄每種物品的購買數目

C++程式碼:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <map>

using namespace std;

int main()
{
    int a, b, t;

    // 讀取 a, b, t
    while(cin >> a >> b >> t)
    {
        // cnt: 紀錄 T 行中有多少行皆放入 a, b兩物品
        int x, cnt = 0;

        //  有 T 行資料
        while(t--)
        {
            // num:紀錄每種物品的購買數目
            map<int, int> num ;


            // 每行資料輸入有多個數 x (以 0 結尾)
            while(cin >> x, x)
            {
                if(x > 0)
                    num[x] += 1;
                if(x < 0)
                    num[-x] -= 1;
            }

            // 若 a, b 放入購物籃的數目超皆過一個以上
            if(num[a] > 0 &&  num[b] > 0)
                cnt++;
        }

        cout << cnt << endl;
    }
    return 0;
}


Win Fly 四軸飛行器組裝與試飛

此設備是由雲造中心提供給筆者的,筆者在本文作個紀錄。

盒子外觀


開箱內容


筆者照著組裝說明,四軸機組好後如下

遙控器組好後如下

試飛影片(筆者不太會操作)

整體而言,內附的組裝手冊的說明很詳細,只是組裝上有點費力,要一直壓,建議使用工具來協助組裝,不要學筆者一直用手來壓(苦笑)。