目的
通过实现约瑟夫生者死者小游戏,达到简单的掌握#define宏,动态分配内存的作用
技术
#define宏的使用,动态分配内存
如何使用
1. #define宏的使用
#define 不仅可以为类型定义别名,也能为数值定义别名。
#define 为数值定义别名时,达到了定义一个常量的效果。
#define kOut -1
上面的例子中给 -1 重新取了一个名字 kOut ,便于代码的阅读以及代码的修改。
2. 动态分配内存
需要导入<stdlib.h>头文件,才可以调用malloc,realloc,free函数
void *malloc(int num);
函数在堆区分配一定的内存。void *realloc(void *address, int newsize);
在malloc分配的基础上重新分配内存。void free(void *address);
释放掉手动分配的内存。void *
类型表示未确定类型的指针,可以通过类型转换强制转换为任何其它类型的指针。
int *people = (int *)malloc(playerCount * sizeof(int));
free(people);
上面的例子是通过int型变量playerCount来确定分配多大空间的内存,定义了一个int型指针变量指向这片内存空间。自己开辟的空间需要自己释放,所以用free释放。
具体使用
要求:输入玩家数量,自动编号。输入死亡编号,根据死亡编号杀人。每死亡一人,接着后面的人重新编号,继续按编号杀人。
#include <stdio.h>
#include <stdlib.h>
//游戏玩家处于被杀死的状态
#define kOut -1
int main(){
//已经被杀的人的数量
int killedCount = 0;
//设置标记值
int flag = 0;
//输入游戏参加人数
printf("请输入参加游戏的人数是:");
int playerCount = 0;
scanf_s("%d",&playerCount);
//保存参加游戏的人数-动态分配内存
int *people = (int *)malloc(playerCount * sizeof(int));
//输入被杀的人的编号
printf("请输入被杀的人的编号:");
int killedNumber = 0;
scanf_s("%d",&killedNumber);
//给游戏玩家编号
for (int i = 0; i < playerCount; i++){
people[i] = i+1;
}
//开始游戏
for (int i = 0; i < playerCount; i++){
//玩家存活情况下
if (people[i] != kOut){
//标记值移动
flag++;
//被杀
if (flag == killedNumber){
//该玩家出局
printf("%d号玩家出局\n",people[i]);
people[i] = kOut;
//死亡人数增加
killedCount++;
//标记值归0
flag = 0;
//输出获胜玩家
if (killedCount == playerCount-1){
for (int i = 0; i < playerCount; i++){
if (people[i] != kOut){
printf("%d号玩家获得胜利\n",people[i]);
}
}
//结束游戏
break;
}
}
}
//杀完一圈玩家结束后,开始第二圈
if (i == playerCount -1){
i = - 1;
}
}
//释放内存
free(people);
return 0;
}
运行结果: