014 怪物过滤的设计和实现

本文介绍了游戏自动化中的怪物过滤功能设计,包括创建MonsterFilter类,实现添加攻击和过滤列表,以及更新和清除数据的函数。通过判断怪物是否在攻击列表或不在过滤列表来决定是否攻击,从而实现自动攻击任务指定怪物的目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录


之前我们已经完成了自动打怪,自动技能和自动吃药的功能。接下来需要实现自动任务。那么现在就会遇到这么一个问题,大部分的任务都是指定去打某些怪物,但是我们的自动打怪都是默认攻击最近的怪物,这里就需要用到怪物过滤的功能了。

怪物过滤的设计

新建一个类,命名为MonsterFilter

//过滤的列表
vector<wstring> m_FilterList;

首先准备一个过滤的怪物列表,把不需要攻击的怪物放到这个列表里 。

//攻击的列表
vector<wstring> m_AttackList;

然后准备一个攻击的怪物列表,把需要攻击的怪物全部存放到这个容器里。两个列表是互斥的,如果设置了过滤列表就不使用攻击列表;设置了攻击列表就不使用过滤列表。

	//添加攻击列表
	void AddAttackList(wstring MonsterName);


	//添加过滤列表
	void AddFilterList(wstring MonsterName);

然后声明两个函数,一个添加攻击列表,一个添加过滤列表。

	//刷新匹配的怪物
	void UpdateMonsters(_stuObjs& MonsterList);

然后准备一个函数用来刷新怪物列表,把不满足条件的怪物 删除。这个列表需要被实时修改,所以传入引用。

//清空所有数据
void ClearAllData();

再准备一个函数用来清空所有数据。MonsterFilter.h完整代码如下:

#pragma once
#include "pch.h"
class MonsterFilter
{
public:
	//添加攻击列表
	void AddAttackList(wstring MonsterName);


	//添加过滤列表
	void AddFilterList(wstring MonsterName);

	//刷新匹配的怪物
	void UpdateMonsters(_stuObjs& MonsterList);
    
    //清空所有数据
	void ClearAllData();

public:
	//过滤的列表
	vector<wstring> m_FilterList;

	//攻击的列表
	vector<wstring> m_AttackList;
};

代码实现

//添加攻击列表
void MonsterFilter::AddAttackList(wstring MonsterName)
{
	//遍历攻击列表
	for (auto obj: m_AttackList)
	{
		//如果当前容器中已经有需要添加的怪物 直接退出
		if (obj== MonsterName)
		{
			return;
		}
	}

	//如果没有在容器中找到需要攻击的怪物 则添加到容器
	m_AttackList.push_back(MonsterName);

}

//添加过滤列表
void MonsterFilter::AddFilterList(wstring MonsterName)
{
	//遍历攻击列表
	for (auto obj : m_FilterList)
	{
		//如果当前容器中已经有需要添加的怪物 直接退出
		if (obj == MonsterName)
		{
			return;
		}
	}

	//如果没有在容器中找到需要攻击的怪物 则添加到容器
	m_FilterList.push_back(MonsterName);
}

//清空所有数据
void MonsterFilter::ClearAllData()
{
	m_AttackList.clear();
	m_FilterList.clear();
}

添加列表和清空列表的代码都比较简单,关键在于怎么将怪物列表中不满足条件的怪物删除。

	//判断怪物是否需要攻击(在攻击列表或者不在过滤列表)
	BOOL CheckNeedAttack(wstring MonsterName);

新增一个函数,判断当前怪物是否需要攻击,判断是否需要攻击的条件是在攻击列表或者不在过滤列表,代码实现如下:

//判断是否是需要攻击的怪物
BOOL MonsterFilter::CheckNeedAttack(wstring MonsterName)
{
	//攻击列表不存在
	if (m_AttackList.size()==0)
	{
		//遍历过滤列表
		for (auto obj:m_FilterList)
		{
			//如果在过滤列表
			if (obj== MonsterName)
			{
				//说明这个怪物是需要过滤掉的  不需要被攻击 所以返回FALSE
				return FALSE;
			}
		}
		//遍历完成 说明不存在过滤列表 返回TRUE
		return TRUE;
	}
	else
	{
		//遍历攻击列表 逻辑和上面相反
		for (auto obj : m_AttackList)
		{
			if (obj == MonsterName)
			{

				return TRUE;
			}
		}
		return FALSE;
	}
}

然后再实现删除不符合要求的怪物列表

//刷新匹配的怪物 把不满足条件的怪物删除
void MonsterFilter::UpdateMonsters(_stuObjs& MonsterList)
{
	for (auto it=begin(MonsterList.m_data);it!=end(MonsterList.m_data);it++)
	{
		//如果不符合条件 则删除
		if (CheckNeedAttack(it->m_Name)==FALSE)
		{
			MonsterList.m_data.erase(it);
		}
	}
}

这样我们就完成了怪物过滤的设计了。使用的时候只需要传入任务需要攻击的怪物,就能实现自动攻击任务怪物。

在这里插入图片描述

在GlobalData加一个全局的类对象

在这里插入图片描述

然后在自动打怪线程过滤怪物。需要过滤的怪物我们在接任务的时候去添加,这里当前的过滤列表是空的,也不影响整个代码流程。

下一篇我们开始找自动任务需要的数据。

Github:https://github.com/TonyChen56/GameReverseNote

完整代码:https://download.csdn.net/download/qq_38474570/79498815

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鬼手56

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值