C语言,两个人轮流报数,从1开始依次报数,每人每次只能报1个数或2个数,谁先报到30谁获胜,

#include <stdio.h>
#include <stdlib.h>

int Rn()
{
int a;
srand(time(NULL));
a=rand()%2+1;
return a;
}
int Hg(int c,int a)
{
switch(c)
{case 1:
printf("%d\n",a);
a++;
break;
case 2:
printf("%d\n",a);
a++;
printf("%d\n",a);
a++;
}
return a;
}
int Cg(int a)
{
int d;
d=(30-a)%3+1;
switch(d)
{
case 3:
if(Rn()==1)
goto ONE;
else
goto TWO;
ONE:case 1:
printf("%d\n",a);
a++;
break;
TWO:case 2:
printf("%d\n",a);
a++;
printf("%d\n",a);
a++;}
return a;
}
main()
{
int a,y,c,d,b;
a=1;
do
{
printf("how many numbers do you want to input?(1 or 2)");
scanf("%d",&c);
Hg(c,a);
a=Hg(c,a);
if(a>=30)
{
b=1;
break;
}
Cg(a);
a=Cg(a);
if(a>=30)
{
b=2;
break;
}
}while(a<=30);
switch(b)
{
case 1:printf("huaman has won!");
break;
case 2:printf("computer has won!");
}
}
不知道哪儿有问题

逻辑没看。

你既然用到time函数,头文件应该导入time.h.

建议少用goto,按照你的代码结构,可以简化。以下参照你的代码改的:

#include <stdio.h>
#include <stdlib.h>
#include<time.h>
#define maxNum 30 //最大叫数值
int Cg(int c);
int Hg(int c);
int Rn();
int main()
{
    int c=0,n;
    while(1)
    {
        printf("请选择谁先叫数(1、玩家;2、电脑):");
        scanf("%d",&n);
        if(n!=1 && n!=2)
                printf("输入错误,重新输入!\n");
            else
                break;
    }

    while(c<30)
    {
        switch(n)
        {
            case 1:c=Hg(c);break;
            case 2:c=Cg(c);break;
        }
    }

    return 0;
}
int Rn()
{
    int a;
    srand(time(NULL));
    a=rand()%2+1;
    return a;
}
int Hg(int c)//玩家叫数 返回叫数后的累加值 参数:c累加值
{
    int i=1,n;
    while(1)//输入验证
    {
        printf("玩家回合,请输入叫数次数(1或者2):") ;
        scanf("%d",&n);
        if(n!=1 && n!=2)
            printf("输入错误,重新输入!\n");
        else
            break;
    }

    while(n--)
    {
        printf("    玩家第%d次叫数:%d\n",i++,++c);
        if(c==maxNum)
        {
            printf("玩家首先叫到30,玩家胜利!!\n");
            return c;
        }
    }
    c=Cg(c);
    return c;
}
int Cg(int c)//电脑叫数 返回叫数后的累加值 参数:c累加变量指针,随机值
{
    int i=1,a=Rn();
    printf("电脑回合,电脑叫数次数:%d\n",a) ;
    while(a--)
    {
        printf("    电脑第%d次叫数:%d\n",i++,++c);
        if(c==maxNum)
        {
            printf("电脑首先叫到30,电脑胜利!!\n");
            return c;
        }
    }
    c=Hg(c);
    return c;
}

另外:如果将累加变量c写成公共变量,或者在main中定义c,然后传址,代码还会更简化。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-05-06
/*两个人从1开始报数,每人每次可报一个数或者连续两个数,谁先报到30,谁为胜方,通过生成一个随机函数决定谁来报数
*电脑报数的原则,余下的数字除以3,余1,则报一个数,余2则报2个数,否则则随机报1个数或者两个数
*/
/*实现电脑和玩家报数*/
void num();
int showbaoshu();
int main()
{
num();
return 0;
}
void num()
{
int i; //用户输入的值
int j=0; //电脑输入的值
srand(time(NULL));
if(rand()%2==0)
{
j++;
printf("由电脑先报数");
printf("电脑报的数为:%d\n",j);
}else{
printf("由玩家先报数:\n");
}
while(1)
{

i= showbaoshu();
if(i>j+2||i<j)
{
printf("不遵守游戏规则,系统强制退出");
return;
}
if(i>=30)
{
printf("玩家获胜");
break;
}
if(j>=30)
{
printf("电脑获胜");
break;
}
if((30-i)%3==1) //余数为1,生成一个数
{
j= i+1;
printf("%d",j);
continue;

}
if((30-i)%3==2) //余数为2,生成两个数
{
j =i+2;
printf("%d%d",j-1,j);
continue;

}
if((30-i)%3!=2&&(30-i)%3!=1)
{
if(rand()%2==0)
{
j= i+1;
printf("%d",j);
continue;
}else{
j=i+2;
printf("%d%d",j-1,j);
continue;
}

}

}
}
int showbaoshu()
{
int i,j;
printf("请选择要报一个数还是两个数(输入数字1报一个数,输入数字2报两个数)\n");
getch();
if(getch()=='1')
{
printf("请输入你要报的数字");
scanf("%d",&i);
j=0;
fflush(stdin);
}
if(getch()=='2')
{
printf("请输入你要报的数字");
scanf("%d",&i);
printf("请在输入你要报的下一个数字");
scanf("%d",&j);
fflush(stdin);
}

return i>j? i:j;
}
相似回答