一个猜数字的小游戏,它的规则如下:
1、计算机随机产生几个各不相同的 0 到 9 之间的数字,要求按次序猜出。
2、猜中其中的数字,而且次序相同,记为情况 A .
3、猜中其中的数字,但是次序不同,记为情况 B.
4、在规定次数中猜不出,为输,默认次数为10。
举例:如计算机随机产生的不同数字为 8971,猜1985为 1A2B,猜1234为 0A1B,猜5891为 0A4B.

//---------------------------------------------------------------------
这个小程序是我学C++三个月后,用了2个半小时尝试做的,不足之处,敬请原谅。
不过我知道它有一个 Bug ,就是输入不是数字的其他字符时会出错,还有不会用VC,界面很粗糙。
希望有人将它改进,发扬光大,是不是用错成语了?^_^。
//-----------------------------------------------------
这个随机数类很简陋,性能不太好,不过用在这样的 toy programm 足够了。


include<iostream>
#include<time.h>
#include<iomanip>
using namespace std;

const int N=4;
  /*随机产生不相同数字的个数,但不能大于10,因为不同的数字0到9只有10个。超过10个程序会无限循环,切记切记。*/
const int max_guess_times=10;//最多可以猜的次数。

int A_count( int a[], int b[], int n=N);//返回情况 B 的个数。
int B_count( int a[], int b[], int n=N);//返回情况 A 的个数。
bool equal ( int a[], int b[], int n=N);//判断两个数组是否相等(a[i]=b[i] )
int digit_to_int( char ch);    //将数字字符'i'转变成相应的数值。如'9'变为9,
void output( int a[], int n=N);         //按次序输出一个数组。
void print();                    //打印

class Random
{
public:
    Random();
    unsigned int random( int n=9);// 产生 0 到n之间的随机整数
private:
    unsigned int  randSeed;// 种子,为正整数。
};
//-------------------------------------------------------------
int main()
{
    print();

    Random rand;
    int rand_array[N];//储存随机产生0到9之间的不同数字

    rand_array[0]=rand.random();
    for( int i=1; i<N; )
    {
        rand_array[i]=rand.random();
        bool run=true;

        for( int j=i-1; j>=0; j--)
            if( rand_array[i]==rand_array[j])
            {
                run=false;
                goto OK;//跳出循环
            }
        OK:
        if( run)
            i++;
    }//保证数字各不相同
    
    int guess_array[N];//储存用户猜的数字
    int count=0;     //已猜的次数
    char input;    //输入字符。
    do
    {
        cout<<endl;
        cout<<"输入你猜的数字:  ";
        for( i=0; i<N; i++)
        {
            cin>>input;
            guess_array[i]=digit_to_int(intput);
        }
        cin.ignore(100,'\n');
        cout<<endl;
        count++;
    
        int A=A_count( guess_array, rand_array );
        int B=B_count( guess_array, rand_array );
        
        cout<<count<<")"<<setw(6);
        output( guess_array);
        cout<<setw(25)<<A<<" A "<<B<<" B"<<endl;

    } while( !equal( rand_array, guess_array )&&count<max_guess_times );


    cout<<endl<<endl;
    cout<<"------------------------------------------------------------                ----"<<endl;
    cout<<endl;

    cout<<"正确答案    ";
    output( rand_array );
    cout<<endl<<endl;

    if( count==max_guess_times)
    {
        cout<<"你在"<<max_guess_times<<"次之内猜不出来,输 啦!"<<endl;
    }
    else cout<<"你很聪明啊!佩服佩服。"<<endl;

    cout<<endl;
    cout<<"按任意键后按回车退出.   ";
    char ins;
    cin>>ins;

    return 0;
    
}
//-----------------------------------------------
Random::Random()
{
    randSeed=time(0);// 用系统时间产生种子
}

unsigned int Random::random( int n)
{
    const int multiplier=2743;
    const int adder=5923;
    randSeed=multiplier*randSeed+adder;//线性同余法
    return randSeed % (n+1);
}
//---------------------------------------------------
int A_count( int a[], int b[], int n)
{
    int count=0;
    for( int i=0; i<n; i++)
    {
        if( a[i]==b[i])
            count++;
    }
    return count;
}
//-----------------------------------------------
int B_count( int a[], int b[], int n)
{
    int count=0;
    for( int i=0; i<n; i++)
    {
        for( int j=0; j<n; j++)
            if( a[i]==b[j] && a[i]!=b[i])
                count++;
    }
    return count;
}
//------------------------------------------------
void output( int a[], int n)
{
    for( int i=0; i<n; i++)
        cout<<a[i]<<setw(5);
}
//--------------------------------------------------
bool equal ( int a[], int b[], int n)
{
    for( int i=0; i<n; i++)
        if( a[i]!=b[i])
            return false;
    return true;
}
//--------------------------------------------------
int digit_to_int( char ch)
{
    return static_cast<int>(ch)-static_cast<int>('0');
    /*数字字符在计算机中的编码是连续的,强制转换成整形时返回的是它的编码的第几位 如'0'是第48位,'6'是54位,这样子static_cast<int>('6')-static_cast<int>('0')就是 54-48=6 了,故会返回6。*/
}
//-------------------------------------------------
void print()
{
    cout<<"  ---------------------------------------------------------------------------"<<endl;
    cout<<"  --               猜数字的小游戏, Good Luck To You!                       --"<<endl;
    cout<<"  ---------------------------------------------------------------------------"<<endl;
    cout<<endl<<endl;
    cout<<setw(28)<<"只有"<<max_guess_times<<"次机会! 好好把握啊。"<<endl<<endl;
}