有一个weapon*类型的vector数组,里面存放的是各种武器,分别是编号为0的sword,编号为1的bomb,bomb使用一次就会消失,编号为2的arrow,编号为3的用过一次的arrow,arrow一共可以用两次,现在进行战斗,实现一个函数,完成如下功能,每次给函数传一个参数,代表目前是第几轮战斗,根据这个参数,返回这次应该使用的武器,在每次选择武器时,首先进行排序,,根据从小到大的顺序排序,对于arrow,先使用用过的arrow如果一件武器有多种,就全都要用上
时间: 2024-01-10 19:03:35 浏览: 125
好的,根据你的描述,我可以给你提供以下的代码实现:
```c++
#include <vector>
#include <algorithm>
using namespace std;
enum WeaponType {
SWORD = 0,
BOMB = 1,
ARROW = 2,
USED_ARROW = 3
};
WeaponType ChooseWeapon(vector<WeaponType>& weapons, int round) {
// 对武器进行排序
sort(weapons.begin(), weapons.end());
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 < weapons.size(); i++) {
if (weapons[i] == USED_ARROW) {
chosen = USED_ARROW; // 选择用过的箭
weapons[i] = ARROW; // 将用过的箭变成新箭
break;
} else if (weapons[i] == ARROW) {
chosen = ARROW; // 选择新箭
int count = 0;
for (int j = i; j < weapons.size(); j++) {
if (weapons[j] == ARROW || weapons[j] == USED_ARROW) {
count++;
}
}
for (int j = i; j < i + count; j++) {
weapons[j] = USED_ARROW; // 将新箭变成用过的箭
}
break;
}
}
break;
}
// 如果选择了炸弹,需要将其从武器数组中删除
if (chosen == BOMB) {
for (int i = 0; i < weapons.size(); i++) {
if (weapons[i] == BOMB) {
weapons.erase(weapons.begin() + i);
i--; // 删除后数组大小会减小,需要将 i 减 1
}
}
}
return chosen;
}
```
这个函数的参数是一个 `vector<WeaponType>` 类型的武器数组和一个代表当前轮数的整数 `round`,返回值是一个 `WeaponType` 类型的枚举值,表示这一轮应该使用的武器。
实现过程中,我们首先对武器数组进行排序,然后根据当前轮数选择武器。对于箭,需要优先选择用过的箭,如果没有用过的箭,则选择新箭,并将新箭全部变成用过的箭。如果选择了炸弹,需要将其从武器数组中删除。最后返回选择的武器类型即可。
需要注意的是,如果一件武器有多种,需要全部用上。例如,在轮到使用箭的时候,如果武器数组中有多个新箭或用过的箭,需要全部使用,并将它们变成用过的箭。
阅读全文