有一个weapon*类型的vector数组,里面存放的是各种武器,分别是编号为0的sword,编号为1的bomb,bomb使用一次就会消失,编号为2的arrow,编号为3的用过一次的arrow,arrow一共可以用两次,现在进行战斗,实现一个函数,完成如下功能,每次给函数传一个参数,代表目前是第几轮战斗,根据这个参数,返回这次应该使用的武器,在每次选择武器时,首先进行排序,编号小的排在前面,但是使用过的arrow排在前面,排好序后,攻击者按照这个排序依次对敌人使用武器,如果一件武器有多种,那就都要用上
时间: 2023-12-01 15:04:24 浏览: 71
好的,根据你的要求,我可以给你提供以下的代码实现:
```c++
#include <vector>
#include <algorithm>
using namespace std;
struct Weapon {
int type; // 武器类型
int used; // 是否使用过
};
bool cmp(const Weapon& w1, const Weapon& w2) {
if (w1.used && !w2.used) { // 使用过的箭排在前面
return true;
} else if (!w1.used && w2.used) {
return false;
} else {
return w1.type < w2.type; // 否则按照编号从小到大排序
}
}
enum WeaponType {
SWORD = 0,
BOMB = 1,
ARROW = 2,
USED_ARROW = 3
};
WeaponType ChooseWeapon(vector<WeaponType>& weapons, int round) {
vector<Weapon> weaponList;
for (int i = 0; i < weapons.size(); i++) {
weaponList.push_back({weapons[i], false});
}
// 对武器进行排序
sort(weaponList.begin(), weaponList.end(), cmp);
WeaponType chosen = SWORD; // 默认选择剑
switch (round % 3) {
case 0: // 第1轮、第4轮、第7轮...
chosen = SWORD; // 选择剑
break;
case 1: // 第2轮、第5轮、第8轮...
chosen = BOMB; // 选择炸弹
break;
case 2: // 第3轮、第6轮、第9轮...
for (int i = 0; i < weaponList.size(); i++) {
if (weaponList[i].type == USED_ARROW) {
chosen = USED_ARROW; // 选择用过的箭
weaponList[i].used = true; // 将用过的箭标记为使用过
break;
} else if (weaponList[i].type == ARROW && !weaponList[i].used) {
chosen = ARROW; // 选择新箭
int count = 0;
for (int j = i; j < weaponList.size(); j++) {
if (weaponList[j].type == ARROW && !weaponList[j].used) {
count++;
}
}
for (int j = i; j < i + count; j++) {
weaponList[j].used = true; // 将新箭标记为使用过
}
break;
}
}
break;
}
// 如果选择了炸弹,需要将其从武器数组中删除
if (chosen == BOMB) {
for (int i = 0; i < weaponList.size(); i++) {
if (weaponList[i].type == BOMB) {
weaponList.erase(weaponList.begin() + i);
i--; // 删除后数组大小会减小,需要将 i 减 1
}
}
}
// 将选择的武器类型转换成枚举值
chosen = static_cast<WeaponType>(chosen);
// 将武器数组更新为最新的状态
weapons.clear();
for (int i = 0; i < weaponList.size(); i++) {
weapons.push_back(static_cast<WeaponType>(weaponList[i].type));
}
return chosen;
}
```
这个函数的参数是一个 `vector<WeaponType>` 类型的武器数组和一个代表当前轮数的整数 `round`,返回值是一个 `WeaponType` 类型的枚举值,表示这一轮应该使用的武器。
实现过程中,我们将每件武器存储为一个结构体 `Weapon`,其中包含武器类型和是否使用过的标记。然后定义一个排序函数 `cmp`,对武器进行排序,根据使用过的箭排在前面,否则按照编号从小到大排序。在选择武器时,根据当前轮数选择武器,对于箭,优先选择用过的箭,如果没有用过的箭,则选择新箭,并将新箭全部标记为使用过。如果选择了炸弹,需要将其从武器数组中删除。最后将选择的武器类型转换成枚举值,并将武器数组更新为最新的状态。
需要注意的是,如果一件武器有多种,需要全部用上。例如,在轮到使用箭的时候,如果武器数组中有多个新箭或用过的箭,需要全部使用,并将它们全部标记为使用过。
阅读全文