注册 登录
编程论坛 C语言论坛

猜数字游戏问题

wuxiami 发布于 2022-08-25 11:50, 2155 次点击

#include<stdio.h>

void main()
{


    int x;                            //随机生成数
    int n = 0;                           //输入的数
    int s = 0;                       //输入次数
    int a;                           //完全符合
    int b;                           //放置错误
    int g1, s1, b1, q1;              //n的各个数位
    int g2, s2, b2, q2;              //x的各个数位
    srand(time(0));                  //让随机生成数不重复
    x = rand() % 9999;
    for (;;)
    {
        printf("输入四位数字");
        scanf_s("%d", &n);

        g2 = x % 10;
        s2 = x / 10 % 10;
        b2 = x / 100 % 10;
        q2 = x / 1000;

        //输入
        int y = 0;       //while循环数字




        a = 0;                        //初始化
        b = 0;                          //初始化
        if (n == x)                    //猜的数字和生成随机数一样

        {
            printf("恭喜!经过%d次尝试,您答对了!\n", s);
            break;// exit(0);                                       //结束循环
        }
        else {//不一样的话  直接拆位
            g1 = n % 10;
            s1 = n / 10 % 10;
            b1 = n / 100 % 10;
            q1 = n / 1000;

            if (g1 == g2)    a++;
            if (s1 == s2)    a++;
            if (b1 == b2)    a++;
            if (q1 == q2)    a++;

            if (g1 == s2 || g1 == b2 || g1 == q2)    b++;
            if (s1 == g2 || s1 == b2 || s1 == q2)    b++;
            if (b1 == g2 || b1 == s2 || b1 == q2)    b++;
            if (q1 == g2 || q1 == s2 || q1 == b2)    b++;

            printf("有%d个数字完全符合,有%d个数字位置错误\n", a, b);
            s++;//次数增加
        }
    }
}



大佬们,一个猜数字的游戏,数字为4位,用户输入后,计算机进行判断,如果猜测的不正确,计算机要告诉用户,用户猜
      的数字,其中有几个数字的数值和位置是和正确的数字是一样的,有几个数字的数值和正确的数字一样,但是位置不
      一样。
      如正确的数字为7258
      用户输入1349的时候,计算机弹出提示:有0个数字完全符合,有0个数字位置错误
      用户输入1347的时候,计算机弹出提示:有0个数字完全符合,有1个数字位置错误
      用户输入7081的时候,计算机弹出提示:有1个数字完全符合,有1个数字位置错误
      用户输入2222的时候,计算机弹出提示:有1个数字完全符合,有3个数字位置错误
      用户输入8275的时候,计算机弹出提示:有1个数字完全符合,有3个数字位置错误
      用户输入7258的时候,计算机弹出提示:恭喜!经过6次尝试,您答对了!

vs2019下C语言

现在程序大部分情况可以正常运行  但是会发生这种情况:
输入四位数字0000
有0个数字完全符合,有0个数字位置错误
输入四位数字1111
有0个数字完全符合,有0个数字位置错误
输入四位数字2222
有0个数字完全符合,有0个数字位置错误
输入四位数字3333
有1个数字完全符合,有3个数字位置错误
输入四位数字4444
有0个数字完全符合,有0个数字位置错误
输入四位数字5555
有0个数字完全符合,有0个数字位置错误
输入四位数字6666
有1个数字完全符合,有3个数字位置错误
输入四位数字7777
有0个数字完全符合,有0个数字位置错误
输入四位数字8888
有2个数字完全符合,有4个数字位置错误
输入四位数字3688
有2个数字完全符合,有3个数字位置错误
输入四位数字

最后一个提示2完全符合   3位置错误
醉了
17 回复
#2
chenyucheng2022-08-25 12:18
看不懂,你说的是猜数字AB版吧。
游戏规则:有四个不同的随机0到9数字,让你猜这四个数字分别是什么,顺序与随机数字序列要一样。如果数字或顺序不一样,就给出“几A几B”的结果,A所处的数字代表猜对的且位置相同的数的数量,B代表正确答案中有但位置不同的数的数量。
#3
wuxiami2022-08-25 14:53
回复 2楼 chenyucheng
对的
#4
rjsp2022-08-25 15:11
醉了
总得解释一下为什么“醉了”吧
#5
wuxiami2022-08-25 16:01
回复 4楼 rjsp
我那个例子输入应该提示2个完全正确2个位置错误,就是完全正确的数字和位置错误的数字加起来最多为4

