C/C++ 迷宫游戏

news2024/11/13 9:30:29

游戏介绍

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

  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.coloradmin.cn/o/1480645.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构题目①——数组

前言 本篇文章为博主进行代码随想录——数组练习后的总结会涉及到每一道题目的详细的思路整理&#xff0c;以及本人的易错点&#xff0c;希望对大家有所帮助 数组介绍&#xff1a; 数组在C语言中就已经有所涉及&#xff0c;它是一个最基础的数据结构&#xff0c;而在数据结构中…

jstat命令查看jvm的GC信息

文章目录 前言jstat命令查看jvm的GC信息1. 概述2. 应用堆内存水位阀值大小怎么确定3. 使用 jps 命令查看 Java 进程的进程号&#xff08;PID&#xff09;![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5097401443314e9d808a83b694dbc6e5.png)4. jstat用法5. 类加载…

【Sql Server】Update中的From语句,以及常见更新操作方式

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

Linux信号【保存-处理】

目录 前言&#xff1a; 1、再次认识信号 1.1、概念 1.2、感性理解 1.3、在内核中的表示 1.4、sigset_t 信号集 2、信号集操作函数 2.1、增删改查 2.2、sigprocmask 2.3、sigpending 3.信号的处理机制 3.1处理情况 3.2合适时机 4用户态与内核态 4.1、概念 4.2、…

蓝桥杯练习系统(算法训练)ALGO-995 24点

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 24点游戏是一个非常有意思的游戏&#xff0c;很流行&#xff0c;玩法很简单&#xff1a;给你4张牌&#xff0c;每张牌上有数…

【python】json转成成yaml中文编码异常显示成:\u5317\u4EAC\u8DEF123\u53F7

姊妹篇&#xff1a;【python】json转成成yaml json数据 {"name": "张三","age": 30,"isMarried": false,"children": [{"name": "小王","age": 5},{"name": "小李",&qu…

mysql查询用户操作日志

mysql查询用户操作日志 说明一、概述二、配置 说明 更新时间&#xff1a;2024/03/01 16:39 本文仅为记录学习轨迹&#xff0c;如有侵权,联系删除 一、概述 先简单介绍一下general log&#xff0c;这个日志主要的作用是记录MySQL所有的SQL语句&#xff0c;不管是查询语句&am…

每日一题 2369

2369. 检查数组是否存在有效划分 题目描述&#xff1a; 给你一个下标从 0 开始的整数数组 nums &#xff0c;你必须将数组划分为一个或多个 连续 子数组。 如果获得的这些子数组中每个都能满足下述条件 之一 &#xff0c;则可以称其为数组的一种 有效 划分&#xff1a; 子数…

Python实现PPT演示文稿中视频的添加、替换及提取

无论是在教室、会议室还是虚拟会议中&#xff0c;PowerPoint 演示文稿都已成为一种无处不在的工具&#xff0c;用于提供具有影响力的可视化内容。PowerPoint 提供了一系列增强演示的功能&#xff0c;在其中加入视频的功能可以大大提升整体体验。视频可以传达复杂的概念、演示产…

unity后期

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

每次提出一个bug都让测试重现,描述得那么清楚,自己操作下不会吗?

一说到测试和开发的关系&#xff0c;你一定会想到一个词“冤家”。 开发的工作就是按照PM的设计将产品最终造出来&#xff0c;而测试则是在开发已完成的工作里纠错。so&#xff0c;测试的工作会让开发很不爽&#xff0c;人之常情&#xff0c;谁都不喜欢自己的劳动成果被别人挑…

解析馆藏文物预防性保护:监测平台与数据传输系统概述

1&#xff09;文物预防性保护监测平台概述 文物预防性保护监测与调控系统是文物环境监测必不可少的关键组成部分之一,在项目实施中,将充分利用前沿物联网技术&#xff0c;如无线网络、低功耗设计、高精度传感器来实现文物保存环境的实时监测与数据分析。此外&#xff0c;还将通…

uniapp 安装安卓、IOS模拟器并调试

一、安装Android模拟器并调试 1.下载并安装Android Studio。 2.创建简单project。 3.安装模拟器。 完成安卓模拟器的安装。 4.启动模拟器。 5.hbuilderx选择模拟器、运行。 点击刷新按钮后出现模拟器&#xff0c;勾选并运行。 6.调试。 在 HBuilderX 中&#xff0c;项目启…

GCN 翻译 - 1

ABSTRACT 我们提出了一种可扩展的在以图结构为基础的数据上的半监督学习&#xff0c;这种方法直接作用在图数据上&#xff0c;可以看做是卷积神经网络的变种。我们选择了图谱理论里面的一阶近似作为我们的卷积结构。我们的模型能够随着图的规模线性伸缩&#xff0c;并且隐藏层…

将镜像上传到私有镜像仓库Harbor

首先你需要安装Harbor服务&#xff1a; https://blog.csdn.net/qq_50247813/article/details/136388229 客户端已经安装docker&#xff1a; https://docs.docker.com/engine/install/centos/ 在docker客户端登录 Harbor 我的Harbor 服务器地址&#xff1a; 192.168.44.161 账号…

抖店无货源违规频发,不能入驻?这个是真的吗?

我是电商珠珠 还没有踏入抖店这个电商行业的新手&#xff0c;单从别人的口中&#xff0c;听说了抖店无货源特别容易违规&#xff0c;还会被扣除全部的保证金&#xff0c;得不偿失之类的话。有的还专门劝诫新手不要做抖店&#xff0c;做了就会亏本之类的话&#xff0c;这搞得人…

首个美国大学宣布与OpenAI建立合作伙伴关系!全美本科AI强校大盘点!

美国亚利桑那州立大学&#xff08;Arizona State University &#xff09;在其官网宣布与OpenAI建立合作伙伴关系&#xff0c;该校也由此成为第一家与OpenAI合作的高等教育机构。 这一合作将ChatGPT Enterprise的先进功能引入亚利桑那州立大学&#xff0c;使教职员工能够探索生…

【Java】UWB高精度工业定位系统项目源代码

目录 UWB技术原理 优势 1. 高精度&#xff1a; 2. 抗干扰能力强&#xff1a; 3. 定位范围广&#xff1a; 4. 实时性强&#xff1a; 应用前景 定位系统源码功能介绍 实时定位&#xff1a; 轨迹回放&#xff1a; 区域管理&#xff1a; 巡检管理: 数据可视化分析&…

YOLOv9改进|加入AKConv模块!

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、改进点介绍 AKConv是一种具有任意数量的参数和任意采样形状的可变卷积核&#xff0c;对不规则特征有更好的提取效果。 论文速览&#xff1a;&am…

《TCP/IP详解 卷一》第9章 广播和组播

目录 9.1 引言 9.2 广播 9.2.1 使用广播地址 9.2.2 发送广播数据报 9.3 组播 9.3.1 将组播IP地址转换为组播MAC地址 9.3.2 例子 9.3.3 发送组播数据报 9.3.4 接收组播数据报 9.3.5 主机地址过滤 9.4 IGMP协议和MLD协议 9.4.1 组成员的IGMP和MLD处理 9.4.2 组播路由…