求大佬用c语言写一段关于数字竞猜的代码?
(2)计算每次游戏分值,例如:某一个位置的数字猜对,可设置得1分,全对得4分;
(3)将前三名显示出来,显示的信息应有提示,并分行排列 展开
作弊模式默认开启,可以直接看到生成的随机数(为了调试)。关闭设置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;
}