求大佬用c语言写一段关于数字竞猜的代码?

用户从键盘输入4位不重复的数,来匹配计算机给出的4位随机数,若数字和位置均等同,表示用户赢了。每猜一次,计算机均给出提示信息(x,y),x表示数字、位置都匹配的个数;y表... 用户从键盘输入4位不重复的数,来匹配计算机给出的4位随机数,若数字和位置均等同,表示用户赢了。每猜一次,计算机均给出提示信息(x,y),x表示数字、位置都匹配的个数;y表示数字匹配但位置不匹配的个数程序运行后,可设置文本菜单提示,选择“1”是输入数据,选择“2”是显示名次(最多前三名),选择“3”是退出等;(提示信息应该友好,例如:要求用户从键盘输入数据时,可提示:”请输入一个包含4位无重复数字的数:”);
(2)计算每次游戏分值,例如:某一个位置的数字猜对,可设置得1分,全对得4分;
(3)将前三名显示出来,显示的信息应有提示,并分行排列
展开
 我来答
自我编程
2019-12-05 · 科技优质答主
自我编程
采纳数:1481 获赞数:4283

向TA提问 私信TA
展开全部

作弊模式默认开启,可以直接看到生成的随机数(为了调试)。关闭设置0。

4位随机数及输入的数字自动检查重复性。

计分规则按照常量设定,可改。

排行榜自动更替,名次被顶替,会自动降低排名。

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <conio.h>

#include <windows.h>

#define CM 1//作弊模式开启标识,1表示开启,0关闭

#define MAXN 9//每位数字最大值(0~MAXN)

#define XR 1//x计分值

#define YR 0//y计分值

int checkDup(int nums[],int len);//检查数组重复性,有数字重复返回1,重复返回0

int *getRnums();//生成4位不重复的随机数

int *inputNums(int rnums[4]);//输入4个不重复的数字,输入成功计算正确性返回xy数组,失败返回NULL

int setRank(int uIfos[3][2],int x,int y);//计算得分并且更新排行榜

int main(){

    int n=0,i,uIfos[3][2]={{-1,-1},{-1,-1},{-1,-1}},*rnums=NULL,*xy=NULL;

    srand(time(NULL));

    while(1)

    {

        n=0,rnums=NULL,xy=NULL;

        system("cls");

        printf("1、输入数据\n2、显示名次(最多前三名)\n3、退出\n");

        while(n<1 || n>3)

            scanf("%d",&n);

        switch(n)

        {

            case 1:

                system("cls");

                rnums=getRnums();

                while(1)

                {

                    xy=inputNums(rnums);

                    if(!xy)

                        printf("数字有重复!请重新输入\n");

                    else

                        break;

                }

                printf("本次全对个数%d个,仅数字正确%d个\n",xy[0],xy[1]);

                setRank(uIfos,xy[0],xy[1]);

                break;

            case 2:

                system("cls");

                printf("排行榜:\n");

                for(i=0;i<3 && uIfos[i][0]!=-1;i++)

                    printf("第%d名:全对个数%d个,仅数字正确%d个,得分:%d\n",i+1,uIfos[i][0],uIfos[i][1],uIfos[i][0]*XR+uIfos[i][1]*YR);

                break;

            case 3: return 0; break;


        }

         printf("任意键继续。。。。。。\n"),getch();

    }

    return 0;

}

int checkDup(int nums[],int len)//检查数组重复性,没有数字重复返回1,重复返回0

{

    int i,j;

    for(i=0;i<len;i++)

        for(j=0;j<len;j++)

            if(i!=j && nums[i]==nums[j])//数字重复

                return 0;

    return 1;

}

int *getRnums()//生成4位不重复的随机数

{

    static int rnums[4];

    int len=0;

    while(len<4)//生成4位不重复的随机数

    {

        rnums[len]=rand()%(MAXN+1);

        if(checkDup(rnums,len+1))

            len++;

    }

    if(CM)

        printf("\n当前4位随机数为:%d%d%d%d (作弊开启)\n",rnums[0],rnums[1],rnums[2],rnums[3]);

    return rnums;

}

int *inputNums(int rnums[4])//输入4个不重复的数字,输入成功计算正确性返回xy数组,失败返回NULL

{

    static int xy[2]={0};

    int i,j,nums[4];

    printf("\n请输入一个包含4位无重复数字的数:");

    xy[0]=xy[1]=0;

    for(i=0;i<4;i++)

        scanf("%d",&nums[i]);

    if(!checkDup(nums,4))//数字重复

        return NULL;

    for(i=0;i<4;i++)

        for(j=0;j<4;j++)

            if(nums[i]==rnums[j] && i==j)//完全正确,x++

                xy[0]++;

            else if(nums[i]==rnums[j] && i!=j)//数字正确位置不正确,y++

                xy[1]++;

    return xy;

}

int setRank(int uIfos[3][2],int x,int y)

{

    int i,rankNum=0;

    printf("当前计分规则:数字及位数全对记%d分,仅数字正确记%d分\n",XR,YR);

    rankNum=x*XR+y*YR;

    printf("本次玩家得分:%d\n\n",rankNum);

    for(i=0;i<3;i++)

        if((uIfos[i][0]<x)||(YR>0 && (uIfos[i][0]==x) && (uIfos[i][1]<y)))

        {

            if(uIfos[i][0]!=-1 && i<2)//榜上已有记录者,往下移位

            {

                uIfos[2][0]=uIfos[1][0],uIfos[2][1]=uIfos[1][1];

                if(i==0)

                    uIfos[1][0]=uIfos[0][0],uIfos[1][1]=uIfos[0][1];

            }

            uIfos[i][0]=x,uIfos[i][1]=y;//首次占榜位,直接更新

            break;

        }

    return rankNum;

}

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式