一、题目
二、解题
1.题目
这段程序是一种简单的模拟实现炉石传说游戏的过程,该游戏中每个玩家拥有一定数量的生命值和一些牌。在该程序中,使用两个 vector 对象 v 来表示两个玩家,其中 v[0] 表示红方,v[1] 表示黑方。每个元素表示该玩家场上一张牌,其类型为 status 结构体,包含了该牌的生命值和攻击力。
程序的主要流程如下:
首先定义了一些常量和 status 结构体,并初始化两个 vector 对象,将两个玩家的初始状态(30 点生命值和 0 点攻击力)分别放入 vector 的第一个位置。
然后输入游戏步数 n,以及每一步的操作。针对每一步的操作,程序分别进行处理:
- 如果是召唤牌(summon),输入该牌的位置、攻击力和生命值,并在 vector 对应的位置插入一个新的 status 对象。
- 如果是攻击操作(attack),输入攻击者和被攻击者的位置,然后更新双方的生命值和状态,并在某一方的场上存在牌的生命值小于等于 0 时将它从 vector 中删除。
- 如果是回合结束操作(end),将玩家变更为对方玩家。
最后程序输出游戏结果,包括胜利方(如果有)、双方剩余的生命值和场上牌的数量(除去英雄牌)。
2.代码
dev c++ 5.11
#include<iostream>
#include<vector>
#include<string>
using namespace std;
#define OPONENT 1-player
const int RED=0;
const int BLACK=1;
struct status{
int life,power;
status(int l,int p){
life=l;
power=p;
}
};
vector<status> v[2];
int main(){
int n,player=RED;
cin>>n;
string action;
int position,attack,health;
int attacker,defender;
v[RED].push_back(status(30,0));
v[BLACK].push_back(status(30,0));
while(n--){
cin>>action;
if(action=="summon"){
cin>>position>>attack>>health;
v[player].insert(v[player].begin()+position,status(health,attack));
}else if(action=="attack"){
cin>>attacker>>defender;
v[player][attacker].life -= v[OPONENT][defender].power;
v[OPONENT][defender].life -= v[player][attacker].power;
if(v[player][attacker].life<=0)
v[player].erase(v[player].begin()+attacker);
if(defender!=0 && v[OPONENT][defender].life<=0)
v[OPONENT].erase(v[OPONENT].begin()+defender);
}else if(action=="end"){
player=OPONENT;
}
}
if(v[RED][0].life<=0)
cout<<-1<<endl;
else if(v[BLACK][0].life<=0)
cout<<1<<endl;
else
cout<<0<<endl;
cout<<v[RED][0].life<<endl;
cout<<v[RED].size()-1;
for(int i=1;i<(int)v[RED].size();i++)
cout<<" "<<v[RED][i].life;
cout<<endl;
cout<<v[BLACK][0].life<<endl;
cout<<v[BLACK].size()-1;
for(int i=1;i<(int)v[BLACK].size();i++)
cout<<" "<<v[BLACK][i].life;
cout<<endl;
return 0;
}
3.提交结果
总结
1.部分变量的含义
以下是代码中各个变量的含义:
- n:游戏指令数量。
- player:当前操作的玩家颜色,0 为红色,1 为黑色。
- OPONENT:对手的颜色。
- RED、BLACK:颜色常量,分别表示红色和黑色。
- struct status:表示一个角色的属性,包括生命和攻击力。
- vector v[2]:存放两个玩家的所有角色信息,v[0] 为红色玩家,v[1] 为黑色玩家。
- action:游戏指令类型,可能的取值为 “summon”(召唤一个角色)、“attack”(攻击一个角色)和 “end”(结束当前玩家回合)。
- position:召唤角色的位置,从左到右位置为 1 到 n。
- attack、health:召唤的角色的攻击力和生命值。
- attacker、defender:攻击者和防御者的位置,从左到右位置为 0 到 n。位置 0 表示攻击对方英雄,其他位置表示攻击对方场上的角色。
- v[player].push_back(status(30,0)):将当前玩家的英雄的生命和攻击力(初始值为 30 和 0)放入 v[player] 的第一项。
- v[player].insert(v[player].begin()+position,status(health,attack)):将召唤的一个角色的生命和攻击力放入 v[player] 中指定的位置。
- v[player][attacker].life -= v[OPONENT][defender].power:攻击指令中,攻击者减去防御者的攻击力。
- v[OPONENT][defender].life -= v[player][attacker].power:防御指令中,防御者减去攻击者的攻击力。
- v[player].erase(v[player].begin()+attacker): 攻击后如果攻击者死亡(生命值小于等于 0),则从 v[player] 中删除该角色。
- v[OPONENT].erase(v[OPONENT].begin()+defender): 攻击后如果防御者死亡(生命值小于等于 0),则从 v[OPONENT] 中删除该角色。
- v[RED][0].life:红色玩家英雄的生命值。
- v[RED].size()-1:红色场上角色的数量(不包括英雄)。
- v[RED][i].life:第 i 个角色的生命值。