题目是:两方从1开始轮流报数,每次每方可报一个或两个连续的数,谁先报到30,谁胜利。首先生成一个随机数来确定谁先报数。其中计算机报数的原则是:若剩下数的个数除以3,余数为1,则报一个数;若剩下数的个数除以3余数为2则报两个数。否则随机报一个或两个数。请编程实现这个游戏:答案给出代码如下,请问答案为什么用s而不是30-s表示剩余数个数?
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
int Input(int t);
int ControlComputer(int s);
int Rnd();
int main()
{
int tol = 1;
if (Rnd() == 1)
{
tol = Input(tol);
}
while (tol < 30)
{
tol = ControlComputer(tol);
if (tol == 30)
{
printf("Player lose\n");
}
else
{
tol = Input(tol);
if (tol >= 30)
{
printf("Computer lose\n");
}
}
}
printf("Game Over");
return 0;
}
int Input(int t)
{
int a;
do {
printf("please count\n");
scanf("%d", &a);
if (a > 2 || a < 1) {
printf("Error input\n");
}
else
{
printf("you count is %d\n", t + a);
}
} while (a > 2 || a < 1);
return t + a;
}
int ControlComputer(int s)
{
int c;
printf("computer count\n");
if ( s% 3 == 1)
{
s++;
printf("%d\n", s);
}
else if (s % 3 == 2)
{
s += 2;
printf("%d\n", s);
}
else
{
c = Rnd() + 1;
s += c;
printf("%d\n", s);
}
return s;
}
int Rnd()
{
srand(time(NULL));
return rand() % 2;
}
可是s变化,30-s不也就跟着动态变化吗
请问剩余数为什么用s表示呢?
追答根据代码的逻辑,s并不是表示剩余的数个数。实际上,s代表的是当前玩家或计算机所报的数。
在ControlComputer函数中,根据当前剩余的数个数s的模3来决定计算机报数的策略。如果s%3为1,表示剩余数个数除以3余数为1,计算机报一个数。如果s%3为2,表示剩余数个数除以3余数为2,计算机报两个数。其他情况下,计算机根据随机数决定报一个或两个数。
所以,s是根据当前剩余的数个数来确定计算机报数的策略,并不是表示剩余的数个数。
您这话我有点没太搞懂 一会儿“s并不是表示剩余的数的个数”,一会儿“根据当前剩余的数的个数s”所以到底是什么意思?
请问为什么“每次报数结束后,剩余数的个数都会增加1”啊?不应该是每次报数结束后剩余数的个数都会减少吗?