主题:[原创]猜数字的一个小游戏,纯属原创,如有雷同,实属巧合。
一个猜数字的小游戏,它的规则如下:
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;
}
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;
}