C语言学习笔记(4)-杀人小游戏的指针实现(数组同理)

C语言学习笔记(4)-杀人小游戏的指针实现(数组同理)

malloc函数参见下方链接

malloc的用法和意义_C/C++_chf_1的博客-CSDN博客 https://blog.csdn.net/chf_1/article/details/78688557

杀人小游戏(约瑟夫环)

七位玩家 A B C D E F G
要求输入人数 7
要求输入每位玩家的名字 A B C D E F G
要求输入一个整数,建议比3少 3
第一轮 C淘汰,ABDEFG
第二轮 F淘汰,ABDEG
第三轮 B淘汰,ADEG
第四轮 G淘汰,ADE
第五轮 E淘汰,AD

解题思路:
1.首先连续输入玩家的名字,这里使用malloc函数首先开辟出存放名字的地址空间,不超过20个字符串(字节)。
2.scanf函数使用时,可限定读取缓存区的长度。
3.游戏开始设定存活人数sur少于死亡数字n时结束,因为n-1个人肯定是无法被杀死的。
4.一共num个玩家,遍历循环,count第一次到达n时,杀死对应的玩家(对应地址指向的名字赋零),count清零。
5.判断已死亡人员,count++。
6.最后打印输出未死(名字没有被清零)的玩家
缺点:因为每次都遍历循环,所以比较浪费内存,可以考虑把循环的长度减短,即人死亡后,踢出内存段,总循环次数减少。

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

int	main() {

	int num;
	int count = 0;//计数
	int sur, n;//存活人数,死亡数字
	char* p = NULL;
	printf("请输入玩家人数:");
	scanf_s("%d", &num);
	sur = num;
	s = 0;
	p = (char*)malloc(num * 20); //创建 num*20 个字节地址
	for (int i = 0; i< num; i++)
	{
		printf("第%d个人的名字是:", i + 1);
		scanf_s("%s", p + i * 20, 20);
	}
	printf("输入死亡数字:");
	scanf_s("%d", &n);
	/*for(int i = 0;<num;i++)
	{
	printf("第%d个人的名字是:%s\n",i+1,p+20*i);
	}*/
	while (sur >= n)
	{
		for (int i = 0; i < num; i++)
		{
			if (*(p + i * 20) != 0)
			{
				count++;
			}

			if (count == n) {
				printf("%s已经被淘汰\n", (p + i * 20));
				*(p + i * 20) = 0;
				count = 0;
				sur--;
			}
		}
	}
	printf("存活玩家:");
	for (size_t i = 0; i < num; i++)
	{
		if (*(p + i * 20) != 0)
			printf("%s ", (p + i * 20));
	}
	printf("\n游戏结束\n");
	while (1);
	return 0;
}

运行结果如下:
在这里插入图片描述
改进代码:

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

//p	玩家
//index	死亡者下标
//sur	存活人数
void reset(char* p,int index,int sur) {
	if (sur == index + 1)	return;
	for (int i = index; i < sur-1; i++) {
		*(p + i * 20) = *(p + (i + 1) * 20);
	}

}

int	main() {

	int num;
	int count = 0;//计数
	int sur, n, index;//存活人数,死亡数字,死亡者下标
	char* p = NULL;
	printf("请输入玩家人数:");
	scanf_s("%d", &num);
	sur = num;
	p = (char*)malloc(num * 20); //创建 num*20 个字节地址
	for (int i = 0; i< num; i++)
	{
		printf("第%d个人的名字是:", i + 1);
		scanf_s("%s", p + i * 20, 20);
	}
	printf("输入死亡数字:");
	scanf_s("%d", &n);
	/*for(int i = 0;<num;i++)
	{
	printf("第%d个人的名字是:%s\n",i+1,p+20*i);
	}*/
	while (sur >= n)
	{
		for (int i = 0; i < sur; i++)
		{
				count++;
			if (count == n) {
				printf("%s已经被淘汰\n", (p + i * 20));
				*(p + i * 20) = 0;
				index = i;
				reset(p, index, sur);
				if (index + 1 == sur)//防止死亡人出现在最后一个
					count = 0;
				else
					count = 1;
				sur--;
			}
		}
	}
	printf("存活玩家:");
	for (size_t i = 0; i < sur; i++)
	{
			printf("%s ", (p + i * 20));
	}
	printf("\n游戏结束\n");
	while (1);
	return 0;
}

运行结果相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值