按特定的比赛规则进行龟兔赛跑!
1.程序要求
比赛选手(乌龟Tortoise和兔子Hare)将从N+1个方格中的“方格0"开始比赛,每一个方格代表比赛路线上的一个可能位置,终点是“方格N”。到达或通过终点的第一个选手将被奖励一桶新鲜的胡萝卜和莴苣。比赛线沿着一个湿滑的山坡盘旋而上,所以选手可能会失足滑倒。
现在有一个每秒响一下的时钟,每当时钟响一下,程序就按照图1中的规则调整这两个动物选手的位置。
图1 乌龟和兔子位置调整规则
使用变量来记录这两个动物的位置(即位置数在 0~N 之间取值)。每个动物都从位置1(即起跑线)出发。若动物滑到方格0的左侧,将被重新放回方格 0。通过产生一个取值范围是1≤i≤10的随机整数i来实现图 1 中的百分比。对于乌龟,当1≤i≤5,“快速爬行”;当 6≤i≤7,“滑倒”;当 8≤i≤10,“缓慢爬行”。采用相同的技术来移动兔子。
开始比赛时,打印下列文字:比赛开始!
然后,时钟每响一下(即循环的每一次重复),打印一条具有 N+1 个格的线段(在乌龟的位置上显示字符T,在兔子的位置上显示字符 H。
在每条线都打印好后,测试是否有动物到达或者通过方格 N。若有,则打印出胜利者,终止比赛模拟。打印胜利的一方。
2.程序
(1)初始化赛道
void init(char grids[][GRIDS])//GRIDS赛道长度(格子数量)
{
for (int ani = 0; ani < ANIMALS; ani++)
{
for (int grid = 0; grid < GRIDS; grid++)
{
grids[ani][grid] = ' ';
}
}
}
(2)打印赛道
void print(char grids[][GRIDS])
{
for (int ani = 0; ani < ANIMALS; ani++)
{
for (int grid = 0; grid < GRIDS; grid++)
{
printf("+-");
}
printf("+\n");
for (int grid = 0; grid < GRIDS; grid++)
{
if (grid == 0)
{
grids[ani][grid] = ani % 2 == 0 ? 'T' : 'H';
printf(" %c", grids[ani][grid]);
//grids[ani][grid] = ' ';
//printf(" %c", grids[ani][grid]);
}
else
{
printf("|%c", grids[ani][grid]);
//grids[ani][grid] = ' ';
//printf("|%c", grids[ani][grid]);
}
}
printf("|\n");
}
for (int grid = 0; grid < GRIDS; grid++)
{
printf("+-");
}
printf("+\n");
}
(3)乌龟移动
void Tortorise(char grids[][GRIDS],int *pstep_tor)
{
int x = rand() % 10 + 1;
if ((x >= 1) && (x <= 5))
{
*pstep_tor += 3;
}
else if ((x == 6) || (x = 7))
{
*pstep_tor -= 6;
}
else
{
*pstep_tor += 1;
}
if (*pstep_tor <= 0)
{
*pstep_tor = 0;
}
if (*pstep_tor >= GRIDS - 1)
{
*pstep_tor = GRIDS - 1;
}
grids[0][*pstep_tor] = 'T';
}
(4)兔子移动
void Hare(char grids[][GRIDS], int* pstep_hare)
{
int y = rand() % 10 + 1;
if ((y == 1) || (y == 2))
{
*pstep_hare += 0;
}
if ((y == 3) || (y == 4))
{
*pstep_hare += 9;
}
if (y == 5 )
{
*pstep_hare -= 12;
}
if ((y >= 6) && (y <=8))
{
*pstep_hare += 1;
}
if ((y == 9) || (y == 10))
{
*pstep_hare -= -2;
}
if (*pstep_hare <= 0)
*pstep_hare = 0;
if (*pstep_hare >= GRIDS - 1)
*pstep_hare = GRIDS - 1;
grids[1][*pstep_hare] = 'H';
}
(5)判断胜者
void is_winner(char grids[][GRIDS])
{
char* arrofanimal[2] = { "Tortoise","Hare" };
for (int ani = 0; ani < ANIMALS; ani++)
{
//判断是否同时到达终点
if (grids[0][GRIDS - 1] == 'T' && grids[1][GRIDS - 1] == 'H')
printf("Both win!\n");
//判断胜利的一方
if (grids[ani][GRIDS - 1] != ' ')
{
printf("%s is winner!\n", arrofanimal[ani]);
}
}
}
(6)主函数
main()
{
srand(time(NULL));
//Sleep(1000);
int step_tor = 0;//起点
int step_hare = 0;
printf("准备!\n");
//初始化赛道
char grids[ANIMALS][GRIDS] = { 0 };
init(grids);
print(grids);
int i = 0;
int n = 1;
//while (n <= 20)//只要没有冲过终点线,循环
while (grids[0][GRIDS - 1] == ' ' && grids[1][GRIDS - 1] == ' ')//只要没有冲过终点线,循环
{
if (n == 1)
{
printf("比赛开始!\n");
}
Tortorise(grids, &step_tor);
Hare(grids, &step_hare);
printf("i = %d,第%d次跳\n", i, n);
print(grids);
n++;
}
is_winner(grids);
}
经过多次测试,比较神奇的是,当赛道较短时(设置N=10),乌龟有可能赢;当赛道较长(设置N=20/30/40),乌龟就没赢过!天赋决定的???₍˄·͈༝·͈˄₎◞ ̑̑*