//頭文件
#ifndef WUQI_H #define WUQI_H
#include <iostream> #include <string> using namespace std; class wuqi { public: virtual int Get_wuqi_gongji() = 0;//獲取攻擊力 virtual string Get_wuqi_name() = 0;//獲取武器名稱 virtual int Get_wuqi_baoji() = 0;//獲取武器暴擊率 virtual int Get_wuqi_xixue() = 0;//獲取武器吸血率 virtual bool is_chufa(int num)=0;//觸發條件 protected: string wuqiname; //武器名稱 int gongji;//武器攻擊 int baoji; //武器暴擊率 int xixue; //武器吸血率 }; #endif
//創建一個狼牙棒類
#ifndef LANGYABANG_H #define LANGYABANG_H #include "wuqi.h" #include <iostream> #include <string> using namespace std; class langyabang:public wuqi { public: langyabang(); ~langyabang(); virtual int Get_wuqi_gongji();//獲取攻擊力 virtual string Get_wuqi_name() ;//獲取武器名稱 virtual int Get_wuqi_baoji();//獲取武器暴擊率 virtual int Get_wuqi_xixue();//獲取武器吸血率 virtual bool is_chufa(int num) ;//觸發條件 }; #endif
//創建一個棍子類
#ifndef GUNZI_H #define GUNZI_H #include "wuqi.h" #include <iostream> #include <string> using namespace std; class gunzi :public wuqi { public: gunzi(); ~gunzi(); virtual int Get_wuqi_gongji();//獲取攻擊力 virtual string Get_wuqi_name();//獲取武器名稱 virtual int Get_wuqi_baoji();//獲取武器暴擊率 virtual int Get_wuqi_xixue();//獲取武器吸血率 virtual bool is_chufa(int num);//觸發條件 }; #endif
//創建一個英雄基類
#ifndef YINGXIONG_H #define YINGXIONG_H #include "langyabang.h" #include <iostream> #include <string> using namespace std; class yingxiong { public: virtual int Get_yingxiong_gongji() = 0;//獲取英雄攻擊力 virtual string Get_yingxiong_name() = 0;//獲取英雄名稱 virtual int Get_yingxiong_baoji() = 0;//獲取英雄暴擊率 virtual int Get_yingxiong_xixue() = 0;//獲取英雄吸血率 virtual int Get_yingxiong_xixuezhi(int num) = 0;//獲取英雄吸血值 virtual int Get_yingxiong_def() = 0;//獲取英雄防御力 virtual int Get_yingxiong_hp() = 0;//獲取英雄血量 virtual bool is_chufa(int num) = 0;//觸發條件 virtual void Set_yingxiong_wuqi(wuqi* other) = 0; //英雄裝備武器 virtual wuqi* Get_yingxiong_wuqi() = 0;//獲取英雄武器 virtual string Getwuqi_name() = 0;//獲取武器名稱 protected: string yingxiongname; //英雄名稱 int Hp;//英雄血量 int gongji;//英雄攻擊 int baoji; //英雄暴擊率 int def; //英雄防御 wuqi* m_wuqi;//裝備的武器 }; #endif
//創建一個英雄類
#ifndef JIANSHENG_H #define JIANSHENG_H #include "yingxiong.h" #include <iostream> #include <string> using namespace std; class jiansheng:public yingxiong { public: jiansheng(); ~jiansheng(); virtual int Get_yingxiong_gongji() ;//獲取攻擊力 virtual int Get_yingxiong_hp();//獲取英雄血量 virtual string Get_yingxiong_name() ;//獲取武器名稱 virtual int Get_yingxiong_baoji() ;//獲取武器暴擊率 virtual int Get_yingxiong_xixue() ;//獲取武器吸血率 virtual int Get_yingxiong_xixuezhi(int num);//獲取英雄吸血值 virtual int Get_yingxiong_def() ;//獲取英雄防御力 virtual bool is_chufa(int num) ;//觸發條件 virtual void Set_yingxiong_wuqi(wuqi* other) ; //裝備武器 virtual wuqi* Get_yingxiong_wuqi() ;//獲取英雄武器 virtual string Getwuqi_name() ;//獲取武器名稱 }; #endif
//創建一個怪物基類
#ifndef GUAIWU_H #define GUAIWU_H #include <iostream> #include <string> using namespace std; class guaiwu { public: virtual string Get_guaiwu_name() = 0; //獲取怪物名稱 virtual int Get_guaiwu_gongji() = 0;//獲取怪物攻擊 virtual int Get_guaiwu_def() = 0;//獲取怪物防御力 virtual int Get_guaiwu_hp() = 0;//獲取怪物血量 protected: string guaiwuname; //怪物名稱 int gongji;//怪物攻擊 int def; //怪物防御力 int Hp;//怪物血量 }; #endif
//創建一個怪物
#ifndef BANSHOUREN_H #define BANSHOUREN_H #include <iostream> #include <string> #include "guaiwu.h" using namespace std; class banshouren:public guaiwu { public: banshouren(); ~banshouren(); virtual string Get_guaiwu_name() ; //獲取怪物名稱 virtual int Get_guaiwu_gongji() ;//獲取怪物攻擊 virtual int Get_guaiwu_def() ;//獲取怪物防御力 virtual int Get_guaiwu_hp() ;//獲取怪物血量 }; #endif
//創建一個管理員類
#ifndef MANAGER_H #define MANAGER_H #include <time.h> #include "banshouren.h" #include "langyabang.h" #include "gunzi.h" #include "jiansheng.h" #include <windows.h> #define DELETEOBJ(p) {if(p!=NULL)delete p;p==NULL; } using namespace std; class manager { public: manager(); ~manager(); void initGame(); //初始化游戲 void yingxiongask();//英雄攻擊怪物 void guaiwuask();//怪物攻擊英雄 int Get_yingxiong_hp_now(); //獲取當前英雄生命值 int Get_guaiwu_hp_now();//獲取當前怪物生命值 int showgame();//開始游戲回合 void restgame();//游戲重開 int showmassager();//游戲結束提示 int round = 1;//游戲回合 private: wuqi* m_langyabang; //武器類 wuqi* m_gunzi; //武器類 yingxiong* m_yingxiong; //英雄類 guaiwu* m_guaiwu; //怪物類 int yingxiong_hp_now; //英雄當前剩余生命值 int guaiwu_hp_now; //怪物當前剩余生命值 }; #endif
//狼牙棒cpp文件
#include "langyabang.h" //構造 langyabang::langyabang() { this->wuqiname = "狼牙棒"; this->gongji = 100; this->baoji = 20; this->xixue = 15; } //析構 langyabang::~langyabang() { } int langyabang::Get_wuqi_gongji()//獲取攻擊力 { return this->gongji; } string langyabang::Get_wuqi_name()//獲取武器名稱 { if (this == NULL) return "雙手"; return this->wuqiname; } int langyabang::Get_wuqi_baoji()//獲取武器暴擊率 { return this->baoji; } int langyabang::Get_wuqi_xixue()//獲取武器吸血率 { return this->xixue; } bool langyabang::is_chufa(int num)//觸發條件 { if (rand() % 100 < num) return true; return false; }
//棍子cpp文件
#include "gunzi.h" //構造 gunzi::gunzi() { this->wuqiname = "棍子"; this->gongji = 20; this->baoji = 0; this->xixue = 0; } //析構 gunzi::~gunzi() { } int gunzi::Get_wuqi_gongji()//獲取攻擊力 { return this->gongji; } string gunzi::Get_wuqi_name()//獲取武器名稱 { if (this == NULL) return "雙手"; return this->wuqiname; } int gunzi::Get_wuqi_baoji()//獲取武器暴擊率 { return this->baoji; } int gunzi::Get_wuqi_xixue()//獲取武器吸血率 { return this->xixue; } bool gunzi::is_chufa(int num)//觸發條件 { if (rand() % 100 < num) return true; return false; }
//英雄cpp
#include "jiansheng.h" jiansheng::jiansheng()//構造 { this->yingxiongname = "劍聖"; this->Hp = 800; this->gongji = 150; this->def = 50; this->baoji = 20; this->m_wuqi = NULL; } jiansheng::~jiansheng() //析構 { } string jiansheng::Getwuqi_name()//獲取武器名稱 { if (this->Get_yingxiong_wuqi() == NULL) return "空手"; return this->Get_yingxiong_wuqi()->Get_wuqi_name(); } int jiansheng::Get_yingxiong_gongji()//獲取攻擊力 { if (this->m_wuqi == NULL) return this->gongji; else return this->gongji + this->m_wuqi->Get_wuqi_gongji(); } string jiansheng::Get_yingxiong_name()//獲取英雄名稱 { return this->yingxiongname; } int jiansheng::Get_yingxiong_hp()//獲取英雄血量 { return this->Hp; } int jiansheng::Get_yingxiong_baoji()//獲取英雄暴擊率 { if (this->m_wuqi == NULL) return this->baoji; else return this->baoji + this->m_wuqi->Get_wuqi_baoji(); } int jiansheng::Get_yingxiong_xixuezhi(int num)//獲取英雄吸血值 { if (this->m_wuqi == NULL) return 0; else return num /100* this->Get_yingxiong_xixue(); } int jiansheng::Get_yingxiong_xixue()//獲取英雄吸血率 { if (this->m_wuqi == NULL) return 0; else return this->m_wuqi->Get_wuqi_xixue(); } int jiansheng::Get_yingxiong_def()//獲取英雄防御力 { return this->def; } bool jiansheng::is_chufa(int num)//觸發條件 { if (rand() % 100 < num) return true; return false; } void jiansheng::Set_yingxiong_wuqi(wuqi* other) //裝備武器 { this->m_wuqi=other; } wuqi* jiansheng::Get_yingxiong_wuqi()//獲取英雄武器 { if (this->m_wuqi == NULL) return NULL; return this->m_wuqi; }
//怪物cpp文件
#include "banshouren.h" banshouren::banshouren() { this->guaiwuname = "半獸人"; this->gongji = 200; this->def = 50; this->Hp = 2000; } banshouren::~banshouren() { } string banshouren::Get_guaiwu_name() //獲取怪物名稱 { return this->guaiwuname; } int banshouren::Get_guaiwu_gongji()//獲取怪物攻擊 { return this->gongji; } int banshouren::Get_guaiwu_def()//獲取怪物防御力 { return this->def; } int banshouren::Get_guaiwu_hp()//獲取怪物血量 { return this->Hp; }
//管理者cpp文件
#include "manager.h" manager::manager() { srand((unsigned)time(NULL)); this->m_guaiwu = new banshouren; this->m_langyabang = new langyabang; this->m_gunzi = new gunzi; this->m_yingxiong = new jiansheng; this->guaiwu_hp_now = m_guaiwu->Get_guaiwu_hp(); this->yingxiong_hp_now = m_yingxiong->Get_yingxiong_hp(); } int manager::Get_yingxiong_hp_now() { return this->yingxiong_hp_now; } int manager::Get_guaiwu_hp_now() { return this->guaiwu_hp_now; } manager::~manager() { DELETEOBJ(m_langyabang); DELETEOBJ(m_gunzi); DELETEOBJ(m_yingxiong); DELETEOBJ(m_guaiwu); } void manager::initGame() { int num; cout << "請為英雄裝備一把武器,輸入1為狼牙棒,輸入2為棍子,輸入其他則不裝備任何武器" << endl; cin >> num; switch (num) { case 1: m_yingxiong->Set_yingxiong_wuqi(m_langyabang); cout << "英雄裝備了:" << m_yingxiong->Getwuqi_name() << " 就上了!" << endl; break; case 2: m_yingxiong->Set_yingxiong_wuqi(m_gunzi); cout << "英雄裝備了:" << m_yingxiong->Getwuqi_name() << " 就上了!" << endl; break; default: cout << "英雄空手就上了!" << endl; break; } } void manager::yingxiongask() { int shanghai; //英雄攻擊怪物 if (this->m_yingxiong->is_chufa( this->m_yingxiong->Get_yingxiong_baoji() ) == true)//判斷是否觸發暴擊 { shanghai = (this->m_yingxiong->Get_yingxiong_gongji() - this->m_guaiwu->Get_guaiwu_def()) * 2; //(攻擊力-防御力)*2 cout << "英雄使用" << m_yingxiong->Getwuqi_name() << "對怪物造成了一次暴擊傷害:" << shanghai << endl; } else { shanghai = this->m_yingxiong->Get_yingxiong_gongji() - this->m_guaiwu->Get_guaiwu_def(); //英雄攻擊力 - 防御力 cout << "英雄使用" << m_yingxiong->Getwuqi_name() << "對怪物造成了一次傷害:" << shanghai << endl; } this->guaiwu_hp_now -= shanghai; //英雄吸血 if (yingxiong_hp_now + this->m_yingxiong->Get_yingxiong_xixuezhi(shanghai) >= m_yingxiong->Get_yingxiong_hp()) //判斷吸血后是否大於總血量,若大於總血量則回滿血量並不會溢出, 否則當前血量+吸血量為當前英雄剩余血量 { yingxiong_hp_now = this->m_yingxiong->Get_yingxiong_hp(); cout << "英雄吸了一口血:" << this->m_yingxiong->Get_yingxiong_xixuezhi(shanghai) << endl; } else { yingxiong_hp_now += this->m_yingxiong->Get_yingxiong_xixuezhi(shanghai); cout << "英雄吸了一口血:" << this->m_yingxiong->Get_yingxiong_xixuezhi(shanghai) << endl; } } void manager::guaiwuask() { int shanghai; //定義怪物造成的傷害 shanghai = this->m_guaiwu->Get_guaiwu_gongji() - this->m_yingxiong->Get_yingxiong_def(); cout << "怪物對英雄造成了一次傷害:" << shanghai << endl; this->yingxiong_hp_now -= shanghai; } void manager::restgame()//游戲重開 { system("cls"); guaiwu_hp_now = m_guaiwu->Get_guaiwu_hp(); yingxiong_hp_now = m_yingxiong->Get_yingxiong_hp(); this->m_yingxiong->Set_yingxiong_wuqi(NULL); round = 1; initGame(); } int manager::showmassager() { int reslut = MessageBox(NULL, TEXT("游戲結束,是否選擇重開?"), TEXT("確認"), MB_ICONINFORMATION | MB_YESNO); switch (reslut) { case IDYES: { restgame(); return 100; // } case IDNO: return 101; } } int manager::showgame()//開始游戲回合 { while (1) { Sleep(1000); system("cls"); printf("--------------------------第%d回合----------------------------\n", round); yingxiongask(); guaiwuask(); if (Get_guaiwu_hp_now() <= 0) { cout << "怪物死亡~!" << endl; guaiwu_hp_now = 0; //生命值只能為0 不能為負數 break; } if (Get_yingxiong_hp_now() <= 0) { cout << "英雄死亡~!" << endl; yingxiong_hp_now = 0;//生命值只能為0 不能為負數 break; } cout << "當前英雄血量:" << Get_yingxiong_hp_now() << endl; cout << "當前怪物血量:" << Get_guaiwu_hp_now() << endl; round++; } return 0; }
//主函數
#include "manager.h" int main() { manager temp; temp.initGame(); //初始化游戲 temp.showgame(); //開始游戲 while (1) //循環判斷是否需要重開游戲,代碼100為重開否則直接退出 { if (temp.showmassager() == 100) { temp.showgame(); } else return 0; } return 0; }
最終實現效果如下

