深蓝学院C++ Project 4 文字版挂机地牢探险游戏的设计 代码

本文主要是介绍深蓝学院C++ Project 4 文字版挂机地牢探险游戏的设计 代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

 

 

 写在前面

调试了周末的半天,算是夯实c++基础与深度解析类的实战,对virtual函数等都有了更好的理解

本机环境visual studio2019  如下图

 

项目一共有两个文件 下面是代码详情,方便大家参考,毕竟我做的时候找了好久也没找打这个项目的完全版本,算是帮大家加深理解,这个项目可能有一些小bug还没细致排查,至少目前没发现,后续再深入改造。代码如下:

project4.h文件

#pragma once
#include<vector>
#include <windows.h>using namespace std;class role
{
public:int life_value_act;//实际血量int att_value;//攻击值int life_value_max;//血量上限int weapon_kind;//携带武器的种类role();virtual void init_life_bar() = 0;bool judge_live();virtual void de_life(int damage_v, int index);~role();};class people :public role
{
public:int exp_act;//当前经验值int poi_sta_value;//中毒状态的叠加数量vector<int> poi_state_room;//每个中毒状态经过的房间数量倒计时int blood_sta_value;//回血状态的叠加数量vector<int> blood_state_room;int num_master;//击杀怪物数量int num_rooms;//当前房间数量people();void init_life_bar();void print_exp_change(int exp_increase);void exp_add(int room_label);//增加经验void de_life(int damage_v, int master_index);//现在探险者类中实现,如果顺利将功能放在房屋的类中void blood_act();//加血void poi_act();void print_result();~people();
private:int exp_max;//最大经验值
};class master :public role {
public:int master_kind;int master_index;int att_value_save;int master_king_num;//首领怪物攻击次数bool master_king_recover;//首领怪物恢复标志位master(int kind_v, int index_v);void init_life_bar();void init_weapon(int weapon_k);void de_life(int damage_v, int index);~master();
private:int basic_life = 10;int basic_attack = 5;
};class room {
public:room();virtual void init_room(people& p);virtual void battle_event(people& p);virtual void result(people& p);~room();
};class campsite :public room {
public:campsite();void init_room(people& p);void print_campsite();~campsite();
private:static int num_campsite_room;//营地房间数量
};class normal_room :public room {
public:normal_room();void init_room(people& p);void battle_event(people& p);void result(people& p);void print_normal_room();~normal_room();
private:static int num_normal_room;
};class trap_room :public room {
public:trap_room();void init_room(people& p);void battle_event(people& p);void result(people& p);void print_trap_room();~trap_room();
private:static int num_trap_room;
};class king_room :public room {
public:king_room();void init_room(people& p);void battle_event(people& p);void result(people& p);void print_king_room();~king_room();
private:static int num_king_room;
};class weapon_room :public room {
public:weapon_room();void init_room(people& p);void battle_event(people& p);void result(people& p);void print_weapon_room();~weapon_room();
private:static int num_weapon_room;int life_value_record_;
};

project4.cpp文件

#include"project4.h"
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include<ctype.h>
#include<algorithm>
#include <cstdlib>
#include <ctime>using namespace std;role::role() {this->weapon_kind = 0;//没有携带武器
}bool role::judge_live() {return this->life_value_act > 0;
}
void role::de_life(int damage_v, int index) {this->life_value_act = this->life_value_act - damage_v;
}
role::~role() {
}
//定义探险者的成员函数
people::people() {this->exp_max = 10;this->exp_act = 0;this->poi_sta_value = 0;this->blood_sta_value = 0;this->num_master = 0;this->att_value = 10;this->num_rooms = 0;this->blood_state_room = { 0 };this->poi_state_room = { 0 };
}
void people::init_life_bar() {this->life_value_max = 100;this->life_value_act = this->life_value_max;
}
void people::print_exp_change(int exp_increase) 
{cout << "获得" << exp_increase << "点经验, 当前经验("<< exp_act <<"/" << exp_max << ")" << endl;
}
void people::exp_add(int room_label) {if (room_label==1 or room_label==2) {this->exp_act += (this->num_master);print_exp_change((this->num_master));}else if (room_label==3) {this->exp_act += 5;print_exp_change(5);}else if (room_label==4) {this->exp_act += (2);print_exp_change(2);}if (this->exp_act >= this->exp_max) {this->life_value_act = this->life_value_max;this->exp_act = this->exp_act % this->exp_max;cout << "恢复生命值:" << life_value_act << endl;cout << "当前经验值:" << exp_act << " / " << exp_max << ")" << endl;}
}
void people::de_life(int damage_v, int master_index) {//现在探险者类中实现,如果顺利将功能放在房屋的类中if (damage_v > 0) {this->life_value_act -= damage_v;cout << "怪物" << master_index << "攻击探险者,造成" << damage_v << "点伤害,探险者(" <<this->life_value_act << " / " << life_value_max << ")" << endl;}
}void people::blood_act() {this->life_value_act = min(this->life_value_max, this->life_value_act + (this->blood_sta_value));cout << "持续恢复效果触发,获得" << (this->blood_sta_value) << "点生命,当前生命(" << life_value_act << " / " << life_value_max << ")" << endl;//cout<<"效果剩余:"<<blood_sta_value<<" "<<blood_state_room[0]<<endl;for (auto i = this->blood_state_room.begin(); i<this->blood_state_room.end(); i++) {*i = *i - 1;if (*i <= 0) {if (i == this->blood_state_room.begin()) {//cout<<"condition1"<<endl;this->blood_state_room[0] = 0;}else {//cout<<"condition2"<<endl;this->blood_state_room.erase(i);}this->blood_sta_value = max(0, this->blood_sta_value - 1);}}//cout<<"效果剩余:"<blood_sta_value<<" "<blood_state_room[0]<<endl;
}
void people::poi_act() {this->life_value_act -= (this->poi_sta_value);cout << "持续损伤效果触发,失去" << (this->poi_sta_value) << "点生命,当前生命(" << life_value_act << " / " << life_value_max << ")"<<endl;for (auto i = this->poi_state_room.begin(); i<this->poi_state_room.end(); i++) {*i = *i - 1;if (*i <= 0) {if (i == this->poi_state_room.begin()) {//cout<<"condition1"<<endl;this->poi_state_room[0] = 0;}else {//cout<<"condition2"<<endl;this->poi_state_room.erase(i);}this->poi_sta_value = max(0, this->poi_sta_value - 1);}}}
void people::print_result() {campsite c_room;normal_room n_room;trap_room t_room;king_room k_room;weapon_room w_room;cout << "探险者死亡,共走过" << num_rooms << "个房间." << endl;c_room.print_campsite();n_room.print_normal_room();t_room.print_trap_room();k_room.print_king_room();w_room.print_weapon_room();
}
people::~people() {
}
//怪物类的成员函数
master::master(int kind_v, int index_v) {this->master_index = index_v;this->master_kind = kind_v;this->master_king_num = 0;this->master_king_recover = true;this->att_value_save = 10;this->att_value = 5;
}void master::init_life_bar() {if (this->master_kind==1)//对应基础怪物{//按设定随机生成+— 40%范围的属性值this->life_value_max = ( rand() % (basic_life * 14 - basic_life * 6 + 10) ) / 10 + basic_life*6 / 10;this->att_value = (rand() % (basic_attack * 14 - basic_attack * 6 + 10)) / 10 + basic_attack * 6 / 10;cout << "遇到怪物" <<master_index << "(" << life_value_max << " / " << life_value_max << ")" << endl;}else if (this->master_kind==2)//对应陷阱房间怪物{this->life_value_max = this->basic_life*2;this->att_value = this->basic_attack*2;cout << "遇到陷阱怪物" << "(" << life_value_max << " / " << life_value_max << ")" << endl;}else if (this->master_kind==3)//对应怪物首领{this->life_value_max = 40;this->att_value = 14;cout << "遇到首领怪物" << "(" << life_value_max << " / " << life_value_max << ")" << endl;}else if (this->master_kind==4)//武器房间的怪物{people p;p.init_life_bar();this->life_value_max = p.life_value_max*4 / 10;this->att_value = p.att_value*4 / 10;cout << "遇到变异怪物" << "(" << life_value_max << " / " << life_value_max << ")" << endl;}this->life_value_act = this->life_value_max;
}
void master::init_weapon(int weapon_k) {this->weapon_kind = weapon_k;//怪物房间携带武器种类
}
void master::de_life(int damage_v, int index) {if (this->master_kind==1 or this->master_kind==2 or this->master_kind==4){this->life_value_act -= damage_v;cout << "探险者攻击怪物" << master_index << ", 造成" << damage_v << "点伤害,怪物" << master_index<< "(" << life_value_act << " / " << life_value_max << ")" << endl;}else if (this->master_kind==3) {this->life_value_act -= damage_v;cout << "探险者攻击怪物首领, 造成" << damage_v << "点伤害,首领怪物" << master_index<< "(" << life_value_act << " / " << life_value_max << ")" << endl;if (this->att_value==0) {this->att_value = this->att_value_save;}else if (this->life_value_act <= 10 && this->master_king_recover==true) {this->att_value_save = this->att_value;this->att_value = 0;this->life_value_act += 20;this->master_king_recover = false;cout << "怪物首领恢复生命20点,怪物首领" << "(" << life_value_act << " / " << life_value_max << ")" << endl;}else{this->att_value += 1;//攻击力增加}}}
master::~master() {
}
//营地类的成员函数
room::room() {//cout<<"创建一个房间"<<endl;
}
void room::init_room(people& p) {
}
void room::battle_event(people& p) {
}
void room::result(people& p) {
}
room::~room() {//cout<<"删除当前房间"<<endl;
}campsite::campsite() {
}
void campsite::init_room(people& p) {num_campsite_room++;cout << "进入营地房间" << endl;p.num_rooms++;if (p.poi_sta_value > 0){p.poi_act();}if (p.blood_sta_value > 0) {p.blood_act();}p.life_value_act = p.life_value_max;cout << "探险者恢复全部生命值,当前生命值:(" << p.life_value_act << " / " << p.life_value_max << ")." << endl;
}
void campsite::print_campsite() {cout << "进入营地数量:" << num_campsite_room << endl;
}
campsite::~campsite() {
}
int campsite::num_campsite_room = 0;//普通房间的成员函数
normal_room::normal_room() {
}
void normal_room::init_room(people& p) {num_normal_room++;cout << "进入普通房间" << endl;p.num_rooms++;if (p.poi_sta_value > 0){p.poi_act();}if (p.blood_sta_value > 0) {p.blood_act();}int probability_re = rand() % 100;//cout<<"事件概率:"<<probability_re<<endl;if (probability_re < 10) {p.life_value_act = min(100, p.life_value_act + 10);//恢复10点生命力cout << "触发事件,恢复10点生命,获得持续恢复效果,当前生命(" << p.life_value_act << "/" << p.life_value_max << ")." << endl;p.blood_sta_value++;if (p.blood_sta_value == 1 && p.blood_state_room[0] == 0) {p.blood_state_room[0] = 2;}p.blood_state_room.push_back(2);}if (!p.judge_live()) {//探险者去世事件p.print_result();}
}
void normal_room::battle_event(people& p) {//cout<<"战斗开始"<<endl;int num_master = rand() % 3 + 1;vector<master> masters;for (int i = 1; i <= num_master; i++) {master m1(1, i);m1.init_life_bar();masters.push_back(m1);}sort(masters.begin(), masters.end(), [](master& m1, master& m2) {return m1.att_value > m2.att_value;});//按照战斗力对怪物排名cout << "战斗开始" << endl;while (p.judge_live()) {//开始战斗if (masters.size() > 0) {masters[0].de_life(p.att_value, 1);if (!masters[0].judge_live()) {cout << "怪物" << masters[0].master_index << "死亡" << endl;masters.erase(masters.begin());p.num_master++;}for (int i = 0; i < masters.size(); i++) {p.de_life(masters[i].att_value, masters[i].master_index);if (!p.judge_live()) {p.print_result();break;}}}else {//所有怪兽被消灭break;}}if (!p.judge_live()) {//探险者去世事件p.print_result();}
}
void normal_room::result(people& p) {p.exp_add(1);p.num_master = 0;//击杀怪物清零
}
void normal_room::print_normal_room() {cout << "进入普通房间:" << num_normal_room << endl;
}
normal_room::~normal_room() {
}
int normal_room::num_normal_room = 0;
//陷阱房间类成员函数
trap_room::trap_room() {
}
void trap_room::init_room(people& p) {num_trap_room++;cout << "进入陷阱房间" << endl;p.num_rooms++;if (p.poi_sta_value > 0){p.poi_act();}if (p.blood_sta_value > 0) {p.blood_act();}int reduce_v = max(1, (p.life_value_act / 10));p.life_value_act -= reduce_v;//生命数<20,则每次减1.cout << "触发事件,损失" << reduce_v << "点生命,造成持续损伤,当前生命(" << p.life_value_act << " / " << p.life_value_max << ")." << endl;p.poi_sta_value++;if (p.poi_sta_value == 1 && p.poi_state_room[0] == 0) {p.poi_state_room[0] = 5;}p.poi_state_room.push_back(5);if (!p.judge_live()) {//探险者去世事件p.print_result();}
}
void trap_room::battle_event(people& p) {master m1(2, 1);m1.init_life_bar();cout << "战斗开始" << endl;while (p.judge_live()) {m1.de_life(p.att_value, 1);if (!m1.judge_live()) {cout << "怪物" << m1.master_index << "死亡" << endl;p.num_master = 1;break;//怪物死亡跳出循环}p.de_life(m1.att_value, m1.master_index);if (!p.judge_live()) {//探险者去世事件p.print_result();}}
}
void trap_room::result(people& p) {p.exp_add(2);p.num_master = 0;//对怪物数量清零
}
void trap_room::print_trap_room() {cout << "进入陷阱房间:" << num_trap_room << endl;
}
trap_room::~trap_room() {
}
int trap_room::num_trap_room = 0;//首领房间
king_room::king_room() {
}
void king_room::init_room(people& p) {num_king_room++;cout << "进入怪物首领房间" << endl;p.num_rooms++;p.poi_sta_value = 0;p.poi_state_room = { 0 };if (p.blood_sta_value > 0) {p.blood_act();}p.life_value_act = min(p.life_value_max, p.life_value_act + 20);//最大为上限值cout << "生命恢复, 当前生命(" << p.life_value_act << " / " << p.life_value_max << ")." << endl;cout << "持续损伤效果被移除" << endl;
}
void king_room::battle_event(people& p) {master m1(3, 1);m1.init_life_bar();cout << "战斗开始" << endl;while (p.judge_live()) {m1.de_life(p.att_value, 1);if (!m1.judge_live()) {cout << "首领怪物死亡" << endl;break;//怪物死亡跳出循环}p.de_life(m1.att_value, m1.master_index);if (m1.att_value != 0) {m1.master_king_num += 1;}if (!p.judge_live()) {//探险者去世事件p.print_result();}}
}
void king_room::result(people& p) {p.exp_add(3);
}
void king_room::print_king_room() {cout << "进入怪物首领房间数量:" << num_king_room << endl;
}
king_room::~king_room() {
}
int king_room::num_king_room = 0;//武器房间类初始化
weapon_room::weapon_room() {
}
void weapon_room::init_room(people& p) {num_weapon_room++;cout << "进入武器房间" << endl;p.num_rooms++;this->life_value_record_ = p.life_value_act;if (p.poi_sta_value > 0){p.poi_act();}if (p.blood_sta_value > 0) {p.blood_act();}if (!p.judge_live()) {//探险者去世事件p.print_result();}
}
void weapon_room::battle_event(people& p) {master m1(4, 1);m1.init_life_bar();cout << "战斗开始" << endl;while (p.judge_live()) {m1.de_life(p.att_value, 1);if (!m1.judge_live()) {cout << "武器怪物死亡" << endl;break;//怪物死亡跳出循环}p.de_life(m1.att_value, m1.master_index);if (!p.judge_live()) {//探险者去世事件p.print_result();}}
}
void weapon_room::result(people& p) {p.exp_add(4);p.life_value_act = this->life_value_record_;//恢复记录生命cout << "探险者恢复进入房间时生命值(" << p.life_value_act << " / " << p.life_value_max << ")" << endl;
}
void weapon_room::print_weapon_room() {cout << "进入武器房间数量:" << num_weapon_room << endl;
}
weapon_room::~weapon_room() {
}
int weapon_room::num_weapon_room = 0;int main() {people explorer1;explorer1.init_life_bar();//初始化探险家cout << "这里有一个人" << endl;//people *ref_ex=&explorer;int probility_room = 0;room* ptr_room = new room();srand(time(0));while (explorer1.judge_live()) {probility_room = rand() % 100;//通过随机函数生成不同的房间//cout<<"生成房间概率"<<probility_room<<endl;if (probility_room <= 9) {ptr_room = new campsite();}else if (probility_room <= 64) {ptr_room = new normal_room();}else if (probility_room <= 79) {ptr_room = new trap_room();}else if (probility_room <= 89) {ptr_room = new king_room();}else if (probility_room <= 99) {ptr_room = new weapon_room();}ptr_room->init_room(explorer1);if (!explorer1.judge_live()) {break;}Sleep(1000);ptr_room->battle_event(explorer1);if (!explorer1.judge_live()) {break;}Sleep(1000);ptr_room->result(explorer1);}return 1;}

运行结果

 

这篇关于深蓝学院C++ Project 4 文字版挂机地牢探险游戏的设计 代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/780260

相关文章

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

C++11委托构造函数和继承构造函数的实现

《C++11委托构造函数和继承构造函数的实现》C++引入了委托构造函数和继承构造函数这两个重要的特性,本文主要介绍了C++11委托构造函数和继承构造函数的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、委托构造函数1.1 委托构造函数的定义与作用1.2 委托构造函数的语法1.3 委托构造函