Lab-09 從 公牛母牛遊戲中練習亂數(Random number)的使用技巧 /** **可先到這玩玩: http://5ko.free.fr/en/bk.html Task: 練習 寫一個 公牛母牛遊戲 (又叫 幾 A 幾 B 遊戲), 電腦想給人猜 ! Purpose: to understand: (a)何謂Pseudo Random Number Generator(PRNG;亂數產生器)及其用法用途? (b)如何連續使用 rand( ) 生出四位不同的數字(或更多 digit)? (c)如何用兩層 Loop 交叉比對兩個 array 間相同元素? Hints: 請自己用 http://gogle.com 打入 "bulls and cows" 查詢 註: 關於"亂數"可用 http://gogle.com 打入 "PRNG wiki" 查詢 ***===(課程文件區有幫大家先找好一些與公牛母牛遊戲有關的 sites)===*****/ /** 大事化小, 小事化無! 上司管下司, 鋤頭管畚箕 ! ^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^ 初學者大都會覺得程式太大無從著手? 其實只要把握"大哥叫小弟做事"的原則, 把工作切開, 分給一個個的小弟函數(function, 函式), 然後組織起來就完成了! 如果你看過我們這個第 0 版範例後還是覺得不知道如何下手? 那你必須回頭練熟: (a)九九乘法表, (b)讀入兩數印出其各種運算值, (c)算平方根, (d)強壯的輸入整數實數, (e)巴斯卡三角形, (f)製作n階魔方陣 ***More Hints: 作業區目錄內有 bullcow1.c, bullcow2.c, ... 對於這公牛母牛遊戲不了解的請先找同學或學長助教問清楚, 或看 wikipedia, 可用 http://gogle.com 打入 "bulls and cows" 查詢 先把工作拆解: ... 我拆、 我拆、 我拆拆拆 :-) 把以下工作都各自交給小弟們 (functions), (取適當名字) 大哥(main)只負責把他們組織起來! (a) 想出四位數, 用 rand( ) 生出的亂數為 0 到 RAND_MAX 間, 可以用 %10 使其變為 0..9; ( RAND_MAX 須 #include ) 一次生出一位 0..9, 後面生出的須與之前各個都不同 (用Loop) **考慮清楚前面(a)說的生出是要用整數 array 還是 char array? 小弟要如何把想好的傳回來? (b) 電腦想好該數後, 要一直讓 player 猜, 電腦告知 ?A 和 ? B, 直到猜出或是player放棄, 注意思考要如何讀入答案? 要放何處? 放 Global 變數, 或是 用參數傳? 都可! 各有利弊! **一開始可以假設 player 會乖乖照格式輸入, 不用檢查或防呆, 考慮清楚要讀入一個整數, 還是讀入四個文字? 若當整數讀入, 須注意輸入 0123 則讀入為 123 整數, (注意輸入時就算0開頭也不是八進位!) 建議當字串讀, 可用 fgets 整列讀入再處理 ! 須注意 fgets 讀入的字串尾巴有 new line '\n' (c) 要有一個小弟可以判斷 player 的答案得到 幾 A 和 幾 B ? 如何比對電腦想的 與 Player 猜的? 如何把 幾 A 和 幾 B 傳回? (d) 要有一個小弟可以問問 player 要不要繼續玩下一攤? 要傳回 文字 'y' 'n'? 還是傳回整數 1, 0 ? ** 考慮若只按 ENTER 要當作啥? 若按 CTRL_Z 要如何? (就是 EOF) (e) 也可以再多寫個可印出歡迎訊息與遊戲說明等的 function ********* === 剩下的就是大哥 (main) 的工作囉: === ********************/ //#include 含入需要的 header files, 宣告需要的變數與函數 // 注意 rand( ) 與 srand(int) 在 內 void think(char *), getAnswer( ); // 這些是宣告 void checkAnswer(char myn[5], char ygs[5], int*nb, int*nc); // 函數的定義建議寫在後面 int main( ) { /** Pseudo code: **/ // 有些變數可以宣告在此, 為 auto 變數 repeat think(myNum); // 想好四位數放 char myNum[ ] while (38 == 38 ) { // true, for(;;){ // Loop forever // 請 player 猜, 讀入答案 into yourGuess[ ] // if(輸入 -1){ 告訴他答案 並 break; } // 離開 目前的 loop // checkAnswer( ) 檢查答案並算出 nBull 和 nCow // if(nBull == 4){ 印出恭喜猜對了, 然後記得要 break 離開 Loop} // 印出 nBull 幾隻公牛, 幾隻母牛 nCow } // while 問 player 要不要繼續玩? 讀取回答 until(不想玩); // repeat ... until(x); 等於 do{...}while(!(x)); printf("\r\nBye\n"); return 0; // C 規定 main 要回傳一個整數 }//main(