基于opencv实现王者pk血条动态显示程序

//代码实现效果,血量的显示是一个动态的。

注意:在使用的时候一定要把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;
}

代码使用图片

使用图片的话,大家可以找一张喜欢的,我这个只是当时在画板上随便把两张图片拼接起来的

 

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2022年5月24日
下一篇 2022年5月24日

相关推荐