C/C++ 迷宫游戏

游戏介绍

这个迷宫探险游戏有以下功能:

  1. 探险:选择该选项后,玩家会进入地下迷宫进行探险。在随机事件中,可能会遇到陷阱、发现金币或者什么都没有发生。陷阱会使玩家失去一定的生命值,金币可以增加玩家的金币数量。

  2. 休息:选择该选项后,玩家可以休息一会儿。在休息过程中,有50%的概率会丢失随机数量的金币。而体力值将会回复15点,但不超过上限100。

  3. 查看背包:选择该选项后,玩家可以查看背包中的道具。当前游戏中有三种道具:能量药水、地图和食物。能量药水可以增加20点体力值,地图可以指示方向,而食物则可以增加10点生命值。

  4. 结束游戏:选择该选项后,游戏将会结束。

玩家需要通过探险获得足够的金币(100个)以及保持生命值大于0才能获得胜利。如果生命值降到0或者选择结束游戏,则游戏失败。

游戏示例
在这里插入图片描述

在这里插入图片描述

运用的知识点如下:

  • 结构体:使用了结构体player来表示玩家的状态,包括生命值、体力值和金币数量。

  • typedef:使用typedef为结构体类型player定义别名Player,方便在代码中使用。

  • 随机数:使用srand函数设置随机种子。然后使用rand函数生成随机数,用于产生随机事件、陷阱伤害、金币奖励等。

  • 条件语句:使用if-else语句根据不同的条件执行相应的操作,例如判断玩家的选择、判断随机事件类型等。

  • 循环语句:使用while循环控制游戏的进行,直到玩家的生命值小于等于0或金币数量达到200时结束游戏。

  • 指针:使用指针作为函数参数,通过指针修改玩家的状态。

  • 数组:使用数组items来表示玩家的背包道具,下标对应道具编号-1,数组元素表示道具数量。

  • 函数:定义了多个函数来实现不同的功能,如探险、休息、查看背包、使用道具等。

  • switch语句:根据玩家的选择执行不同的操作。

  • 类型转换:使用int类型将字符转换为整数,例如将用户输入的选择转换为整数

结构体定义

struct player {
    int health;   // 欢乐值
    int stamina;   // 体力值
    int gold;   // 金币
};

typedef struct player Player;
int items[3] = {0};   // 道具数组,下标分别对应道具编号-1

函数声明

void inif(Player* p);//初始化
void explore(Player* p);//收集
void rest(Player* p);//休息
void view_inventory(Player* p);//查看背包
void use_item(Player* p, int index);//使用道具
void use_item1(Player* p);//能量药水
void use_item2(Player* p);//地图
void use_item3(Player* p);//野果
void show_status(Player* p);//显示状态
void end_of_game(Player* p);//结束收集

源代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct player {
    int health;   // 欢乐值
    int stamina;   // 体力值
    int gold;   // 金币
};

typedef struct player Player;

int items[3] = {0};   // 道具数组,下标分别对应道具编号-1


void inif(Player* p);//初始化
void explore(Player* p);//收集
void rest(Player* p);//休息
void view_inventory(Player* p);//查看背包
void use_item(Player* p, int index);//使用道具
void use_item1(Player* p);//能量药水
void use_item2(Player* p);//地图
void use_item3(Player* p);//野果
void show_status(Player* p);//显示状态
void end_of_game(Player* p);//结束收集

int main() {
    srand(time(NULL));   // 每次运行产生不同的随机种子
    Player player;
    // 初始化玩家状态
    inif(&player);

    printf("欢迎进行迷宫探险之旅!\n");

    while (player.health > 0 && player.gold < 100) {
        printf("\n-----------------------------------\n");
        printf("你现在的状态:\n");
        show_status(&player);
        int choice;
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                explore(&player);   // 进行探险
                break;
            case 2:
                rest(&player);   // 休息
                break;
            case 3:
                view_inventory(&player);   // 查看背包中的道具
                break;
            case 4:
                end_of_game(&player);
                return 0;
            default:
                printf("无效选项,请重新输入。\n");
        }
    }

    if (player.health <= 0) {
        printf("\n你精疲力尽!收集失败...\n");
    } else {
        printf("\n你拥有%d个金币,有足够的信心离开迷宫。收集成功!\n", player.gold);
    }

    return 0;
}

