2007年5月29日

AB2007.cpp

有人要的


// 猜數字遊戲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! 恭喜您猜對了!

沒有留言: