//代码实现效果,血量的显示是一个动态的。
注意:在使用的时候一定要把opencv的环境配置好,没有配置opencv可能无法运行
opencv的配置
配置可根据这个网址:
VS+opencv环境配置傻瓜式教程,一步一步来,没错昂_哔哩哔哩_bilibili
代码如下
//role.h
#pragma
#include <iostream>
using namespace std;
class Role
{
public:
//角色吸血
void recoverlife(double& life_);
//角色回蓝
void recoverblue(double& blue_);
//定义默认蓝条生命值
double blue = 1000, life = 1000;
//定义基础伤害:法伤和物伤
double magic_attack = 10, physic_attack = 10;
//定义基础防御:法抗和物抗
double magic_defense = 20, physic_defense = 20;
//角色暴击率
double critical = 0;
};
//凯
class Kai :public Role
{
public:
//技能一
double skill1();
double skill2();
double skill3();
//输出角色状态
void printjuese();
};
//吕布
class Lvbu :public Role
{
public:
//技能一
double skill1();
double skill2();
double skill3();
//输出角色状态
void printjuese();
};
//role.cpp
#include "role.h"
#pragma once
//输出角色状态
void Role::recoverlife(double& life_)
{
life = life * (1 + life_);
}
void Role::recoverblue(double& magic_)
{
blue = blue * (1 + magic_);
}
//技能一
double Kai::skill1()
{
double actual_harm;
life += 210;
actual_harm = 100 + physic_attack + magic_attack;
blue -= 150;
if (blue)return actual_harm;
else return 0;
}
double Kai::skill2()
{
double actual_harm;
life += life * 0.1;
actual_harm = 300 + physic_attack + magic_attack;
blue -= 150;
if (blue)return actual_harm;
else return 0;
}
double Kai::skill3()
{
double actual_harm;
magic_attack += 500;
physic_attack += 200;
actual_harm = 400 + physic_attack + magic_attack;
blue -= 250;
if (blue)return actual_harm;
else return 0;
}
//输出角色状态
void Kai::printjuese() {
cout << "凯当前状态:" << endl;
cout << "蓝:" << blue << " 生命:" << life << endl;
cout << "法伤: " << magic_attack << " 物伤: " << physic_attack << endl;
cout << "法抗: " << magic_defense << " 物抗: " << physic_defense << endl;
cout << "暴击率: " << critical << endl;
}
//技能一
double Lvbu::skill1()
{
double actual_harm;
life += life * 0.1;
actual_harm = 189 + physic_attack + magic_attack;
blue -= 150;
if (blue)return actual_harm;
else return 0;
}
double Lvbu::skill2()
{
double actual_harm;
life += life * 0.7;
physic_defense += 900;
magic_defense += 900;
actual_harm = 500 + physic_attack + magic_attack;
blue -= 150;
if (blue)return actual_harm;
else return 0;
}
double Lvbu::skill3()
{
double actual_harm;
magic_defense += 300;
magic_attack += 500;
actual_harm = 500 + physic_attack + magic_attack;
blue -= 250;
if (blue)return actual_harm;
else return 0;
}
//输出角色状态
void Lvbu::printjuese() {
cout << "吕布当前状态:" << endl;
cout << "蓝:" << blue << " 生命:" << life << endl;
cout << "法伤: " << magic_attack << " 物伤: " << physic_attack << endl;
cout << "法抗: " << magic_defense << " 物抗: " << physic_defense << endl;
cout << "暴击率: " << critical << endl;
}
#pragma once
//main.cpp
//1.基于面向对象思想,分二级建立王者荣耀游戏中的英雄类(抽象的英雄、特定类型的英雄)。
//2.在类中对英雄的属性(比如英雄的种类、魔法值、生命值、物理攻击值)
// 及行为(比如魔法攻击、物理攻击)进行具体描述。
//3.随机建立两个英雄,设计PK规则,实现两个英雄的PK,
//直至分开胜负,并且在PK过程中输出两个英雄的状态变化。
#include "role.h"
#include <iostream>
//#include "myrole.h"
using namespace std;
//随机出装
//角色状态
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
//图像几何形状绘制
void rectjianli(Rect& rect)
{
}
void draw_demo(cv::Mat image, double life1, double life2, double blue1, double blue2)
{
Mat image_copy = image.clone();
int num = 10;
//矩形绘制
Rect rect;
//凯的血条
Mat bg = Mat::zeros(image_copy.size(), image_copy.type());
//rectangle(image, rect, Scalar(0, 0, 255), 2, 8, 0);
rect.x = 50;
rect.y = 200;
rect.width = life1 / num;
rect.height = 20;
rectangle(image_copy, rect, Scalar(0, 0, 255), -1, 8);//填充
//吕布血条
Rect rect1;
rect1.x = 50 + 300;
rect1.y = 200;
rect1.width = life2 / num;
rect1.height = 20;
rectangle(image_copy, rect1, Scalar(0, 0, 255), -1, 8);
//凯的蓝条
Rect rect2;
rect2.x = 50;
rect2.y = 200 + 25;
rect2.width = blue1 / num;
rect2.height = 20;
rectangle(image_copy, rect2, Scalar(255, 0, 0), -1, 8);//填充
//吕布蓝条
Rect rect3;
rect3.x = 50 + 300;
rect3.y = 200 + 25;
rect3.width = blue2 / num;
rect3.height = 20;
rectangle(image_copy, rect3, Scalar(255, 0, 0), -1, 8);//填充
Mat dst;
addWeighted(image_copy, 0.7, bg, 0.3, 0, dst);
imshow("绘制", dst);
}
int main()
{
//创建背景
string path = "决斗图片.png";
Mat img = imread(path);
if (img.empty())
{
cout << "图片加载失败!" << endl;
return -1;
}
//namedWindow("image", WINDOW_FREERATIO);
//imshow("image", img);
double value = 1000;
draw_demo(img, value, value, value, value);
waitKey(1000);
//建立角色
Kai kai;
Lvbu lvbu;
lvbu.printjuese();
//lvbu.life -= 1;
//lvbu.life -= kai.skill1();
while (true)
{
cout << "请开始攻击:1技能1 2技能2 3技能3" << endl;
cout << "现在轮到凯发起进攻" << endl;
//建立随机种子,随机使用技能
srand((unsigned int)time(NULL));
int num = rand() % 3 + 1; //1 ->3
if (num == 1) { lvbu.life -= kai.skill1(); cout << "发起技能1\n"; }
else if (num == 2) { lvbu.life -= kai.skill2(); cout << "发起技能2\n";
}
else if (num == 3) { lvbu.life -= kai.skill2(); cout << "发起技能3\n";}
lvbu.printjuese();
draw_demo(img, kai.life, lvbu.life, 800, 400);
waitKey(1000);
if (lvbu.life < 1) { cout << "凯胜利,游戏结束" << endl; break; }
cout << "请开始攻击:1技能1 2技能2 3技能3" << endl;
cout << "现在轮到吕布发起进攻" << endl;
//cin >> num;
//建立随机种子,随机使用技能
srand((unsigned int)time(NULL));
int num1 = rand() % 3 + 1; //1 ->3
if (num1 == 1) { kai.life -= lvbu.skill1(); cout << "发起技能1\n";}
else if (num1 == 2) { kai.life -= lvbu.skill2(); cout << "发起技能2\n";}
else if (num1 == 3) { kai.life -= lvbu.skill2(); cout << "发起技能3\n";}
lvbu.printjuese();
draw_demo(img, kai.life, 888, kai.blue, 215);
waitKey(1000);
if (kai.life < 1) { cout << "吕布胜利,游戏结束" << endl; break; }
}
destroyAllWindows();
return 0;
}
代码使用图片
使用图片的话,大家可以找一张喜欢的,我这个只是当时在画板上随便把两张图片拼接起来的