C语言模拟龟兔赛跑

按特定的比赛规则进行龟兔赛跑!

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),乌龟就没赢过!天赋决定的???₍˄·͈༝·͈˄₎◞ ̑̑*

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值