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;
}
运行结果相同。