猜拳遊戲 rock-scissors and paper games
程式指示:
1. 玩家及電腦各自出招(包paper、剪scissors或揼(拳頭)rock)。
2. 三盤兩勝。
3. 最後輸出得勝者。
輸出的畫面大概如下:
留意,以下的狀況一次平手,兩次玩家勝出,如不停出現平手的話,可能要再多幾次才能分出勝負。
這程式應該分為5部份,如下:
強烈建議撰寫程式時逐一完成,測試這部份正確才繼續下一部份。
1. 輸入及輸出玩家及電腦的選項。(先假設電腦一直出1,即拳頭rock)
2. 判斷勝負,並輸出勝方,使用if
3. 處理三盤兩勝,使用迴圈 for loop
4. 輸出最後勝利者
5. 加入電腦隨機輸出
第一部份: 處理輸入及輸出玩家及電腦的選項。
說明
|
行 |
說明 |
|
1 |
要貯存玩家及電腦的選項,要使用兩個變量(variable),分別命名player(玩家的)及computer(電腦)。 |
|
2 |
先簡化程式的執行。先假設電腦祇出1(即拳頭),以方便程式的除錯。 |
|
6,7 |
輸出提示訊息,該玩家知道要輸入。 |
|
8 |
讀取玩家按鍵盤的選擇,貯存於player變量內。 |
|
9,10 |
分別輸出玩家及電腦的選擇。 |
第二部份: 判斷勝負,並輸出勝方,使用if指令。
留意,以下程式簡化了輸出,並不是完整的。//part 1 program位置應是第一部份的程式碼。
要判斷勝負,要先想清楚總共有多少項判斷。如下表,應該有9個判斷。
|
|
玩家拳頭(1) |
玩家剪(2) |
玩家包(3) |
|
電腦拳頭(1) |
Draw |
電腦勝 |
玩家勝 |
|
電腦剪(2) |
玩家勝 |
Draw |
電腦勝 |
|
電腦包(3) |
電腦勝 |
玩家勝 |
Draw |
由於要每次顯示勝負或平手,因此有9個判斷,如不需要顯示的話,平手的可以不用判斷。
以下程式碼祇列出上表中第一行的3個判斷,其他判斷的寫法是類似的。真正撰寫時,應撰寫9個判斷的。
說明
|
行 |
說明 |
|
5 |
要記錄各自的分數,要使用變量貯存。c_score代表電腦分數,p_score代表玩家分數。 |
|
6,7 |
要先把這些分數設定成0。 |
|
13-15 |
程式碼的作用是: 如電腦出1(computer==1)及玩家出1(player==1)的話。及的符號是&&。 便輸出draw(平手),之後不用處理分數。 由於if內祇有一行指令,這裡的{ } 是可以省略的。 |
|
16-18 |
程式碼的作用是: 如電腦出1(computer==1)及玩家出1(player==2)的話。 便把電腦的分數加1。c_score=s_score+1; 然後輸出computer win(電腦勝)。當然,17及18行的次序可以調轉的。 由於if內有兩行指令,這裡的{ } 是不可以省略的。 |
重要提示: 撰寫後,應測試程式的輸出是否正確,有可能輸入時輸入錯誤的。你可以認真檢查一下程式是否有輸入錯誤,更理想的做法是實際執行一次,自己輸入1、2及3測試。然後把computer的值變成2及3,才重複測試,應該做9次測試的!
第三部份: 處理三盤兩勝,使用迴圈 for loop
如祇學過for loop 這一種迴圈方式的話,便要想一想如何處理。for loop 本來是用以執行指定次數的。但這種猜拳遊戲,不肯定要進行多少次,哪如何處理? 究竟迴圈應設定最多要執行多少次,又如何做到任何一方勝出兩次後便可離開迴圈?
說明:
|
行 |
說明 |
|
7,8 |
由於要使用迴圈,因此要增加一個變量i用以控制。先設定i是1。其實設定甚麼也沒所謂的。 |
|
10-17 |
迴圈設定成最多做100次。因為i開始是1,一直至i<=100,即少於或等於100。其實正常來說不需要100次的,因為很難想像三盤兩勝的遊戲居然要猜100次才能分出高下。 留意,這個for迴圈的範圍是由第10行至第17行。 |
|
15-16 |
如果玩家的分數(p_score)或電腦的分數(c_score)等於2的話,即其中一方已兩勝,便把i設成101,即超出i<=100的範圍,那程式再執行至第10行後,便不再執行下去,離開迴圈。 留意,或(or)於C的寫法是||。 |
第四部份: 輸出最後勝利者
這部份不困難,把以下程式(58-61行)寫於迴圈外便可以。
說明:
|
行 |
說明 |
|
58-59 |
如果電腦的分數(c_score)等於2的話,便輸出Finally computer win(最後電腦勝出)。 |
|
60-61 |
否則else,便輸出Finally player win(最後玩家勝出)。 |
第五部份: 加入電腦隨機輸出
於C內讀取隨機數涉及幾個敍述(statement),留意敍述的位置。
說明:
|
行 |
說明 |
|
2 |
由於srand()及rand()的函數存放於stdlib.h標頭檔內,因此要使用的話,要先載入。 留意,載入標頭檔必於於int main() 前。 |
|
3 |
由於time()的函數存放於time.h標頭檔內,因此要使用的話,要先載入。 留意,載入標頭檔必於於int main() 前。 |
|
8 |
使用time(NULL)函數讀取系統時間,作為產生亂數的種子。再使用srand(),這是產生亂數的指定寫法。 留意,這句srand(time(NULL));要寫於迴圈外。 |
|
12 |
產生的亂數其實是一個很長的數目,要得出1-3的隨機數,使用rand()%3+1。%3是除3然後取餘數,除3的話,餘數可能是0,1或2,把變成1-3的話,把這餘數加1便可以。然後把這數字存於computer變量內。 |
沒有留言:
張貼留言