一个猜数字游戏的算法

来源:互联网 发布:tagsinput.js 参数 编辑:程序博客网 时间:2024/06/05 05:54

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                                                                                   // 
//      软件名:猜数字1.0                                                                            //
//      作  者:owl                                                                                         //
//      时  间:2004.10.21                                                                            //
//      说  明:由计算机生成四个不重复的0-9之间的任意数,          //
//              后由玩家输入,计算机根据输入比较两组数字?                  //
//              给出类似xAyB的信息,A表示数字和相应的位置                //
//              都正确,B表示数字正确,但位置不正确。分别                 //
//              用x,y来表示两种情况,完全正确则显示“ok”                //
//              如果输入10次还没得到正确结果。算游戏失败,               //
//              程序会输出底数。                                                                   //
//                                                                                                                 //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <cstdlib>
#include <cctype>
#include <vector>
#include <algorithm>
using namespace std;
const int vec_size = 4;
const int err_max = 10;
int play(void);
int main(void)
{
    bool stat = true;
    srand(time(NULL));
    cout << "欢迎加入猜数字游戏!" << endl;
    while(stat == true)
    {
        cout << "按y进入游戏,按任意键退出:";
        char c = cin.get();
        if(c == 'y')        
           play();
        else
          stat = false;
    }           
    system("pause");
    return 0;
}
const vector<int>& rand_data(vector<int>& a)
{  
    for(int i = 0; i < vec_size; ++i)
    { 
        int t = rand()%10;
        if(find(a.begin(), a.end(), t) == a.end())
            a.push_back(t);
        else
         --i;                              
    }       
    return a;
}
bool counter( const vector<int>& a,
              const vector<int>& v )
{
   int x = 0,y = 0;
    
   for(int i = 0; i < vec_size; ++i)
     for(int j = 0; j < vec_size; ++j)
     {        
         if(v[i] == a[j])
           if(i == j)
          x++;
            else
             y++;
        }
   if(x == vec_size)
       return true;  

   cout << x << "A" << y << "B" << endl;             
   return false;
}
bool Isdigit(int elem)
{
    char c = '0';   
    const int step = c - 0;
    return isdigit(elem + step);
}
const vector<int>& in(vector<int>& v)
{   
    cout << "请输入不重复的四个数字(0-9),以空格分割!"
        << endl;
    for(int i = 0; i < vec_size; ++i)
        cin >> v[i];
    for(int i = 0; i < vec_size; ++i)
    {
        if(Isdigit(v[i]) == false)
          {
              cerr << "必须是0-9之间的数字!请重新输入第"
                   << i+1
                   << "个数字:" ;
              cin >> v[i];
          }       
       for(int j = 0; j < vec_size; ++j)
          if(v[i]==v[j] && i!=j)
          {
              cerr << "错误,请重新输入第"
                 << i+1
                 << "个数字!"
                 << endl;
              cin >> v[i];
              --i;
          }
      }           
    return v;    
}
void out(vector<int>& a, bool stat)
{
    if(stat == false)
    {
        cout << "你输了。这次的底数是:";   
     for(size_t i = 0; i < a.size(); ++i)
       cout << a[i] << " " ;
        cout << endl;
        cout << "请再努力~!" << endl;
    }
    else
        cout << "OK!!! 恭喜你过关!" << endl;   
      
}
int play(void)
{
    vector<int> a;
    vector<int> v(vec_size);
    bool stat = false;
    rand_data(a);
    for(int i = 0; i < err_max; ++i)
    {
        in(v);
        if( stat = counter(a,v) )
         break;        
    }
    out(a, stat);
    return 0;
}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小蚂蚁咬了肿了怎么办 锦鲤鱼尾巴烂了怎么办 泰迪身上长白毛怎么办 鱼身上有红斑了怎么办 新买锦鲤不吃食怎么办 鱼身上有红血丝怎么办 大腿内侧有红色条纹怎么办 腿上出现红血丝怎么办 孕妇有脚气,很痒怎么办 孕晚期脚气很痒怎么办 孕期有脚气很痒怎么办 激光后留下色沉怎么办 腋下很黑怎么办怎样才能变白 屁股上长一块癣怎么办 鼻两侧一热发红怎么办 脸上起皮发红痒怎么办 自癜风发红发痒怎么办 脸又干又痒怎么办 脸发红还有点痛怎么办 脸过敏了红痒怎么办 脸两边一片红痒怎么办 婴儿大腿内侧破皮怎么办 宝宝大腿根淹了怎么办 大腿一走路就疼怎么办 下面痒怎么办用什么洗 长藓怎么办用什么药膏 小腿长湿疹很痒怎么办 产后排不出大便怎么办 3岁宝宝大便不通怎么办 腿上干燥像鱼鳞怎么办 一岁脸上长癣怎么办 脖子长了一片癣怎么办 深圳摇到车牌后怎么办 发现车被套牌了怎么办 我车牌被套牌了怎么办 车子被别人套牌怎么办 车被别人套牌了怎么办 被套牌了有违章怎么办 车被套牌了怎么办报警 车牌被别人套了怎么办 被别人套牌了该怎么办