问题标题: 荒岛逃生

2
2
已解决
臧君瑞
臧君瑞
初级守护
初级守护

#include<bits/stdc++.h>
#define MAX_NAME_LEN 20
#define INITIAL_HEALTH 100
#define INITIAL_HUNGER 50
#define INITIAL_THIRST 50
#define INITIAL_DAYS 1
typedef struct{
    int hasShelter;
    int hasFood;
    int hasWater;
    int hasDanger;
}Map;
typedef struct{
    char name[MAX_NAME_LEN];
    int health;
    int hunger;
    int thirst;
    int days;
}Survivor;
void displayHelp(){
    printf("你在荒岛上开始了荒岛求生100天生存,请尽力寻找资源保持生机并最终生还。\n");
    printf("以下是每个命令的含义:\n");
    printf("h - 帮助\n");
    printf("s - 显示幸存者当前状态\n");
    printf("m - 搜索周围的地图资源\n");
    printf("r - 休息\n");
    printf("j - 从现在睡觉到第二天\n");
    printf("f - 查找食物\n");
    printf("w - 查找水源\n");
    printf("e - 进入避难所\n");
    printf("c - 与其他幸存者合作\n");
    printf("a - 与其他幸存者对抗\n");
    printf("q - 退出游戏\n");
}
void printSurvivorStatus(Survivor* survivor) {
    printf("名字:%s\n",survivor->name);
    printf("健康值:%d\n",survivor->health);
    printf("饥饿度:%d\n",survivor->hunger);
    printf("口渴度:%d\n",survivor->thirst);
    printf("已存活天数:%d\n",survivor->days);
}
void searchResources(Map* map,Survivor* survivor){
    int randFind=rand()%7;
    if(randFind==0) printf("很遗憾,你没有发现任何资源。\n");
    else{
        int randResource=rand()%3;
        switch (randResource) {
            case 0:
                printf("你发现了一些果子,你的饥饿度下降了10!\n");
                survivor->hunger -= 10;
                 map->hasFood = 1;
                break;
            case 1:
                printf("你找到了一处小溪流,你的口渴度下降了10!\n");
                survivor->thirst -= 10;
                map->hasWater = 1;
                break;
            case 2:
                printf("你发现了一个避难所,可能是躲避危险的好地方!\n");
                map->hasShelter = 1;
                break;
        }
    }
    int randDanger=rand()%5;
    if(randDanger==0) {
        printf("很不幸,你碰到了危险!\n");
        map->hasDanger = 1;
    }
}
void findFood(Map* map,Survivor* survivor){
    if(!map->hasFood){
        printf("很遗憾,你没有找到任何食物。\n");
        return;
    }
    printf("你找到了一些水果,你的饥饿度下降了20。\n");
    survivor->hunger-=20;
    map->hasFood=0;
}
void findWater(Map* map,Survivor* survivor){
    if(!map->hasWater){
        printf("很遗憾,你没有找到任何水源。\n");
        return;
    }
    printf("你找到了一些清水,你的口渴度下降了20。\n");
    survivor->thirst -= 20;
    map->hasWater = 0;
}
void enterShelter(Map* map,Survivor* survivor){
    if(!map->hasShelter){
        printf("很遗憾,你还没有找到避难所。\n");
        return;
    }
    printf("你找到了避难所,好好休息了一下!\n");
    survivor->health+=40;
}
void avoidDanger(Map* map,Survivor* survivor){
    if(!map->hasDanger){
        printf("现在岛上很平静,没有什么可担心的。\n");
        return;
    } 
    int randEscape=rand()%2;
    if(randEscape==0) {
        printf("你被困住了,受到了伤害!\n");
        survivor->health-=20;
    }else{
        printf("你成功逃脱了危险!\n");
    }
}
void showSurvivorsEncountered(Survivor* player,Survivor* stranger){
    printf("你遇到了一个幸存者:%s\n", stranger->name);
    printf("他的状态是:\n");
    printSurvivorStatus(stranger);
    printf("是否与他合作?(y/n)");
    char choice;
    getchar();
    scanf("%c",&choice);
    if(choice=='y'){
        int randCoop=rand()%6;
        if(randCoop==0){
            printf("很遗憾,你们一起搜索时没有找到任何资源。\n");
        }else{
            printf("你们成功找到了一些资源!\n");
            int randResource=rand()%3;
            switch(randResource){
                case 0:
                    printf("你们找到了一些香蕉,你的饥饿度下降了10!\n");
                    player->hunger -= 10;
                    stranger->hunger -= 10;
                    break;
                case 1:
                    printf("你们找到了一口井,你的口渴度下降了10!\n");
                    player->thirst -= 10;
                    stranger->thirst -= 10;
                    break;
                case 2:
                    printf("你们发现了一处废弃宿舍,休息了一会儿,你的健康值增加了20。\n");
                    player->health += 20;
                    stranger->health += 20;
                    break;
            }
        }
    }else{
        int randVs=rand()%3;
        if(randVs==0){
            printf("很遗憾,你被幸存者%s打败了!\n", stranger->name);
            player->health/=2;
        }else{
            printf("你成功击败了幸存者%s,但也受到了一些伤害。\n", stranger->name);
            player->health -= 20;
        }
    }
}
int main(){
    srand(time(NULL));
    Survivor player={"玩家", INITIAL_HEALTH, INITIAL_HUNGER, INITIAL_THIRST};
    Map map={0, 0, 0, 0};
    printf("欢迎来到荒岛求生游戏!输入'h'查看帮助信息。\n");
    while(1){
        char choice;
        scanf("%c",&choice);
        switch(choice){
            case 'h':
                displayHelp();
                break;
            case 's':
                printSurvivorStatus(&player);
                break;
            case 'm':
                searchResources(&map, &player);
                break;
            case 'r':
                printf("你摆开行囊好好休息了一下,健康值回复了20点。\n");
                player.health += 20;
                break;
            case 'j':
                printf("你已经睡到了第二天,健康值回复了40点。\n");
                player.days+=1;
                player.health+=40; 
            case 'f':
                findFood(&map, &player);
                break;
            case 'w':
                findWater(&map, &player);
                break;
            case 'e':
                enterShelter(&map, &player);
                break;
            case 'c': {
                Survivor stranger = {"陌生人", INITIAL_HEALTH, INITIAL_HUNGER, INITIAL_THIRST};
                showSurvivorsEncountered(&player, &stranger);
                break;
            }
            case 'a': {
                Survivor enemy = {"敌人",INITIAL_HEALTH, INITIAL_HUNGER, INITIAL_THIRST};
                showSurvivorsEncountered(&player,&enemy);
                break;
            }
            case 'q':
                char yon;
                printf("你已经在这个世界上存活%d天,确定要退出么?(y/n) ",player.days); 
                scanf("%c",&yon);
                if(yon=='y'){
                    printf("游戏结束,再见!");
                    return 0;
                }else{
                    printf("请继续游戏。\n");
                    break;
                }
            default:
                printf("无效的命令,请查看帮助信息。\n");
                break;
        }
        if(player.health<=0){
            printf("很遗憾,你已经死亡了。");
            return 0;
        }
        if(player.days>=100){
            printf("恭喜你,你已经挑战成功了。");
            return 0; 
        }
    }
    return 0;
}


0
已采纳
郑皓予
郑皓予
新手光能
新手光能

牛啊!!!大佬!!!(★ ω ★),必须收藏

1
1
葛旻允
葛旻允
资深守护
资深守护

好玩,就是有个bug,一直按j键就可以速通,并且健康值还会一直加

1
0
我要回答