有人要的
// 猜數字遊戲1A2B詳細注釋版 2007/5/28 17:15:17-17:56:5,2007/5/29 1:48:35
//g++ -pipe -o p13 p13.cpp && p13
// 輸出入用函式
#include <iostream>
// for randomize(),random();
#include <cstdlib>
// for rand(),srand(),time(),random();
//#include <cmath>
//#include <ctime>
// 直接在程式中呼叫,不必用std::cout等繁瑣方法。
//using namespace std;
using std::cin;
using std::cout;
using std::endl;
// 除錯用
const int debug=0;
/* 隨機數發生器:用系統的吧。
int random(int x){
// 不太建議rand()%x,較不均勻
return (float)x*rand()/RAND_MAX;
}
*/
// 正式開始
int main(){
// 初始化隨機數發生器,設定亂數產生器種子,讓隨機性更強。
// 若您這無法編譯通過,請改randomize();試試。
srandomdev();//randomize();//srand((unsigned)time(0));
// 出題:選個4位數
// num,num_array[]裡面裝四個位數:[0]為個位,[1]為十位,餘類推。
// digit_used[]裡面裝的是已經用過的阿拉伯數字。
// 分兩個array是為了讓答題判斷時更容易。
int num,num_array[4],digit_used[10];
do{
// 隨機取0~(10000-1)的數
// All the bits generated by random() are usable.
num=(int)random()%10000;
// 太小不合
if(num<1000){num=0;continue;}
// 偷偷顯示一下取了什麼
if(debug)cout<<num<<endl;
// 先把digit_used[]歸零
for(int i=0;i<10;i++)digit_used[i]=0;
// 自個位到千位將數字一一記入num_array[]與digit_used[]
// 為了不更動num,這邊拿n來作替身。
for(int i=0,n=num;i<4;i++){
// 重複數字檢查:若這個阿拉伯數字已經用過,那就跳出,再出一次題。
// %: 取餘數
if(digit_used[n%10]){num=0;break;}
// 否則記入digit_used[]
else digit_used[n%10]=1;
// 記入第幾位數字為何之num_array[]
num_array[i]=n%10;
// 除以十,進入下一位數的處理。這邊會自動取整數,例如1234/10→123
n=n/10;
}
// 只要num==0(通常因為前面說過的問題)就繼續出題
}while(num==0);
// 答題:guess_num指所猜的數,A,B指?A?B
int guess_num,A,B,count=0;
// 無窮loop
while(1){
cout<<"請輸入4個不重覆的數字: ";
// 直接輸入全部4位數字
cin>>guess_num;
// 簡單檢查一下
if(guess_num<1234||guess_num>9876){
cout<<guess_num<<"不合範圍!"<<endl;
// 跳出
continue;
}
// 先把A,B歸零
A=0,B=0;
// 自個位到千位檢查
// 為了不更動guess_num,這邊拿n來作替身。
for(int i=0,n=guess_num;i<4;i++){
// num_array[],digit_used[]如前述
if(num_array[i]==n%10)A++;
else if(digit_used[n%10])B++;
// 除以十,進入下一位數的處理。
n=n/10;
}
// 輸出
cout<<"您第 "<<++count<<" 次猜測,您猜的數字為 "<<guess_num<<", ";
// 4A: 猜對了,跳出。
if(A==4){cout<<"Bingo! 恭喜您猜對了!"<<endl;break;}
cout<<A<<"A"<<B<<"B"<<endl;
}
// 最後輸出個換行
//cout<<endl;
// 結束
return 0;
}
g++ -pipe -o p13 p13.cpp && p13
請輸入4個不重覆的數字: 1234
您第 1 次猜測,您猜的數字為 1234, 0A2B
請輸入4個不重覆的數字: 99999
99999不合範圍!
請輸入4個不重覆的數字: 5678
您第 2 次猜測,您猜的數字為 5678, 0A0B
請輸入4個不重覆的數字: 2093
您第 3 次猜測,您猜的數字為 2093, Bingo! 恭喜您猜對了!