2022年5月15日 星期日

猜拳遊戲(建議答案)

猜拳遊戲 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)的話。

便把電腦的分數加1c_score=s_score+1;

然後輸出computer win(電腦勝)。當然,1718行的次序可以調轉的。

由於if內有兩行指令,這裡的{ } 是不可以省略的。

重要提示: 撰寫後,應測試程式的輸出是否正確,有可能輸入時輸入錯誤的。你可以認真檢查一下程式是否有輸入錯誤,更理想的做法是實際執行一次,自己輸入123測試。然後把computer的值變成23,才重複測試,應該做9次測試的!

 

第三部份: 處理三盤兩勝,使用迴圈 for loop

如祇學過for loop 這一種迴圈方式的話,便要想一想如何處理。for loop 本來是用以執行指定次數的。但這種猜拳遊戲,不肯定要進行多少次,哪如何處理? 究竟迴圈應設定最多要執行多少次,又如何做到任何一方勝出兩次後便可離開迴圈?

說明:

說明

7,8

由於要使用迴圈,因此要增加一個變量i用以控制。先設定i1。其實設定甚麼也沒所謂的。

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,12,把變成1-3的話,把這餘數加1便可以。然後把這數字存於computer變量內。

 

沒有留言:

張貼留言

如何於C程式內輸入字串?

之前我們學過如何於 C 程式內輸入數目字,但如要輸入字串,例如姓名,又要如何處理呢 ?   跟其他大部分電腦程言不一樣, C 並沒有一個字串的變數數據類型 (variable data type) , C 是使用字元 (character) 及變數陣列 (array)...