void inif(Player* p){
    p->health = 100;
    p->stamina = 100;
    p->gold = 0;
}

void explore(Player* p) {
    if(p->stamina<=0)
    {
        printf("\n体力过低请补充体力...\n");
        return;
    }

    printf("\n你开始了收集之旅...\n");

    int random_event = (rand() % 10) + 1;   // 随机事件

    if (random_event < 3 && p->health > 0 && p->stamina >= 15) {   // 遇到陷阱
        p->stamina -= 15;

        int damage = rand() % 31 + 10;   // 随机减少10-20点生命值
        printf("你踩到了陷阱,失去了%d点欢乐值\n", damage);
        p->health -= damage;

    } else if (random_event < 6 && p->health > 0 && p->stamina >= 10) {   // 发现金币
        p->stamina -= 10;

        int gold = rand() % 36 + 5;   // 随机获得金币
        printf("你发现了%d个金币\n", gold);
        p->gold += gold;

    }else if(random_event < 9){
        if(random_event==6){
                p->stamina -=5;
            printf("你获得了能量药水\n");
            items[0]++;
        }else if(random_event==7){
            p->stamina -=5;
            printf("你获得了地图\n");
            items[1]++;
        }else {
            p->stamina -=5;
            printf("你获得了野果\n");
            items[2]++;
        }

    }else {   // 什么都没发生,但是消耗体力值
        p->stamina -= 5;
        printf("你在迷宫徘徊...\n");
    }

}

void show_status(Player* p) {
    printf("\n体力:%d,欢乐值:%d,金币:%d\n\n", p->stamina, p->health, p->gold);
    printf("请选择下一步操作:\n");
    printf("1. 收集\n");
    printf("2. 休息\n");
    printf("3. 查看背包\n");
    printf("4. 结束收集\n");
}

void rest(Player* p) {
    printf("\n你决定休息一会儿...\n");

    int lost_gold = rand() % 6;   // 50% 的概率丢失随机数量的金币
    if (lost_gold < 3 && p->gold > 0) {
        int gold_loss = rand() % (p->gold + 1);   // 丢失随机数量的金币
        printf("你在休息过程中丢失了%d个金币\n", gold_loss);
        p->gold -= gold_loss;
    }

    p->stamina += 15;   // 回复15点体力值
    if (p->stamina > 100) {
        p->stamina = 100;
    }
}

void view_inventory(Player* p) {
    printf("\n你打开了背包...\n");

    for (int i = 0; i < 3; i++) {
        if (items[i] > 0) {
            switch (i+1) {
                case 1:
                    printf("1. 能量药水(增加20点体力):%d\n", items[0]);
                    break;
                case 2:
                    printf("2. 地图(告诉你方向):%d\n", items[1]);
                    break;
                case 3:
                    printf("3. 野果(增加10点欢乐值):%d\n", items[2]);
                    break;
            }
        } else {
            switch (i+1) {
                case 1:
                    printf("1. 能量药水(增加20点体力):0\n");
                    break;
                case 2:
                    printf("2. 地图(告诉你方向):0\n");
                    break;
                case 3:
                    printf("3. 野果(增加10点欢乐值):0\n");
                    break;
            }
        }
    }

    printf("\n请选择要使用的道具,或者输入其他选项返回游戏:\n");

    int choice;
    scanf("%d", &choice);

    if (choice != 1 && choice != 2 && choice != 3) {
        printf("\n你选择了返回游戏。\n");
        return;
    }
    use_item(p,choice);
}

void use_item(Player* p, int index) {
    if (items[index-1] <= 0) {   // 没有该道具
    printf("\n你没有这个道具!\n");
    return;
    }

    switch (index) {
        case 1:
            use_item1(p);
            break;
        case 2:
            use_item2(p);
            break;
        case 3:
            use_item3(p);
            break;
        default:
            printf("\n该选项无效!\n");
    }
}

void end_of_game(Player* p) {
    printf("\n游戏结束...\n");
    printf("你的最终状态为:\n");
    printf("体力:%d,欢乐值:%d,金币:%d\n", p->stamina, p->health, p->gold);

    if (p->health <= 0) {
        printf("你已经死亡!\n");
    }
    else if (p->gold >= 100) {
        printf("你找到了100枚个金币,收集成功!\n");
    }
    else {
        printf("你没有找到足够的金币,收集失败!\n");
    }
}

