/* 這是可以 RUN 的程式 ftp.csie.nctu.edu.tw /pub/CSIE/course/cs2/bullcow2.c gcc bullcow2.c ./a.out * * * 讓我們給那個 公牛母牛遊戲 (又叫 幾 A 幾 B 遊戲) 更多提示 自己想不下去的才看...其實只是把題目pseudo code 改為程式 *************/ //bullcow2.c #include #define repeat do{ #define until(x) }while(!(x)) void think(char[]); void getanswer(); /* 用 global 變數 yourguess[] */ void checkanswer(char[], char* , int *nb, int* nc); char mynum[5], yourguess[5]; char yn; int nbull, ncow; int main() { printf("這是公牛母牛遊戲, 請輸入 4位不同數字猜我想的數\n"); printf("我將告訴你幾隻公牛 幾隻母牛\n"); printf("公牛 means 數字對位置也對\n"); printf("母牛 means 數字對但位置不對\n"); repeat printf("讓我想好四位數字...\n"); think(mynum); // 填入 mynum while(1) { printf("Your guess:"); getanswer(); // readinto yourguess if(yourguess[0] == '-' ){ printf("答案是 ... %s\n", mynum); break; } checkanswer(mynum, yourguess, &nbull, &ncow); if(nbull == 4){ printf("恭喜猜對了\n"); break; } printf("%d 隻公牛, %d 隻母牛\n", nbull,ncow); } printf(" 繼續玩?"); scanf(" %c", &yn); /* 讀取回答進 yn */ until( yn == 'n' ); printf("\nBye\n"); } /****** ** 函數 think() 用來想一個四位不重複的數字 這比較難一點點 (也很簡單啦 :-) 可先如下寫一假的, (以後再用 rand() 或 random() 生出亂數, see "man rand") ** 函數 getanswer() 用來讀入一個四位不重複的數字, 放 yourguess[] 中 不傳參數, 直接用 yourguess (global 變數) 你要用像 think(mynum) 那樣有參數的寫法也可以啦 ** 函數 checkanswer() 也很簡單 用 loop 比比看到底 前兩參數 (都是 char array) 中有幾位 數字同且位置同 又有幾位數的數字同但是位置不同 更進一步練習題: 寫一個電腦會猜人想的 公牛母牛遊戲 **** 再來, 寫成人和電腦輪流對猜 *************************************************************************/ void getanswer(){ printf("Guess:"); fgets(yourguess,5,stdin); } void think(char x[5]) { x[0] = '5'; x[1] = '3'; x[2] = '8'; x[3] = '0'; /*** 聽說 5380 代表 我想抱您 :-) ***/ x[4] = 0; /** 剛好代表字串結束 **/ } void checkanswer(char x[], char*y , int *nb, int*nc) { int i,k; *nb = *nc =0; for(i=0; i<=3; i++){ /* 算出公牛 */ if(x[i] == y[i]) *nb = *nb +1; } /* 母牛留給你算囉 */ }