C++ 多態練習,實現一個回合制小游戲


//頭文件
#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;

}

 

 

最終實現效果如下

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM