C++入门之 0001 猜数字

一、引言

  猜数字(Bull and Cows)是一种大概于20世纪中期兴起于英国的益智类小游戏。一般由两个人玩,也可以由一个人和计算机玩,在纸上、网上都可以玩。该游戏规则简单,但可以考验人的严谨和耐心。

  游戏规则:

      参与游戏的两方,一方出数字,另一方猜数字。出数字的人要想好一个没有重复数字的4位数,不能让猜的人知道。猜的人就可以开始猜,每猜一个数字,出数者就要根据这个数字给出几A几B,其中A前面的数字表示位置正确的个数,而B前面的数字表示数字正确而位置不对的数的个数。

      例如,正确答案为5346,猜数字的人猜的数字为5238,则提示1A1B,其中有一个5位置对了,记为1A,而3数字对了,而位置不对,因此即为1B,合起来就是1A1B。

      接着,猜数字的人根据出题者的几A几B继续猜,直到猜中(即4A0B)为止。

二、系统设计

    本系统属于典型的小游戏,是针对单机版开发的益智类小游戏。

   ① 灵活的操作,可以自动判断胜负;

  ②系统采用良好的人机对话模式,界面设计美观良好;

   ③系统运行稳定、安全可靠。

  2.1 具体要求

   2.2 设计思路

 三、具体实现

   3.1 文件引用

  3.2 主要功能实现

     3.2.1 主函数

   

主程序的执行流程

3.2.2   猜数字函数执行过程

自定义guess函数,作用是产生随机数并将输入的数与产生的数作比较,并将比较后的提示信息输出。

3.3 代码实现 

//头文件的引用
#include"stdafx.h"
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<windows.h>
void guess(int n); //自定义函数声明
/*使用Windows API函数封装
void gotoxy(int &&x, int &&y)
{
    COORD coord={x,y};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}*/ //此处定义的gotoxy函数,出现错误提示信息,所以另外编写gotoxy,原理一样
void gotoxy(int x, int y) {
    COORD pos;
    pos.X=x;
    pos.Y=y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
/*main函数作为程序的入口函数,通过输入相应的数字选择不同的功能*/

void main()
{
    int i,n;                                     /*定义整型变量*/
    while(1)                                     /*循环条件*/
    {
        system("cls");                           /*清屏*/
        gotoxy(15,6);                            /*将光标定位*/
        printf("1.start game");                  /*1 开始游戏*/
        gotoxy(15,8);                            /*光标定位*/
        printf("2.Rule");                        /*2 显示规则*/
        gotoxy(15,10);                           /*光标定位*/
        printf("3.exit\n");                      /*3 退出*/
        gotoxy(25,15);
        printf("please choose: ");               /*提示用户选择*/
        scanf("%d",&i);                          /*接收用户输入信息*/
        switch(i)                                /*根据不同的输入执行不同的操作*/
        {
        case 1:                                  /*如果用户选择1,则开始游戏*/
            system("cls");
            printf("please input n:\n");         /*输入使用的数字个数*/
            scanf("%d",&n);                      /*接收用户输入*/
            guess(n);                            /*调用guess函数*/
            Sleep(5);                            /*程序停止5秒钟*/
            break;                               /*跳出循环*/
        case 2:                                  /*输出游戏规则*/
            system("cls");
            printf("\t\tThe Rules Of The Game \n");
            printf("step1: input the number of digits\n");
            printf("step2: input the number,separated by a space between two numbers\n");
            printf("step3: A represent location and data are correce\n");
            printf("\tB represent location is correct but data is wrong!\n");
            Sleep(800);
            break;
        case 3:
            exit(0);                             /*退出游戏*/
        default:                                 /*默认*/
            break;                               /*跳出*/
        }
    }
}
/*自定义函数guess*/
void guess(int n)
{
    int acount,bcount,i,j,k=0,flag,a[10],b[10];
    do
    {
        flag=0;
        srand((unsigned)time(NULL));              /*利用系统时钟设定种子*/
        for(i=0;i<n;i++)
            a[i]=rand()%10;                       /*每次产生0~9范围内任意的一个随机数并存到数组a中*/
        for(i=0;i<n-1;i++)
        {
            for(j=i+1;j<n;j++)
                if(a[i]==a[j])                      /*判断数组a中是否有相同数字*/
                {
                    flag=1;                         /*若有上述情况则标志位置1*/
                    break;
                }
        }
    }while(flag==1);                                /*若标志位为1,则重新分配数据*/
    do
    {
        k++;                                        /*记录猜数字的次数*/
        acount=0;                                   /*每次猜的过程中位置与数字均正确的个数*/
        bcount=0;                                   /*每次猜的过程中位置不正确但数字正确的个数*/
        printf("guess:");
        for(i=0;i<n;i++)
            scanf("%d",&b[i]);                       /*输入猜测的数据到数组b中*/
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
            {
                if(a[i]==b[i])                       /*数据相同且位置相同的个数*/
                {
                    acount++;
                    break;
                }
                if(a[i]==b[j]&&i!=j)                 /*数据相同但位置不同*/
                {
                    bcount++;
                    break;
                }
            }
            printf("clue on:%dA %dB\n\n",acount,bcount);
            if(acount==n)                           /*判断acount是否与数字的个数相同*/
            {
                if(k==1)                            /*如果用户一次就输入正确*/
                    printf("you are the topmost rung of Fortune's ladder!!\n\n");
                else if(k<=5)                       /*如果用户5次以内猜正确*/
                    printf("you are genius!!\n\n");
                else if(k<=10)                      /*如果用户10次以内猜正确*/
                    printf("you are cleaver!!\n\n");
                else
                    printf("you need try hard!!\n\n");
                    getchar();
                    printf("按任意键继续");
                    getchar();
                break;
            }
    }while(1);
}

3.4 实现效果

主界面
规则显示

3.5 后记

gotoxy函数可以使光标移动到指定位置,但是,C++标准库中没有
这个函数,所以我们只能自己定义。
定义它需要用到一个叫做SetMouseControlCursor的东西,就是移动光标 ,见上述程序源代码

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值