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};   // 道具数组,下标分别对应道具编号-1void 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) {   // 不超过上限100p->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) {   // 不超过上限100p->health = 100;}printf("\n你食用了一份美味佳肴,增加了10点欢乐值!\n");items[2]--;
}

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

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

相关文章

浅谈XSS简单漏洞xss-labs-master(初级)

一、环境以及xss漏洞简介 网上很多gethub自己下就行 XSS简介&#xff1a; 当用户访问被XSS注入的网页&#xff0c;XSS代码就会被提取出来。用户浏览器就会解析这段XSS代码&#xff0c;也就是说用户被攻击了。 用户最简单的动作就是使用浏览器上网&#xff0c;并且浏览器中有J…

git忽略某些文件(夹)更改说明

概述 在项目中,常有需要忽略的文件、文件夹提交到代码仓库中,在此做个笔录。 一、在项目根目录内新建文本文件,并重命名为.gitignore,该文件语法如下 # 以#开始的行,被视为注释. # 忽略掉所有文件名是 a.txt的文件. a.txt # 忽略所有生成的 java文件, *.java # a.j…

React 中,children 属性

在 React 中&#xff0c;children 属性是一个特殊的属性&#xff0c;它允许你将组件作为其他组件的子元素传递。这意味着你可以在组件内部嵌套任何类型的子组件或元素&#xff0c;并且在父组件中通过 props.children 访问它们。这为组件的复用和组合提供了极大的灵活性。 以下…

力扣-H指数

问题 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &#xff0c;一名科研人员的 h 指数 是指他&#xff08;她&#xff09…

Qt 简约美观的加载动画 小沙漏风格 第六季

这次和大家分享一个沙漏风格的加载动画 效果如下: 这是本系列的第六季了, 本次内容的关键在于cubicTo函数的使用, 在这里分享一个非常好用的网站https://www.desmos.com/calculator/cahqdxeshd 在这上面可以手动拖动贝塞尔曲线的控制点, 并且显示了起终点和两个控制点的精确坐…

Linux中如何在创建子线程的时候设置为分离属性

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<unistd.h> #include <pthread.h> void *mythread(void *arg) {printf("id[%ld]\n",pthread_self()); } int main() { //定义pthread_…

ulimit命令

ulimit命令 ulimit 命令用于查看和设置 shell 运行时的资源限制。它可以控制各种资源&#xff0c;如文件打开数量、堆栈大小、CPU 时间等。ulimit 命令通常用于限制 shell 启动的进程的资源使用量&#xff0c;以防止系统资源被耗尽。ulimit命令的主要作用是提高系统的性能和稳…

智能水表预付费管理系统

智能水表预付费管理系统是当前智能水表技术的重要应用之一&#xff0c;结合了智能化管理和预付费功能&#xff0c;为水务公司和用户提供了便捷、高效的用水管理解决方案。该系统利用先进的科技手段&#xff0c;实现了水表抄表、计费和管理的自动化&#xff0c;为用户带来更便捷…

Unicode/ASCII/UTF的关系(模板字面量、模板字符串、占位符)

字符串&#xff1a;编程时最重要的数据类型之一。 正则表达式&#xff1a;赋予开发者更多操作字符串的能力。 1、 Unicode和ASCII 1.1 概述 Unicode是ASCII字符编码的一个扩展&#xff0c;只不过在Windows中&#xff0c;用两个字节对其进行编码&#xff0c;也称为宽字符集&…

golang的channel探索

1、channel是什么&#xff1f; 管道或者是通道。字面意思也就是说是传输的通道或者是管道。 在 Go 语言中&#xff0c;channel 的关键字为 chan&#xff0c;数据流向的表现方式为 <- 分为两种模式&#xff1a; 双向– 表现形式为&#xff1a;chan T&#xff0c;即双向通道。…

nodejs使用axios获取url的图片信息并转换为base64

推荐一款AI网站&#xff0c; AI写作与AI绘画智能创作平台 - 海鲸AI | 智能AI助手&#xff0c;支持GPT4设计稿转代码 要使用axios库在Node.js中获取URL的图片信息并将其转换为Base64编码&#xff0c;首先需要安装axios。如果你还没有安装&#xff0c;可以使用以下命令来安装它&…

Docker安装mysql、redis、rabbitmq

【docker 安装mysql】 docker pull mysql:latest docker imagesdocker run -p 3306:3306 --name mysql --restartalways --privilegedtrue \ -v /usr/local/mysql/log:/var/log/mysql \ -v /usr/local/mysql/data:/var/lib/mysql \ -v /usr/local/mysql/conf:/etc/mysql \ -v …

取消退出流程控制方法

在自动化设备动作流程中&#xff0c;人为任意想取消当前动作&#xff0c;常见方法是使用全局变量&#xff0c;实时检测变量决定退出。这里介绍一个System.Threading空间下的 CancellationTokenSource类&#xff0c;他可以设置超时&#xff0c;设置信息等封装 基本使用超时和手…

反向传播和前向传播什么意思

在神经网络训练的上下文中&#xff0c;前向传播和反向传播是两个基本且关键的概念。 前向传播&#xff08;Forward Propagation&#xff09; 前向传播是神经网络中数据流向的第一步。在这个过程中&#xff0c;输入数据从输入层开始&#xff0c;逐层经过隐藏层&#xff0c;直至…

【粉丝福利第一期】小 明

Q1 - 能否自我介绍下&#xff1f; 嗨&#xff0c;大家好&#xff0c;我是 小 明 &#xff08;小明java问道之路&#xff09;&#xff0c;互联网大厂后端研发专家&#xff0c;2022博客之星TOP3/博客专家/CSDN后端内容合伙人、InfoQ(极客时间)签约作者、阿里云签约博主、全网5万…

GO单元测试的使用

Go语言中的测试依赖go test命令,go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内&#xff0c;所有以_test.go为后缀名的源代码文件都是go test测试的一部分&#xff0c;不会被go build编译到最终的可执行文件中。每个测试函数必须导入testing包,测试函数…

PBM学习——从基础到精通!!!

本专栏着重讲解PBM学习所得,学习笔记、心得,并附有视频素材资料,视频详细目录如下: PBM相关参数解释1 PBM相关参数解释2 PBM相关案例实践1 PBM相关案例实践2 PBM相关案例实践2 PBM相关案例实践3 PBM多相流中次相界面设置1 PBM多相流中次相界面设置2 欧拉多相流曳力1 欧拉多…

make/makefile

首先什么是make和makefile呢&#xff1f;先简单说&#xff0c;make是一条命令&#xff0c;makefile是一个文件&#xff0c;这个文件中存的是依赖关系和依赖方法&#xff0c;那么为什么会有这两个东西呢&#xff1f; 首先我们知道在VS2019中&#xff0c;我们可以直接创建一个工程…

474 一零和

题目 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。如果 x 的所有元素也是 y 的元素&#xff0c;集合 x 是集合 y 的 子集 。示例 1&#xff1a;输入&#xff1a;strs ["1…

Linux系统中make/Makefile的介绍

文章目录 前言一、make命令二、makefile功能介绍1.makefile文件的编写格式2.hello.c文件内容3.makefile文件4.安装make命令 总结 前言 在linux系统中&#xff0c;我们对项目文件进行处理的时候会不方便&#xff0c;因此我们需要对文件的编译进行自动化处理。 下面就是在Linux系…