Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
壹、課程說明
單元名稱 基礎程式設計—以撲克牌遊戲 BlackJack 為例
單元摘要
在進行程式設計教學時,常會以程式語言的基本概念與要素為核心,安排
教學活動,學生學得的知識較為片段,因此,本教材嘗試以問題導向學習
(Problem based Learning)為核心設計,希望藉由一個完整的例子(撲克牌遊戲
BlackJack),串起整個程式語言基本概念的教學活動,學生以完成 BlackJack
遊戲為目標,搭配預先撰寫好的函數,以及循序漸進習得的程式語言基本概念,
逐步解決每一單元所設計的任務問題,完成撲克牌遊戲的設計,過程中學生將
能習得流程控制、函數呼叫、變數、陣列、模組化程式設計等基本概念。
設計者 A
學習目標
1. 了解什麼是程式設計及 Dev c++程式開發環境。
2. 了解函數呼叫及循序結構。
3. 了解變數宣告、使用及算術運算式。
4. 熟習選擇結構及關係運算式、邏輯運算式。
5. 熟習條件式重複結構。
6. 熟習計數式重複結構。
7. 了解陣列的宣告與使用。
8. 透過作品展示與分享,展現同學們的創意。
課綱範圍 5.電腦與問題解決 5.4電腦解題實作 5.4.1電腦解題工具介紹
5.4.2 解題實作
教學節數 8 節(400 分鐘)
先備知識 視窗環境操作、網路資料瀏覽與下載、基本邏輯概念。
評量方法
1. 簡單口頭問答
2. 課堂觀察
3. 作業練習與實作:可於課程進行中,請同學以教材中的範例進行練習,並嘗
試完成學習單所提供的例題,以檢視同學對課程內容的吸收程度。
4. 作品觀摩:
(1)於每單元課程結束前,請同學以學習單的練習結果進行展示與說明
(2)於課程結束時,安排專題製作的時間並請同學展示專題製作的成果
分享方式
參考資源
1. 自編教材
2. 自行開發的 C++程式檔
poker_element.h poker_循序結構.cpp poker_變數.cpp poker_條件判斷 1.cpp poker_條件判斷 2.cpp poker_重覆結構 1.cpp poker_重覆結構 2.cpp poker_重覆結構 for_1.cpp poker_陣列_1.cpp
貳、教學活動設計
教學活動名稱:(一) 什麼是程式設計 時間:80 分鐘
教學活動說明: 目標任務
安裝與熟習 C++程式語言開發工具,了解程式開發流程。 撰寫與執行第一個 C++程式 (Hello World!!)
裝備區 Dev C++整合開發環境下載專頁,http:// 教學活動: 一、 介紹什麼是程式設計、程式語言的種類 二、 介紹什麼是 Dev C++ 整合開發環境(含下載、安裝) 三、 展示撲克牌遊戲 BlackJack
引起學生學習動機,並以 BlackJack 介紹程式編譯的過程
四、 介紹 C++程式語言的基本架構
並應用 cout 寫出第一個 C++程式 (Hello World!!)
#include using namespace std; int main() { cout
教學活動說明: 目標任務
依序完成撲克牌遊戲的初始化設定、洗牌、玩家抽牌、顯示玩家的牌等程序。 裝備區 引入檔 poker_element.h 中的相關函數說明:
void initial(void) 函數功能說明 撲克牌遊戲的初始化設定 傳入參數 無(void) 回傳參數 無(void) 呼叫函數範例 initial( );
程式將會完成產生一副新牌、清空所有玩家的牌等動作。
void display_allcard(void) 函數功能說明 印出整副撲克牌,依序由第 0 張至第 51 張共 52 張撲克牌的花色
與點數 傳入參數 無(void) 回傳參數 無(void) 呼叫函數範例 display_allcard( );
程式將會以下列格式依序印出 52 張撲克牌的花色與點數 經洗牌打亂後,可能印出如下狀況 ( 0)card no. 50 ♣12 ( 1)card no. 15 ♥ 3 ( 2)card no. 26 ♦1 ( 3)card no. 2 ♠ 3 說明: ( 0) 代表這是第 0 張牌 card no. 50 代表這張牌的編號是 50 號,整副撲克牌是由 0 編
號到 51 號,依序代表♠1、♠2、…、♣13 ♣12 這張牌的花色與點數(由牌的編號為 50 推算)
void shuffle(int n) 函數功能說明 洗牌(以每次交換兩張牌的方式進行打亂牌的動作) 傳入參數 打亂的次數 (整數 n) 回傳參數 無(void) 呼叫函數範例 shuffle(1000);
每次交換兩張牌重複進行 1000 次,完成打亂牌的動作。
int draw(int player_no) 函數功能說明 某一位玩家抽取一張牌 傳入參數 玩家編號 (整數 player_no),預設最多 8 個玩家,編號為 0-7
回傳參數 抽到的牌的編號 (整數) 呼叫函數範例 draw(0);
玩家 0 抽取一張牌。 k = draw(2); 玩家 2 抽取一張牌,並將抽到的牌編號回傳指定給變數 k。
void display_player_card(int player_no) 函數功能說明 顯示某一位玩家手中的所有牌 傳入參數 玩家編號 (整數 player_no),預設最多 8 個玩家,編號為 0-7 回傳參數 無(void) 呼叫函數範例 display_player_card(2);
顯示玩家 2 手中的所有牌。格式為:♣12 教學活動: 一、說明本單元的目標任務,並鼓勵同學思考問題的所在與解決方案。 二、說明什麼是函數(function)、介紹函數的呼叫方式。 三、說明引入檔 poker_element.h 中各項函數的功能及呼叫方式。 四、鼓勵學生應用所提供的函數,完成本單元指定的目標任務。 五、說明循序結構的程式執行流程。
poker_循序結構.cpp #include #include "poker_element.h" using namespace std; int main() { initial(); display_allcard(); shuffle(1000); cout
教學活動說明: 目標任務
玩家 0 抽牌 2 次,計算每次抽牌的點數(暫不考慮 K、Q、J 為 10 點,A 為 11 點的狀況),並統計出玩家 0 所獲得的點數和。
裝備區 變數宣告 資料型態 變數名稱 ; 例如: int n;
代表宣告一個變數 n,它的資料型態為 int(整數),亦即程式會在記憶體中保留一塊空間,在程式執行的過程中,可用來儲存一個整數值,供後續程式運算處理使用。
變數使用 變數名稱 = 數值; 例如:n = 5;
將 5 指定給變數 n,如此程式便會將 5 存放在變數 n 所在的記憶體中。
變數名稱 = 變數名稱; 例如:n = k;
將變數 k 的內容指定給變數 n,假設變數 k 的內容為 8,如此程式便會將 8 存放在變數 n 所在的記憶體中。
變數名稱 = 變數名稱 + 數值; 例如:n = k + 3;
將變數 k 的內容與數值 3 進行加法運算,並將運算後的結果指定給變數 n,假設變數 k 的內容為 8,加法運算後的結果為 11,如此程式便會將 11 存放在變數 n 所在的記憶體中。
變數名稱 = 變數名稱 + 變數名稱; 例如:n = k + w;
將變數 k 的內容與變數 w 的內容進行加法運算,並將運算後的結果指定給變數 n,假設變數 k 的內容為 8、變數 w 的內容為 7,加法運算後的結果為 15,如此程式便會將 15 存放在變數 n 所在的記憶體中。
算術運算
+ 加法 - 減法 * 乘法 / 除法 % 取餘數
例如:n = 5 % 3; 將數值 5 與數值 3 進行取餘數運算,5 除以 3 得到餘數為 2,並將運算後的結果 2指定給變數 n。
教學活動: 一、說明本單元的目標任務,並鼓勵同學思考問題的所在與解決方案。 二、以前一單元的程式,引導同學找出非得要變數輔助才能完成目標任務的原因。
關鍵在於 draw( )函數的回傳值(抽到的牌編號),必須先儲存起來,並計算出點數值,才
能和下一次抽到牌的點數值進行加總。 三、說明什麼是變數,介紹變數的宣告與變數使用的方式。 四、說明算術運算的種類與用法 五、讓同學嘗試將 draw( )函數回傳值的牌編號儲存起來,並透過算術運算計算出點數值。 六、讓同學嘗試將計算出的點數值累加起來,並印出累加後的總點數。
花色 = 牌編號 / 13 點數 = 牌編號 % 13
七、鼓勵學生應用本單元所學,完成本單元指定的目標任務。
poker_變數.cpp #include #include "poker_element.h" using namespace std; int main() { int card_no; int point; int player_point=0; initial(); display_allcard(); shuffle(1000); cout
教學活動說明: 目標任務
玩家 0 抽牌 2 次,計算每次抽牌的點數(需將 K 13 點、Q 12 點、J 11 點轉換為 10 點),並統計出玩家 0 所獲得的點數和。
玩家 0 抽牌 2 次,計算每次抽牌的點數(需將 A 1 點轉換為 11 點),並統計出玩家 0所獲得的點數和。
裝備區 選擇結構 讓程式能依據條件判斷的結果分支執行,程式流程進入判斷的菱形符號後,會判斷
測試條件是否成立。然後,依據判斷的結果選擇程式的流向。
語法
單向選擇結構: if ( 條件判斷式 ) { 程式敘述 1; 程式敘述 2; } 程式敘述 3; 說明: 單向選擇結構的程式運作會因條件判斷式的成立而走特別的程
式流程,當條件判斷式為 true(真)時,程式會執行程式敘述 1 及2 後,接著執行選擇結構外的程式敘述 3,當條件判斷式為false(假)時,程式只會執行選擇結構外的程式敘述 3。
雙向選擇結構: if ( 條件判斷式 ) { 程式敘述 1; 程式敘述 2; } else {
程式敘述 3; 程式敘述 4; } 程式敘述 5; 說明: 雙向選擇結構的程式運作會因條件判斷式結果的不同而走不同
的程式流程,當條件判斷式為 true(真)時,程式會執行程式敘述1 及 2 後,接著執行選擇結構外的程式敘述 5,當條件判斷式為false(假)時,程式會執行程式敘述 3 及 4 後,接著執行選擇結構外的程式敘述 5。
巢狀選擇結構:
if (條件判斷式 A)
{
if (條件判斷式 B)
{
條件式 A 為真(True)且條件式 B 為真(True)時的程式敘述區塊
}
else
{
條件式 A 為真(True)且條件式 B 為假(False)時的程式敘述區塊
}
}
else
{
if (條件判斷式 B)
{
條件式 A 為假(False)且條件式 B 為真(True)時的程式敘述區塊
}
else
{
條件式 A 為假(False)且條件式 B 為假(False)時的程式敘述區塊
}
} 說明: 在原有的選擇結構中,再放入一個選擇結構,形成巢狀選擇結構,
透過多層次的巢狀選擇結構,將能形成多重選擇的機制。
關係運算式 關係運算式是由運算元與關係運算子所組成,以關係運算子的種類來判斷運算元之
間的關係,形成真(True)或假(False)的結果,以供程式判斷之用。 關係運算式的語法結構如下:
A 運算元 關係運算子 B 運算元 例如: 小明的身高 > 172 公分 在這個例子的關係運算式中,(小明的身高)與(172 公分)分別是兩個待比較
的運算元,(>)則代表要進行的關係運算種類,運算式運算後會產生兩種結果,如
果小明實際的身高為 180 公分,則小明的身高>172 公分的運算結果就會為真(True),如果小明實際的身高為 160 公分,則小明的身高>172 公分的運算結果就會為假(False)。
關係運算子包含有下列類型,分別說明如下:
關係運算子 說明
== 左邊的值等於右邊的值
!= 左邊的值不等於右邊的值
> 左邊的值大於右邊的值
>= 左邊的值大於或等於右邊的值
< 左邊的值小於右邊的值
True False False True
False True False True True
False False False False
因此我們便能結合算術運算式、關係運算式及邏輯運算式,組合出所需的條件判斷式,如: x * 3 > 5 && y – 6 < 3
教學活動: 一、說明本單元的目標任務,並鼓勵同學思考問題的所在與解決方案。 二、以前一單元的程式,引導同學找出需要讓程式能分支執行才能完成目標任務的原因。
關鍵在於當點數為 13 點、12 點、11 點時,須將點數轉換為 10 點。 三、說明什麼是選擇結構,介紹各種選擇結構的語法及使用時機。 四、說明什麼是關係運算式、邏輯運算式 五、讓同學嘗試應用選擇結構及關係運算式,完成將 13 點、12 點、11 點轉換為 10 點的程式。六、引導同學歸納出將 A 1 點轉換為 11 點的條件式。
注意:當點數已超過 11 點時,A 1 點便仍維持 1 點,否則便轉換為 11 點。
七、讓同學嘗試應用選擇結構及關係運算式,完成將 A 1 點轉換為 11 點的程式。 八、鼓勵學生應用本單元所學,完成本單元指定的目標任務。
poker_條件判斷 1.cpp #include #include "poker_element.h" using namespace std; int main() { int card_no; int point; int player_point; initial(); display_allcard(); shuffle(1000); cout
player_point = player_point + point; cout
if( point == 1 && player_point
依條件判斷的結果是否為真(True),決定重複結構中的程式區塊是否繼續反覆執行。 語法:
while( 條件判斷式 )
{
欲重複執行的程式碼
}
條件式重複迴圈會連續不斷的重複執行大括號{}中所包含的程式碼,直到 while 後方( )中的條件判斷式為假 false,也就是說,當條件為真 True 時,重複迴圈會不斷重複執行,當條件為假 False 時,則跳出迴圈繼續執行後面的程式。
教學活動: 一、說明本單元的目標任務,並鼓勵同學思考問題的所在與解決方案。 二、以前一單元的程式,引導同學找出需要讓程式能依條件判斷結果重複執行才能完成目標
任務的原因。 關鍵在於要能依玩家輸入值是 Y 或 y 來決定是否重複執行抽牌的動作。
三、說明接受使用者由鍵盤輸入資料的語法。 四、說明什麼是條件式重複結構,介紹條件式重複結構的語法及使用時機。 五、讓同學嘗試應用以玩家由鍵盤輸入的資料作為條件式重複結構的判斷條件,完成由玩家
決定是否重複執行抽牌動作的程式。 六、引導同學歸納出若玩家已爆掉(點數超過 21 點),即使玩家輸入 Y 或 y 時,亦停止抽牌的
條件式。 注意:可應用邏輯運算式,結合兩組條件形成一個複雜的條件判斷式。
七、讓同學嘗試應用條件式重複結構及歸納出的條件判斷式完成程式。 八、鼓勵學生應用本單元所學,完成本單元指定的目標任務。
poker_重複結構 1.cpp #include #include "poker_element.h"
設定與條件式相關的變數初始值
條件判斷式
重複結構內的程式區段
改變與條件式相關的變數內容
重複結構後的 程式敘述
是
否
using namespace std; int main() { int card_no; int point; int player_point; char draw_or_not; initial(); display_allcard(); shuffle(1000); cout
教學活動說明: 目標任務
以複製程式區段的方式,完成玩家 0、玩家 1 的重複抽牌程式。 應用計數式重複結構,完成 4 個玩家(0、1、2、3)的重複抽牌程式。
裝備區 計數式重複結構 所謂計數式重複結構,就是可以設定重複結構反覆執行的次數,當到達所設定的次
數即跳出重複結構,往程式的下一個區塊繼續執行。 計數式重複結構語法如下: for ( 初始值 ; 繼續執行的條件 ; 累加值 ) { 欲重複執行的程式敘述 } 例如: for ( i=0 ; i
int i; initial(); display_allcard(); shuffle(1000); cout
教學活動說明: 目標任務
應用陣列分別將 4 個玩家(0、1、2、3)的總點數記錄下來,以作為判斷贏家的依據。 以找最大值的演算法,完成贏家的判定。
裝備區 陣列的宣告 資料型態 陣列名稱[陣列元素個數]; 例如: int data[4]; 如此可宣告出一個 data 陣列,陣列中包含了 4 個整數元素。 資料型態 陣列名稱[陣列元素個數]={第 0 個元素值,…,第 n-1 個元素值}; 例如: int data[4]={5,3,2,4}; 如此可宣告出一個 data 陣列,陣列中包含了 4 個整數元素,同時以{}中的內容設定
陣列元素的初始值,其中第 0 個元素值為 5,第 1 個元素值為 3,第 2 個元素值為 2,第 3 個元素值為 4。
陣列的使用 陣列名稱[陣列註標值] = 數值; 例如: data[0] = 9; 如此可將數值 9 指定給 data 陣列的第 0 個元素,注意:陣列的註標值由 0 開始,若
陣列元素有 4 個,則陣列註標值分別為 0-3。 其餘使用方式與變數的使用方式同,可將一個陣列元素視為一個變數使用。 找尋陣列中的最大值演算法 以 max 紀錄過程中的最大值 以 max_player 記錄過程中擁有最大值的陣列註標值 max = -1; max_player = -1; for(i=0;i max) && (player_point[i]
五、介紹找尋最大值的演算法。 六、鼓勵同學嘗試應用陣列與找尋最大值的演算法,完成能判定哪個玩家獲勝的程式。 七、鼓勵學生應用本單元所學,完成本單元指定的目標任務。
poker_陣列_1.cpp #include #include "poker_element.h" using namespace std; int main() { int card_no; int point; int player_point[4]={0,0,0,0}; char draw_or_not; int i; int max,max_player; initial(); display_allcard(); shuffle(1000); cout
} } //找出點數最大者 決定贏家 max = -1; max_player = -1; for(i=0;i max) && (player_point[i]
二、說明電腦程式的種類。
三、說明電腦程式的開發流程。
四、說明電腦如何完成所要完成的工作。
五、下載並安裝 Dev C++程式開發環境。
六、寫出 C++程式的基本語法結構
七、撰寫第一個 C++程式( Hello World!! )。
單元名稱:(二) 函數呼叫及循序結構
一、說明 BlackJack 撲克牌遊戲的基本流程
二、說明函數(function)的作用及函數的呼叫方式
三、說明函數名稱、傳入參數與回傳參數的意義
四、列舉在 BlackJack 撲克牌遊戲中可能會用到的函數(定義在 poker_element.h 中)
五、以 BlackJack 撲克牌遊戲的基本流程為基礎,將對應的函數標註出來。
六、結合第一單元的 C++基本語法結構,依據 BlackJack 撲克牌遊戲的基本流程,撰寫出簡
易抽牌程式。
單元名稱:(三) 變數宣告、使用及算術運算式
一、說明有什麼方式可以取得抽到牌的撲克牌編號
二、說明沒有回傳值的函數與有回傳值的函數之間的差異
三、說明為什麼需要將 draw( )函數所回傳的值儲存起來
四、說明有什麼方式可以將 draw( )函數所回傳的值儲存起來
五、說明變數的宣告方式及使用方法
六、以圖示說明執行下列程式敘述過程中,記憶體中的變化情形。
int n;
n = 5;
n = n + 3;
七、說明撲克牌編號、花色與點數之間的算術關係。
八、嘗試宣告一個變數 card_no,將 draw( )函數所回傳的值儲存起來。
九、嘗試宣告一個變數 point,透過與 card_no 的運算,計算出該張牌的點數。
十、嘗試運算出每次抽牌的點數,並將之累加起來,計算出該玩家抽牌的點數和。
單元名稱:(四) 選擇結構及關係運算式、邏輯運算式
一、說明前一單元計算出的點數與實際 BlackJack 撲克牌遊戲有什麼差異之處。
二、說明有什麼方式可以解決前述的差異。
三、說明什麼是選擇結構,它有什麼用途。
四、說明什麼是關係運算式,有哪些不同種類的關係運算子。
五、寫出選擇結構的基本語法結構,並試著說明選擇結構的程式運作流程
六、嘗試以選擇結構完成將 K 13 點、Q 12 點、J 11 點轉換為 10 點的程式
七、說明什麼是邏輯運算式,有哪些不同種類的邏輯運算子。
八、寫出巢狀選擇結構的基本語法結構,並試著說明選擇結構的程式運作流程
九、嘗試以巢狀選擇結構完成將 A 1 點轉換為 11 點的程式。
單元名稱:(五) 條件式重複結構
一、嘗試寫出接受使用者由鍵盤輸入資料並將之儲存到變數中的程式敘述。
二、說明結合接受使用者由鍵盤輸入資料的敘述及前一單元學習的選擇結構,能夠產生什
麼樣的程式動作。
三、若要讓玩家自行決定是否繼續抽牌,亦即玩家輸入 Y或 y時反覆抽牌,直到輸入其他
字元為止,單靠選擇結構能否完成。
四、說明什麼是條件式重複結構
五、寫出條件式重複結構的基本語法結構,並試著說明條件式重複結構的程式運作流程
六、嘗試以條件式重複結構完成讓玩家自行決定是否繼續抽牌的程式。
七、觀察並說明上述完成的程式,在遊戲中可能會有什麼問題發生。
八、嘗試應用邏輯運算式,結合兩組條件形成一個複雜的條件判斷式,解決前述的問題。
單元名稱:(六) 計數式重複結構
一、嘗試以複製一段程式碼的方式完成,玩家 0、玩家 1的重複抽牌程式
二、說明若要完成 100 個玩家的抽牌程式,若以前述方式完成的話會有什麼問題,有沒有
更好的方式。
三、說明問題一複製的兩段程式碼間有哪些相同及相異的地方,試著歸納出之間的規律。
四、說明什麼是計數式重複結構
五、寫出計數式重複結構的基本語法結構,並試著說明計數式重複結構的程式運作流程
六、說明計數式重複結構中常見變數的作用是什麼,並說明其在計數式重複結構運作過程
中的變化情形。
七、嘗試應用先前歸納出的規律與計數式重複結構,完成 4個玩家(0、1、2、3)的重複抽
牌程式。
單元名稱:(七) 陣列的宣告與使用
一、說明在 BlackJack 撲克牌遊戲中,決定贏家的規則有哪些
二、觀察前一單元 4個玩家的運作過程,說明點數紀錄可能出現的問題。
三、嘗試以目前學過的程式語法與結構,以宣告 4個變數的方式撰寫程式解決前述的問題。
四、說明若將前述程式改寫成 100 個玩家,可能會有什麼問題。
五、說明改寫後的程式又將如何判斷這 100 個玩家中誰是贏家,可能會有什麼問題。
六、說明陣列的宣告方式、使用方式及使用時機
七、以圖示說明執行下列程式敘述過程中,記憶體中的變化情形。
int data[4];
data[0] = 5;
data[1] = 3;
data[2] = data[0] + data[1] + 2;
八、嘗試應用陣列,改寫前述程式完成能分別記錄 4個玩家(0、1、2、3)點數的程式。
九、說明在 4個陣列元素中如何找出最大值的方式。
十、以圖解說明找尋最大值的演算法
十一、 嘗試應用陣列與找尋最大值的演算法,完成能判定哪個玩家獲勝的程式。
單元名稱:(八) 專題作品展示與分享
一、完成一個完整的 BlackJack 撲克牌遊戲程式,可有 4-8 個玩家參與。
二、說明目前的程式可能有的問題,並嘗試解決它。
三、說明玩家在判斷是否繼續抽牌的可能判斷依據。
四、試著以前述的判斷依據修改前述的程式,將最後一個玩家修改為莊家(電腦玩家),能
依據設定好的計簡易人工智慧功能,自動判斷是否繼續抽牌。
五、嘗試應用引入檔 poker_element.h 中所提供的各種函數,撰寫另一種撲克牌遊戲(如:
撿紅點、比大小、九九等)