void use_item1(Player* p){
    if (p->stamina == 100) {   // 体力值已满
                printf("\n你现在的体力已经是满的了!\n");
                return;
            }
            p->stamina += 20;   // 增加20点体力值
            if (p->stamina > 100) {   // 不超过上限100
                p->stamina = 100;
            }
            printf("\n你使用了一瓶能量药水,增加了20点体力值!\n");
            items[0]--;
}

void use_item2(Player* p){
    printf("\n你打开了地图,发现...还需要继续收集才能找到金币。\n");
            items[1]--;
}

void use_item3(Player* p){
    if (p->health == 100) {   // 生命值已满
                printf("\n你现在的欢乐值已经是满的了!\n");
                return;
            }
            p->health += 10;   // 增加10点生命值
            if (p->health > 100) {   // 不超过上限100
                p->health = 100;
            }
            printf("\n你食用了一份美味佳肴,增加了10点欢乐值!\n");
            items[2]--;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/419448.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ToDesk - macOS 上轻便好用的远程控制

文章目录 官网 https://www.todesk.com个人版&#xff08;免费&#xff09;下载地址&#xff1a; https://www.todesk.com/download.html 支持系统类型 Windows、macOS、Android、iOS、Linux 应用大小为 320MB 左右 使用界面

SpringBoot整合rabbitmq-主题交换机队列(四)

说明&#xff1a;Topic主题交换机它的大致流程是交换机和一个或者多个队列绑定&#xff0c;这个绑定的Routingkey是包含通配符的&#xff0c;满足通配符的队列会接收到消息。 通配符规则&#xff1a; #&#xff1a;匹配一个或多个词 *&#xff1a;匹配一个词 例如&#xff…

2024年工控人职场求生之路

2024年&#xff0c;眼看项目多了活儿忙了 工控工程师们开始上演飞驰人生 不是跑去客户那里调设备 就是在电脑上搭项目做画面搭系统 每天都过热辣滚烫 你说忙吧&#xff0c;每天也就干那些事儿 你说多有成就感呐 我觉得我能有绝对的主导权和话语权 那都是天方夜谭 2024年…

给孩子选台灯什么样的好?2024年最值得购买的护眼台灯推荐

自从孩子上学以后&#xff0c;很多家长就一直给孩子添置各种各样的学习用品&#xff0c;例如专用的学习桌椅、书架&#xff0c;不过随着作业的增多&#xff0c;发现最需要的物品就是一盏好的护眼台灯。然而有些商家为了降低成本&#xff0c;不惜牺牲产品质量&#xff0c;使用没…

没有项目经历,该如何写简历?

没有项目经历&#xff0c;我该如何写简历 一、前言二、挖掘自己三、看现成的项目经验&#xff0c;转化成自己的语言1、硬件方面2、软件方面 四、最后 一、前言 相信有很多刚出来找工作的人会遇到这种情况&#xff0c;因为自身没有项目经历&#xff0c;投了很多的简历都石沉大海…

【详识JAVA语言】逻辑控制

概述 我的曾经&#xff1a; 早上8:00起床--->洗漱--->吃早饭--->上课--->吃午饭--->上课--->运动--->吃完饭--->玩手机--->睡觉 每天的生活貌似都是这么规律&#xff0c;顺序的做着每件事&#xff0c;前途一片渺茫~~~ 直到有一天&#xff1a; 我…

外卖点餐小程序二合一自由切换商业运营版 带完整的搭建教程

“外卖点餐小程序二合一自由切换商业运营版”的源码&#xff0c;是基于当前最流行的移动应用开发框架开发的。它整合了前端展示、后端管理、数据库存储等多个功能模块&#xff0c;为用户提供了一个高效、稳定、易于维护的外卖点餐解决方案。这套源码不仅适用于初创企业快速搭建…

基于ssm疫情期间高校防控系统+vue论文

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;学生信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广大…

#stm学习总结 (二十八)硬件随机数实验

28.1 随机数发生器简介 STM32F407 自带了硬件随机数发生器&#xff08;RNG&#xff09;&#xff0c;RNG 处理器是一个以连续模拟噪声为基础的随机数发生器&#xff0c;在主机读数时提供一个 32 位的随机数。 28.1.1 RNG 框图 STM32F407 的随机数发生器&#xff08;RNG&#x…

ShardingJdbc实战-分库分表

文章目录 基本配置分库分表的分片策略一、inline 行表达时分片策略algorithm-expression行表达式完整案例和配置如下 二、根据实时间日期 - 按照标准规则分库分表标准分片 - Standard完整案例和配置如下 基本配置 逻辑表 逻辑表是指&#xff1a;水平拆分的数据库或者数据表的相…

Nodejs+vue汽车保养美容管理系统vscode前后端分离项目

汽车美容保养管理系统后台采用nodejs语言开发,前台页面和后台管理页面使用vue等技术开发,使用MySql作为数据持久化存储工具对汽车美容保养管理系统的用户等角色权限对应的功能等进行存储。采用vsocde集成IDE对汽车美容保养管理系统统进行开发,整合系统的各个模块。 拟开发的汽车…

Java字符串相关类的底层原理

Java字符串相关类的底层原理

SpringBoot底层原理

SpringBoot底层原理 一 配置优先级 1.配置方式 Springboot中支持三种配置方式&#xff0c;分别为&#xff1a; application.propertiesapplication.ymlapplication.yaml 2.配置优先级 当存在多份配置文件时&#xff0c;配置文件会按照它们的优先级生效。 优先级从高到底…

unity后期

unity|后处理篇 前言一、Post-Processing 1、 Post-Processing的使用2、Post-Processing后处理效果 抗锯齿①、Ambient Occlusion 环境光遮蔽②、Auto Exposure 自动曝光③、Bloom 辉光/泛光④、Chromatic Aberration | 色差⑤、Color Grading 色调/颜色分级⑥、Depth Of Fiel…

第九届数学与人工智能国际会议 (ICMAI 2024)即将召开!

2024年第九届数学与人工智能国际会议将于2024年5月10-12日在中国北京召开。本届会议由北京工业大学主办&#xff0c;旨在促进应用逻辑、算法与复杂性研究&#xff0c;使用数学的方法促进人工智能理论与应用发展&#xff0c;加深学术交流与合作。我们热忱欢迎从事相关技术研究的…

Pytest中测试结果收集:pytest_terminal_summary!

前言 Pytest是Python的一种强大的测试框架&#xff0c;它提供了丰富的功能和插件来满足各种测试需求。 其中&#xff0c;pytest_terminal_summary是一个钩子函数&#xff0c;它允许我们在测试运行结束后&#xff0c;添加自定义的总结信息到测试报告中。这个功能在需要对测试结…

Spring基础——使用XML配置一个Bean

目录 初始化XML文件实例化Spring容器实例化ApplicationContext 获取指定Bean对象 这里解释一下为什么现在都流行注解开发了而依然还要来去了解xml配置文件&#xff0c;甚至很多博客都不愿意去写xml相关的配置。 官方文档里提出了注解开发的优势是在声明中已经提供了大量的上下文…

React富文本编辑器开发(一)

这是一个系统的完整的教程&#xff0c;每一节文章的内容都很重要。这个教程学完后自己可以开发出一个相当完美的富文本编辑器了。下面就开始我们今天的内容&#xff1a; 安装 是的&#xff0c;我们的开发是基于Slate的开发基础&#xff0c;所以要安装它&#xff1a; yarn ad…

springboot-基础-eclipse配置+helloword示例

备份笔记。所有代码都是2019年测试通过的&#xff0c;如有问题请自行搜索解决&#xff01; 下一篇&#xff1a;springboot-基础-添加model和controller的简单例子常用注解含义 目录 配置helloword示例新建项目创建文件 配置 spring boot官方有定制版eclipse&#xff0c;也就是…

【Python笔记-设计模式】迭代器模式

一、说明 迭代器模式是一种行为设计模式&#xff0c;让你能在不暴露集合底层表现形式&#xff08;列表、栈和树等&#xff09;的情况下遍历集合中所有的元素。 (一) 解决问题 遍历聚合对象中的元素&#xff0c;而不需要暴露该对象的内部表示 (二) 使用场景 需要对聚合对象…
最新文章