目的
通過實現(xiàn)約瑟夫生者死者小游戲,達(dá)到簡單的掌握#define宏,動態(tài)分配內(nèi)存的作用
技術(shù)
#define宏的使用,動態(tài)分配內(nèi)存
如何使用
1. #define宏的使用
#define 不僅可以為類型定義別名,也能為數(shù)值定義別名。
#define 為數(shù)值定義別名時,達(dá)到了定義一個常量的效果。
#define kOut -1
上面的例子中給 -1 重新取了一個名字 kOut ,便于代碼的閱讀以及代碼的修改。
2. 動態(tài)分配內(nèi)存
需要導(dǎo)入<stdlib.h>頭文件,才可以調(diào)用malloc,realloc,free函數(shù)
void *malloc(int num);函數(shù)在堆區(qū)分配一定的內(nèi)存。void *realloc(void *address, int newsize);在malloc分配的基礎(chǔ)上重新分配內(nèi)存。void free(void *address);釋放掉手動分配的內(nèi)存。void *類型表示未確定類型的指針,可以通過類型轉(zhuǎn)換強(qiáng)制轉(zhuǎn)換為任何其它類型的指針。
int *people = (int *)malloc(playerCount * sizeof(int));
free(people);
上面的例子是通過int型變量playerCount來確定分配多大空間的內(nèi)存,定義了一個int型指針變量指向這片內(nèi)存空間。自己開辟的空間需要自己釋放,所以用free釋放。
具體使用
要求:輸入玩家數(shù)量,自動編號。輸入死亡編號,根據(jù)死亡編號殺人。每死亡一人,接著后面的人重新編號,繼續(xù)按編號殺人。
#include <stdio.h>
#include <stdlib.h>
//游戲玩家處于被殺死的狀態(tài)
#define kOut -1
int main(){
//已經(jīng)被殺的人的數(shù)量
int killedCount = 0;
//設(shè)置標(biāo)記值
int flag = 0;
//輸入游戲參加人數(shù)
printf("請輸入?yún)⒓佑螒虻娜藬?shù)是:");
int playerCount = 0;
scanf_s("%d",&playerCount);
//保存參加游戲的人數(shù)-動態(tài)分配內(nèi)存
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){
//標(biāo)記值移動
flag++;
//被殺
if (flag == killedNumber){
//該玩家出局
printf("%d號玩家出局\n",people[i]);
people[i] = kOut;
//死亡人數(shù)增加
killedCount++;
//標(biāo)記值歸0
flag = 0;
//輸出獲勝玩家
if (killedCount == playerCount-1){
for (int i = 0; i < playerCount; i++){
if (people[i] != kOut){
printf("%d號玩家獲得勝利\n",people[i]);
}
}
//結(jié)束游戲
break;
}
}
}
//殺完一圈玩家結(jié)束后,開始第二圈
if (i == playerCount -1){
i = - 1;
}
}
//釋放內(nèi)存
free(people);
return 0;
}
運(yùn)行結(jié)果:
