C-約瑟夫生者死者小游戲

目的

通過實現(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é)果:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容