[此贴子已经被作者于2022-8-25 16:08编辑过]

#6
rjsp2022-08-25 16:11
以下是引用wuxiami在2022-8-25 16:01:27的发言:

我那个例子输入应该提示2个完全正确2个位置错误,就是完全正确的数字和位置错误的数字加起来最多为4

从你贴出来的信息上看不出来呀!
你告诉大家,你的 x 是什么值,你输入的 n 是什么值,只有这样大家才能判断“应该提示2个完全正确2个位置错误”是不是正确。
#7
wuxiami2022-08-25 16:48
如 rand生成的正确的数字为7258
      用户输入1349的时候,计算机弹出提示:有0个数字完全符合,有0个数字位置错误
      用户输入1347的时候,计算机弹出提示:有0个数字完全符合,有1个数字位置错误
      用户输入7081的时候,计算机弹出提示:有1个数字完全符合,有1个数字位置错误
      用户输入2222的时候,计算机弹出提示:有1个数字完全符合,有3个数字位置错误
      用户输入8275的时候,计算机弹出提示:有1个数字完全符合,有3个数字位置错误
      用户输入7258的时候,计算机弹出提示:恭喜!经过6次尝试,您答对了!



但是有时候 提示完全符合和位置错误加起来是5

[此贴子已经被作者于2022-8-25 17:57编辑过]

#8
rjsp2022-08-25 17:00
我们之间太难交流了,你只要告诉我你认为不正常(“醉了”)的地方,就是:
你的 x 是什么值,你输入的 n 是什么值,为什么你认为“应该提示2个完全正确2个位置错误”
#9
wuxiami2022-08-25 17:58
n是输入的四位数字  x是rand随机生成的四位答案

[此贴子已经被作者于2022-8-25 18:06编辑过]

#10
rjsp2022-08-25 19:22
但是有时候 提示完全符合和位置错误加起来是5

假设x是8683,n是3688,按照你的代码逻辑,那就是“有2个数字完全符合,有3个数字位置错误”呀
“有2个数字完全符合”没什么好说的
8683的第一个数字8,在3688的第三位第四位发现了
8683的第三个数字8,在3688的第四位发现了
8683的第四个数字3,在3688的第一位发现了
所以是“有3个数字位置错误”
#11
wuxiami2022-08-25 20:51
回复 10楼 rjsp
这会又搞出来一个绝对的问题  根据我实验  推出答案是7087
但是输入0700输出一个0正确4位置错误

输入四位数字0000
有1个数字完全符合,有3个数字位置错误         这一句推出有1个0
输入四位数字1111
有0个数字完全符合,有0个数字位置错误
输入四位数字2222
有0个数字完全符合,有0个数字位置错误
输入四位数字333
有0个数字完全符合,有1个数字位置错误
输入四位数字3333
有0个数字完全符合,有0个数字位置错误
输入四位数字4444
有0个数字完全符合,有0个数字位置错误
输入四位数字5555
有0个数字完全符合,有0个数字位置错误
输入四位数字6666
有0个数字完全符合,有0个数字位置错误        
输入四位数字7777
有2个数字完全符合,有2个数字位置错误           这一句退出两个7
输入四位数字8888
有1个数字完全符合,有3个数字位置错误        这一句退出1个8     得出四个数字为0778  但是不知道顺序  继续排查
输入四位数字0778
有0个数字完全符合,有4个数字位置错误
输入四位数字7708
有1个数字完全符合,有3个数字位置错误
输入四位数字8077
有2个数字完全符合,有2个数字位置错误
输入四位数字0111
有0个数字完全符合,有1个数字位置错误
输入四位数字1011
有1个数字完全符合,有0个数字位置错误
输入四位数字1101
有0个数字完全符合,有1个数字位置错误
输入四位数字1110
有0个数字完全符合,有1个数字位置错误
输入四位数字7666
有1个数字完全符合,有1个数字位置错误
输入四位数字6667
有1个数字完全符合,有1个数字位置错误
输入四位数字0700
有0个数字完全符合,有4个数字位置错误            这一句什么情况??明显有问题了
输入四位数字



[此贴子已经被作者于2022-8-25 21:00编辑过]

#12
wuxiami2022-08-25 21:16
回复 11楼 wuxiami
有2个数字完全符合,有4个数字位置错误
输入四位数字1111
有0个数字完全符合,有0个数字位置错误
输入四位数字2222
有0个数字完全符合,有0个数字位置错误
输入四位数字3333
有0个数字完全符合,有0个数字位置错误
输入四位数字4444
有0个数字完全符合,有0个数字位置错误
输入四位数字5555
有1个数字完全符合,有3个数字位置错误
输入四位数字6666
有1个数字完全符合,有3个数字位置错误
输入四位数字0056
有1个数字完全符合,有4个数字位置错误
输入四位数字0011
有1个数字完全符合,有2个数字位置错误
输入四位数字1001
有1个数字完全符合,有2个数字位置错误
输入四位数字1100
有1个数字完全符合,有2个数字位置错误
输入四位数字1010
有0个数字完全符合,有2个数字位置错误
输入四位数字0101
有2个数字完全符合,有2个数字位置错误
输入四位数字0501
有2个数字完全符合,有3个数字位置错误
输入四位数字0105
有3个数字完全符合,有2个数字位置错误
输入四位数字0606
有3个数字完全符合,有3个数字位置错误
输入四位数字0506
有2个数字完全符合,有4个数字位置错误              这句  哎
输入四位数字0605
恭喜!经过17次尝试,您答对了!
#13
rjsp2022-08-25 21:20
回复 11楼 wuxiami
你调试时在  x = rand() % 9999; 后面用 printf 把 x 输出来,就不需要瞎猜了
然后你就可以贴出“x等于多少,n等于多少时,输出什么,应当是什么”,别人就可以帮你查错
#14
纯蓝之刃2022-08-26 08:39
回复 10楼 rjsp
我认为这样应该合理些:
假设x是8683,n是3688。
第二个和第三个数字一样,有2个数字完全符合。
刨除2.3位,8683剩余第一位的8和第四位的3,3688剩余第一位的3和第四位的8,
3688剩余第一位的3在8683剩余第一位的8和第四位的3中出现,数字位置错误数量加1,
8683剩余第一位的8未匹配,3688剩余第四位的8在8683剩余未匹配中出现,数字位置错误数量加1。
结果 有2个数字完全符合,有2个数字位置错误。
#15
wuxiami2022-08-26 09:01
有没有更好的逻辑,能让这种情况下提示2个数字位置错误
#16
纯蓝之刃2022-08-26 09:06
程序代码:
#include <stdio.h>
#include <time.h>
#include <string.h>

struct position
{
    unsigned char state;    //0.未匹配,1.已匹配
    unsigned char val;
};

int main()
{
    struct position right[4],cur[4];
    int x,a,b,n,i,j;                       //输入的数
    int s = 0;                       //输入次数
    srand(time(0));
    x=rand() % 9999;

    right[0].val = x % 10;
    right[1].val = x / 10 % 10;
    right[2].val = x / 100 % 10;
    right[3].val = x / 1000;

    printf("值=%d\n",x);
    while(1)
    {
        printf("输入四位数字:");
        scanf("%d", &n);

        if (n == x)                    //猜的数字和生成随机数一样

        {
            printf("恭喜!经过%d次尝试,您答对了!\n", s);
            break;// exit(0);                                       //结束循环
        }
        else  //不一样的话  直接拆位
        {
            a = 0;                        //完全符合
            b = 0;                          //放置错误

            cur[0].val = n % 10;
            cur[1].val = n / 10 % 10;
            cur[2].val = n / 100 % 10;
            cur[3].val = n / 1000;
            for(i=0; i<4; i++)
            {
                if(right[i].val==cur[i].val)
                {
                    right[i].state=1;
                    cur[i].state=1;
                    a++;
                }
                else
                {
                    right[i].state=0;
                    cur[i].state=0;
                }
            }
            for(i=0; i<4; i++)
            {
                if(cur[i].state==0)
                {
                    for(j=0; j<4; j++)
                    {
                        if(right[j].state==0 && cur[i].val==right[j].val)
                        {
                            cur[i].state=1;
                            right[j].state=1;
                            b++;
                            break;
                        }
                    }
                }
            }

            printf("有%d个数字完全符合,有%d个数字位置错误\n", a, b);
            s++;//次数增加
        }
    }

    return 0;
}
#17
rjsp2022-08-26 09:19
回复 14楼 纯蓝之刃
你说得很对,所以我一直想知道题目作者真实的意图是什么,但是题目作者太混

以下是题目要求
一个猜数字的游戏,数字为4位,用户输入后,计算机进行判断,如果猜测的不正确,计算机要告诉用户,用户猜的数字,其中有几个数字的数值和位置是和正确的数字是一样的,有几个数字的数值和正确的数字一样,但是位置不一样。
如正确的数字为7258
      用户输入1349的时候,计算机弹出提示:有0个数字完全符合,有0个数字位置错误
      用户输入1347的时候,计算机弹出提示:有0个数字完全符合,有1个数字位置错误
      用户输入7081的时候,计算机弹出提示:有1个数字完全符合,有1个数字位置错误
      用户输入2222的时候,计算机弹出提示:有1个数字完全符合,有3个数字位置错误
      用户输入8275的时候,计算机弹出提示:有1个数字完全符合,有3个数字位置错误
      用户输入7258的时候,计算机弹出提示:恭喜!经过6次尝试,您答对了!

可惜根据以上信息,完全推导不出“x=8683, n=3688” 时应该输出“有2个数字完全符合,有3个数字位置错误”还是“有2个数字完全符合,有2个数字位置错误”
所以我只能根据题主贴的代码来认为他的输出是正常的,否则假如我能确认题目作者的意图是“x=8683, n=3688时,有2个数字完全符合,有2个数字位置错误”的话,就可以理直气壮地说“那是因为你的代码写得不符合题意”
#18
wuxiami2022-08-28 21:24
回复 10楼 rjsp
#include <stdio.h>  
 
int main()
{

    int x;     //随机生成数
    int n = 0; //输入的数
    int s = 0; //输入次数
    int a;     //完全符合
    int b;     //位置错误
    int n4[4]; // n的各个数位
    int x4[4]; // x的各个数位
    int flag[4] = { 0 };
    srand(time(0)); //让随机生成数不重复
    x = rand() % 9999;
    for (;;)
    {
        
        printf("输入四位数字:");
        scanf_s("%d", &n);
        s++; //输入次数增加

        x4[0] = x % 10;
        x4[1] = x / 10 % 10;
        x4[2] = x / 100 % 10;
        x4[3] = x / 1000;

        a = 0; //初始化
        b = 0; //初始化

        for (int i = 0; i < 4; i++)
            flag[i] = -1;
        if (n == x) //猜的数字和生成随机数一样

        {
            printf("恭喜!经过%d次尝试,您答对了!\n", s);
            break; // exit(0);                                       //结束循环
        }
        else
        { //不一样的话  直接拆位
            n4[0] = n % 10;
            n4[1] = n / 10 % 10;
            n4[2] = n / 100 % 10;
            n4[3] = n / 1000;

            for (int i = 0; i < 4; i++) //遍历x的四位数
            {
                for (int j = 0; j < 4; j++) // 遍历n的四位数
                {
                    if (x4[i] == n4[j]) //数字相等
                    {
                        if (i == j) //位置相同,
                        {
                            a++;
                            if (flag[j] != -1) //如果该位置被占用,则 b--,
                                b--;
                            flag[j] = i; //设置位置标记
                        }
                        else if (flag[j] == -1) // 位置不同
                        {
                            b++;
                            flag[j] = i;
                        }
                    }
                }
            }

            printf("有%d个数字完全符合,有%d个数字位置错误\n", a, b);
        }
    }
}

大佬们酱紫  可以实现 哎 搞的头大
1