《凡人修仙传》中打斗场景(c++多态实现)
我們 要實(shí)現(xiàn)打斗場(chǎng)景,第一,我們需要有打斗的雙方,一個(gè)是英雄,一個(gè)是怪物,他們都有自己的屬性,比如攻擊,防御,血量。其次我們的英雄還會(huì)有武器。武器上有一些加成屬性,可以幫英雄更好的打怪物,武器也有多種武器可以讓英雄進(jìn)行選擇。
首先我們做武器類(lèi)的聲明,一個(gè)武器要有名稱(chēng),還基礎(chǔ)傷害,其次一些武器可能會(huì)有暴擊,吸血,定身的效果,我們要對(duì)此進(jìn)行判斷。由于我們并不實(shí)現(xiàn)武器這個(gè)類(lèi),我們僅僅希望,后面的實(shí)現(xiàn)的武器繼承他的屬性并實(shí)現(xiàn),所以我們武器類(lèi)的屬性都用純虛函數(shù)來(lái)寫(xiě)。
#pragma once #include<iostream> #include<string> using namespace std;//抽象類(lèi) class Weapon { public://獲取基礎(chǔ)傷害virtual int getBaseDamage() = 0;//獲取吸血virtual int getSuckBlood() = 0;//獲取是否定身virtual bool getHold()=0;//獲取是否暴擊virtual bool getCrit() = 0;string m_WeaponName; //武器名稱(chēng)int m_BaseDamage;//基礎(chǔ)傷害};我們有了武器類(lèi),就可以細(xì)化做武器了,我們這里就做兩個(gè)武器,一個(gè)是普通的小刀,另外一個(gè)是比較厲害的屠龍刀,我們先做小刀類(lèi)的聲明。小刀是武器,所以它要繼承武器類(lèi)的屬性,并擁有自己的構(gòu)造函數(shù)。虛函數(shù)可以實(shí)現(xiàn)動(dòng)態(tài)多態(tài)
#pragma once#include<iostream>#include"Weapon.h"#include<string>using namespace std;class Knife :public Weapon{public:Knife();//獲取基礎(chǔ)傷害virtual int getBaseDamage() ;//獲取吸血virtual int getSuckBlood() ;//獲取是否定身virtual bool getHold();//獲取是否暴擊virtual bool getCrit();};有了小刀類(lèi)的聲明后,我們可以在類(lèi)外實(shí)現(xiàn)小刀這個(gè)類(lèi),小刀沒(méi)有別的屬性,所以,我們只用在構(gòu)造中,把"小刀"這個(gè)名字和基礎(chǔ)攻擊力賦值,然后獲取攻擊力的函數(shù)中,返回基礎(chǔ)攻擊力就可以。
#include"Knife.h"Knife::Knife(){this->m_BaseDamage = 10;this->m_WeaponName = "小刀";}int Knife::getBaseDamage(){return this->m_BaseDamage;}int Knife::getSuckBlood(){return 0;}bool Knife::getHold(){return false;}bool Knife:: getCrit(){return false;}我們聲明屠龍刀類(lèi),屠龍刀依舊是繼承武器類(lèi),此外,作為一個(gè)強(qiáng)大的武器,它還必須具有其他的屬性,它還有吸血,暴擊,和可以讓怪物定身的能力,但是它的這些能力,并不是一定會(huì)觸發(fā),需要一些屬性也就是概率來(lái)觸發(fā)。
#pragma once //防止頭文件重復(fù)編譯#include<iostream>#include"Weapon.h"#include<string>using namespace std;class DragonSword :public Weapon{public:DragonSword();//獲取基礎(chǔ)傷害virtual int getBaseDamage();//獲取吸血virtual int getSuckBlood();//獲取是否定身virtual bool getHold();//獲取是否暴擊virtual bool getCrit();//吸血率,暴擊率,定身率int SuckRate;int holdRate;int critRate;//傳入概率 判斷是否觸發(fā)bool isTrigger(int rate);};屠龍刀的實(shí)現(xiàn):再構(gòu)造中,把它的基本屬性賦值,其他的屬性,我們通過(guò)一個(gè)成員函數(shù)來(lái)判斷是否觸發(fā)特效,我們?cè)跇?gòu)造中把觸發(fā)特效的概率寫(xiě)出來(lái),然后在判斷概率函數(shù)中,設(shè)置一個(gè)隨機(jī)數(shù),如果這個(gè)隨機(jī)數(shù)比概率小,則觸發(fā)特效。
#include"DragonSword.h"DragonSword::DragonSword(){this->m_BaseDamage = 20;this->m_WeaponName = "屠龍寶刀";this->SuckRate = 20;this->holdRate = 30;this->critRate = 35;}int DragonSword::getBaseDamage(){return this->m_BaseDamage;}int DragonSword::getSuckBlood(){if (isTrigger(SuckRate)){return this->m_BaseDamage*0.5; //按照武器基礎(chǔ)傷害一半吸血}return 0;}bool DragonSword::getHold(){if (isTrigger(holdRate)){return true;}return false;}bool DragonSword::getCrit(){if (isTrigger(critRate)){return true;}return false;}bool DragonSword::isTrigger(int rate){//通過(guò)isTrigger判斷是否觸發(fā)特效//隨機(jī)一個(gè)0~100的數(shù)字//rand()%100 是0~99之間的隨機(jī)數(shù) +1后是1~100之間的一個(gè)隨機(jī)數(shù)//如果產(chǎn)生的隨機(jī)數(shù)比設(shè)定的概率值小則發(fā)生,否則不發(fā)生int num = rand() % 100 + 1;if (num < rate){return true;}return false;}有了武器后,我們聲明英雄類(lèi),英雄除了基本屬性外,還要判斷是否有武器,有什么樣的武器
#pragma once#include<iostream>#include"Weapon.h"#include<string>#include"Monster.h"using namespace std;class Monster;class Hero{public:Hero();string m_Name;//人名int m_Atk;//攻擊力int m_Def;//防御力int m_Hp;//血量Weapon * weapon;//武器void EquipWeapon(Weapon * weapon);void Attack(Monster * monster);};英雄類(lèi)的實(shí)現(xiàn)。
#include"Hero.h"Hero::Hero(){this->m_Hp = 500;this->m_Atk = 45;this->m_Def = 50;this->m_Name = "劉法師";this->weapon = NULL;}//裝備武器void Hero::EquipWeapon(Weapon * weapon){this->weapon = weapon;cout << "英雄:" << this->m_Name << "裝備了武器" << this->weapon->m_WeaponName << endl;}void Hero::Attack(Monster * monster){int damage = 0;int addHp = 0;bool isHold = false;bool isCrit = false;if (this->weapon == NULL) //武器為空,沒(méi)有加成{damage = this->m_Atk;}else{//基礎(chǔ)傷害damage = this->m_Atk + this->weapon->m_BaseDamage;//計(jì)算吸血addHp = this->weapon->getSuckBlood();//計(jì)算定身isHold = this->weapon->getHold();//計(jì)算暴擊isCrit = this->weapon->getCrit();if (isCrit) //暴擊 傷害加成{damage = damage * 1.5;cout << "英雄的武器觸發(fā)了暴擊效果,怪物受到了高額傷害,傷害值:" << damage << endl;}if (isHold){cout << "英雄的武器觸發(fā)了定身效果,怪物停止攻擊一回合" << endl;}if (addHp){cout << "英雄的武器觸發(fā)了吸血效果,英雄" << this->m_Name << "的血量增加了" << addHp << endl;}}//設(shè)置怪物定身monster->m_Hold = isHold;//計(jì)算真實(shí)傷害int trueDamage = (damage - monster->m_Def) > 0 ? damage - monster->m_Def : 1;monster->m_Hp -= trueDamage;this->m_Hp += addHp;cout << "英雄" << this->m_Name << "攻擊了敵人" << monster->m_Name << "造成了傷害" << trueDamage << endl;}接下來(lái)我們就要聲明怪物類(lèi),怪物里除了基本屬性外,還有一些特殊屬性,比如是否被定身。
#pragma once#include<iostream>#include"Weapon.h"#include<string>#include"Hero.h"using namespace std;class Hero;class Monster{public:Monster();string m_Name;int m_Hp;int m_Atk;int m_Def;bool m_Hold;void Attack(Hero * hero);};怪物類(lèi)的實(shí)現(xiàn)
#include"Monster.h"Monster::Monster() {this->m_Hp = 300;this->m_Atk = 70;this->m_Def = 40;this->m_Hold = false;this->m_Name = "比克大魔王"; }void Monster::Attack(Hero* hero) {if (this->m_Hold){cout << "怪物" << this->m_Name << "被定身了,本回合無(wú)法攻擊" << endl;return;}//計(jì)算攻擊的傷害int damage = (this->m_Atk - hero->m_Def ) > 0 ? this->m_Atk - hero->m_Def : 1;hero->m_Hp -= damage;cout << "怪物" << this->m_Name << "攻擊了英雄" << hero->m_Name << "造成了傷害" << damage << endl; }最后就是一個(gè)打斗的實(shí)現(xiàn)了
#include<iostream> #include"Hero.h" #include"Monster.h" #include"Weapon.h" #include"Knife.h" #include"DragonSword.h" using namespace std;void play() {//創(chuàng)建怪物Monster * monster = new Monster;//創(chuàng)建英雄Hero *hero = new Hero;//創(chuàng)建武器Weapon * kinfe = new Knife;Weapon * dragon =new DragonSword;//讓用戶(hù)選擇武器cout << "請(qǐng)選擇武器:" << endl;cout << "1. 赤手空拳" << endl;cout << "2. 小刀" << endl;cout << "3. 屠龍刀" << endl;int oper;cin >> oper;switch (oper){case 1:cout << "你真牛X,你還是太年輕了" << endl;break;case 2:hero->EquipWeapon(kinfe);break;case 3:hero->EquipWeapon(dragon);break;default:cout << "沒(méi)有你要選擇的武器" << endl;break;}getchar();//輸入緩沖區(qū)里有個(gè)回車(chē),多獲取一次值int round = 1;while (true){getchar();system("cls");cout << "--當(dāng)前第" << round << "回合開(kāi)始-----" << endl;if (hero->m_Hp <= 0){cout << "英雄" << hero->m_Name << "已掛,游戲結(jié)束" << endl;break;}hero->Attack(monster);if (monster->m_Hp <= 0){cout << "怪物" << monster->m_Name << "已掛,順利通關(guān)" << endl;break;}monster->Attack(hero);if (hero->m_Hp <= 0){cout << "英雄" << hero->m_Name << "已掛,游戲結(jié)束" << endl;break;}cout << "英雄" << hero->m_Name << "剩余血量" << hero->m_Hp << endl;cout << "怪物" << monster->m_Name << "剩余血量" << monster->m_Hp << endl;round++;}delete monster;delete hero;delete kinfe;delete dragon;}運(yùn)行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的《凡人修仙传》中打斗场景(c++多态实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: c++中多态---3(虚析构和纯虚析构,
- 下一篇: 成都大熊猫繁育基地网上购票