循环链表练习(二)--轮盘赌游戏

工科生一枚,热衷于底层技术开发,有强烈的好奇心,感兴趣内容包括单片机,嵌入式Linux,Uboot等,欢迎学习交流!
爱好跑步,打篮球,睡觉。
欢迎加我QQ1500836631(备注CSDN),一起学习交流问题,分享各种学习资料,电子书籍,学习视频等。

游戏规则
  n 个参加者排成一个环,每次由主持向左轮手枪中装一颗子弹,并随机转动关上转轮,
游戏从第一个人开始,轮流拿枪;中枪者退出赌桌,退出者的下一个人作为第一人开始下一轮游戏。直至最后剩余一个人,即为
胜者。要求:模拟轮盘赌的游戏规则,找到游戏的最终胜者。
思路
  解决类似的问题,使用线性表的顺序存储结构和链式存储结构都能实现,根据游戏规则,在使用链式存储结构时只需使用循环链
表即可轻松解决问题。
  采用顺序存储结构时,同样要在脑海中将数组的首尾进行连接,即当需要从数组中最后一个位置寻找下一个位置时,要能够跳转到数组的第一个位置。(使用取余运算可以解决)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct Gambler
{
	int number;
} Gambler;
int main()
{
	int n;
	/*游戏轮数*/
	int round = 1;
	/*开始的位置*/
	int location = 1;
	/*随机的第i次出局 范围1-5*/
	int shootNum;
	int i, j;
	/*设置获得随机数的种子(固定代码,没有这句,随机数是固定不变的)*/
	srand((int)time(0)); 
	printf("输入赌徒的人数:");
	scanf("%d", &n);
	printf("将赌徒依次编号为1-%d\n", n);
	/*存储赌徒编号的数组*/
	Gambler Gamblers[n + 1]; 
	for (i = 1; i <= n; i++)
	{ /*依次为参加者分配编号*/
		Gamblers[i].number = i;
	}
	//当只剩余一个人时,此场结束
	while (n != 1)
	{
		printf("第%d 轮开始,从编号为%d 的人开始,", round, Gamblers[location].number);
		shootNum = rand() % 6 + 1;
		printf("枪在第%d 次扣动扳机时会响\n", shootNum);
		/*找到每轮退出的人的位置(i-1 才是,此处求得的i 值为下一轮开始的位置)*/
		for (i = location; i < location + shootNum; i++);
		/*由于参与者排成的是环,所以需要对求得i值进行取余处理*/
		i = i % n; 
		if (i == 1 || i == 0)
		{ /*当i=1 或者i=0时,实际上指的是位于数组开头和结尾的参与者,需要重新调整i的值*/
			i = n + i;
		}
		printf("编号为%d 的赌徒退出赌博,剩余赌徒编号依次为:\n", Gamblers[i - 1].number);
		/*使用顺序存储时,如果删除元素,需要将其后序位置的元素进行全部前移*/
		for (j = i - 1; j + 1 <= n; j++)
		{
			Gamblers[j] = Gamblers[j + 1];
		}
		/*此时参与人数由n个人变为n-1个人*/
		n--; 
		for (int k = 1; k <= n; k++)
		{
			printf("%d ", Gamblers[k].number);
		}
		printf("\n");
		/*location 表示的是下一轮开始的位置*/
		location = i - 1; 
		/*同样注意location 值的范围*/
		if (location > n)
		{
			location %= n;
		}
		round++;
	}
	printf("最终胜利的赌徒编号是:%d\n", Gamblers[1].number);
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_16933601/article/details/105353301

测试结果
在这里插入图片描述

  大家的鼓励是我继续创作的动力,如果觉得写的不错,欢迎关注,点赞,收藏,转发,谢谢!

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式与Linux那些事

您的鼓励将使我写出更好的文章

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值