//bullcow0.c -- 還是再練習想以及寫程式 練習 寫一個 公牛母牛遊戲 (又叫 幾 A 幾 B 遊戲) Pseudo code: char myNum[5], yourGuess[5]; printf("這是公牛母牛遊戲, 請輸入 4位不同數字猜我想的數\"); printf("我將告訴你幾隻公牛 幾隻母牛\n"); printf("公牛 means 數字對位置也對\n"); printf("母牛 means 數字對但位置不對\n"); repeat printf("讓我想好四位數字...\n"); think(myNum); // 填入 myNum while(true) { printf("Your guess:"); getAnswer(); // readinto yourGuess if(輸入 -1){ 告訴他答案 break; /* 離開 目前的 loop */ } checkAnswer(myNum, yourGuess, &nbull, &ncow); if(nbull == 4){ 印出恭喜猜對了 break; } 印出幾隻公牛 幾隻母牛 } printf(" 繼續玩?"); 讀取回答進 yn until( yn == 'n' ); printf("\nBye\n"); ** 函數 think() 用來想一個四位不重複的數字 這比較難一點點 (也很簡單啦 :-) 可先寫一假的: (以後再用 rand() 或 random() 生出亂數, see "man rand") void think(char x[5]) { /* 想一想, why 用 5 char 不是 4 char 就好?*/ x[0] = '5'; x[1] = '3'; x[2] = '8'; x[3] = '0'; /*** 聽說 5380 代表 我想抱您 :-) ***/ x[4] = 0; /** 剛好代表字串結束, 如此 x 可當字串 **/ } ** 函數 getAnswer() 用來讀入一個四位不重複的數字, 放 yourGuess[] 中 不傳參數, 直接用 yourGuess (global 變數) 你要用像 think(myNum) 那樣有參數的寫法也可以啦 ** 函數 checkAnswer(char myn[5], char yg[5], int*nb, int*nc) 也很簡單 用 loop 比比看到底 前兩參數myn[5]和yg[5] (都是 char array) 中 有幾位數字同且位置同(公牛), 用 *nb 記住並傳回去 又有幾位是數字同但是位置不同(母牛), 用 *nc 記住並傳回去 ** 注意, array 雖有五個元素, 只要比四個喔! 因該兩個 cahr array 的最後都是 '\0' 代表字串結束! 這是因為 C/C++ 的字串其實就是 char 的 array; Java 則不是喔! 更進一步練習題: 上面說的是人猜電腦想的, 如過你覺得太簡單, 那就, 寫一個電腦會猜人想的 公牛母牛遊戲 你每次在電腦猜完後輸入兩個數告訴它是 幾隻公牛 幾隻母牛 *** 如果還是覺得太簡單, 寫成人和電腦輪流對猜, 且要更好用的user interface