CSP 201609-3 炉石传说
文章目錄
- 爐石傳說
- 輸入
- 輸出
- 樣例輸入
- 樣例輸出
- 思路
- 綜述
- 變量解釋
- 生成隨從
- 進(jìn)行攻擊
- 小技巧
- 總結(jié)
- 我遇到的坑點(diǎn)
- 代碼
爐石傳說
《爐石傳說:魔獸英雄傳》(Hearthstone: Heroes of Warcraft,簡(jiǎn)稱爐石傳說)是暴雪娛樂開發(fā)的一款集換式卡牌游戲(如下圖所示)。游戲在一個(gè)戰(zhàn)斗棋盤上進(jìn)行,由兩名玩家輪流進(jìn)行操作,本題所使用的爐石傳說游戲的簡(jiǎn)化規(guī)則如下: * 玩家會(huì)控制一些角色,每個(gè)角色有自己的生命值和攻擊力。當(dāng)生命值小于等于 0 時(shí),該角色死亡。角色分為英雄和隨從。
- 玩家各控制一個(gè)英雄,游戲開始時(shí),英雄的生命值為 30,攻擊力為 0。當(dāng)英雄死亡時(shí),游戲結(jié)束,英雄未死亡的一方獲勝。
- 玩家可在游戲過程中召喚隨從。棋盤上每方都有 7 個(gè)可用于放置隨從的空位,從左到右一字排開,被稱為戰(zhàn)場(chǎng)。當(dāng)隨從死亡時(shí),它將被從戰(zhàn)場(chǎng)上移除。
- 游戲開始后,兩位玩家輪流進(jìn)行操作,每個(gè)玩家的連續(xù)一組操作稱為一個(gè)回合。
- 每個(gè)回合中,當(dāng)前玩家可進(jìn)行零個(gè)或者多個(gè)以下操作:
- 當(dāng)隨從攻擊時(shí),攻擊方和被攻擊方會(huì)同時(shí)對(duì)彼此造成等同于自己攻擊力的傷害。受到傷害的角色的生命值將會(huì)減少,數(shù)值等同于受到的傷害。例如,隨從 X 的生命值為 HX、攻擊力為 AX,隨從 Y 的生命值為 HY、攻擊力為 AY,如果隨從 X 攻擊隨從 Y,則攻擊發(fā)生后隨從 X 的生命值變?yōu)?HX - AY,隨從 Y 的生命值變?yōu)?HY - AX。攻擊發(fā)生后,角色的生命值可以為負(fù)數(shù)。
本題將給出一個(gè)游戲的過程,要求編寫程序模擬該游戲過程并輸出最后的局面。
輸入
輸入第一行是一個(gè)整數(shù) n,表示操作的個(gè)數(shù)。接下來 n 行,每行描述一個(gè)操作,格式如下:
<action> <arg1> <arg2> …
其中表示操作類型,是一個(gè)字符串,共有 3 種:summon表示召喚隨從,attack表示隨從攻擊,end表示結(jié)束回合。這 3 種操作的具體格式如下:
* summon :當(dāng)前玩家在位置召喚一個(gè)生命值為、攻擊力為的隨從。其中是一個(gè) 1 到 7 的整數(shù),表示召喚的隨從出現(xiàn)在戰(zhàn)場(chǎng)上的位置,原來該位置及右邊的隨從都將順次向右移動(dòng)一位。
* attack :當(dāng)前玩家的角色攻擊對(duì)方的角色 。是 1 到 7 的整數(shù),表示發(fā)起攻擊的本方隨從編號(hào),是 0 到 7 的整數(shù),表示被攻擊的對(duì)方角色,0 表示攻擊對(duì)方英雄,1 到 7 表示攻擊對(duì)方隨從的編號(hào)。
* end:當(dāng)前玩家結(jié)束本回合。
注意:隨從的編號(hào)會(huì)隨著游戲的進(jìn)程發(fā)生變化,當(dāng)召喚一個(gè)隨從時(shí),玩家指定召喚該隨從放入戰(zhàn)場(chǎng)的位置,此時(shí),原來該位置及右邊的所有隨從編號(hào)都會(huì)增加 1。而當(dāng)一個(gè)隨從死亡時(shí),它右邊的所有隨從編號(hào)都會(huì)減少 1。任意時(shí)刻,戰(zhàn)場(chǎng)上的隨從總是從1開始連續(xù)編號(hào)。
輸出
輸出共 5 行。
第 1 行包含一個(gè)整數(shù),表示這 n 次操作后(以下稱為 T 時(shí)刻)游戲的勝負(fù)結(jié)果,1 表示先手玩家獲勝,-1 表示后手玩家獲勝,0 表示游戲尚未結(jié)束,還沒有人獲勝。
第 2 行包含一個(gè)整數(shù),表示 T 時(shí)刻先手玩家的英雄的生命值。
第 3 行包含若干個(gè)整數(shù),第一個(gè)整數(shù) p 表示 T 時(shí)刻先手玩家在戰(zhàn)場(chǎng)上存活的隨從個(gè)數(shù),之后 p 個(gè)整數(shù),分別表示這些隨從在 T 時(shí)刻的生命值(按照從左往右的順序)。
第 4 行和第 5 行與第 2 行和第 3 行類似,只是將玩家從先手玩家換為后手玩家。
樣例輸入
8 summon 1 3 6 summon 2 4 2 end summon 1 4 5 summon 1 2 1 attack 1 2 end attack 1 1樣例輸出
0 30 1 2 30 1 2思路
綜述
比平常訓(xùn)練的模擬題要簡(jiǎn)單許多,按部就班的模擬就能過。
變量解釋
隨從
定義了攻擊力,生命值,位置,排序按照位置來排序
英雄
定義了生命值,隨從數(shù)組
生成隨從
比較簡(jiǎn)單,怎么說的怎么模擬即可,沒有發(fā)現(xiàn)坑點(diǎn)。
void _summon(){int pos,hp,attack;cin>>pos>>attack>>hp;Follower per(pos,attack,hp);sort(hero[now].followers.begin(),hero[now].followers.end());for(int i=pos-1;i<hero[now].followers.size();i++){hero[now].followers[i].position++;}hero[now].followers.push_back(per);sort(hero[now].followers.begin(),hero[now].followers.end()); }進(jìn)行攻擊
也是按部就班的模擬;
注意區(qū)分隨從攻擊英雄和攻擊隨從的效果是不一樣的;
小技巧
如下所示,定義now變量,因?yàn)橹挥袃蓚€(gè)英雄,則定義英雄數(shù)組,hero[2],則hero[now]表示當(dāng)前操作的英雄,如果出現(xiàn)end,只需要操作now=!now即可
int now = 0;//0代表先手,1代表后手end操作:
void _end(){//轉(zhuǎn)換 now = !now; }總結(jié)
第一次沒有過,原因是題意沒看清楚,如果A攻擊C,則A收到的傷害是C的攻擊力,C收到的傷害是A的攻擊力。
第二次沒過原因是,如果A攻擊的是英雄,則A不會(huì)受到0點(diǎn)傷害值;
我遇到的坑點(diǎn)
- 攻擊英雄和攻擊隨從不一樣
- 英雄的生命值為0或者負(fù)數(shù),輸出兩者任意一個(gè)均可
如下圖所示,上面提交的是英雄死亡輸出負(fù)數(shù),下面提交的是英雄死亡輸出的是0,都可以過(題外話,下面提交的時(shí)間是0ms。。哎不知道為什么,絕殺???)
代碼
完整代碼
#include <iostream> #include <cstring> #include <vector> #include <algorithm> using namespace std;//隨從 struct Follower{int attack_power;int HP;int position;Follower(int pos=1,int attack=1,int hp=1):position(pos),HP(hp),attack_power(attack){}bool operator < (const Follower & P)const {if(position != P.position) return position < P.position;} };//英雄 struct Hero{int HP;vector<Follower> followers;hero(){HP = 30;followers.clear();} };int n; const string actions[3] = {"summon","attack","end"}; Hero hero[2]; int now = 0;//0代表先手,1代表后手void _summon(){int pos,hp,attack;cin>>pos>>attack>>hp;Follower per(pos,attack,hp);sort(hero[now].followers.begin(),hero[now].followers.end());for(int i=pos-1;i<hero[now].followers.size();i++){hero[now].followers[i].position++;}hero[now].followers.push_back(per);sort(hero[now].followers.begin(),hero[now].followers.end()); }void _attack(){int attacker,defender;cin>>attacker>>defender;int attack_pos = attacker-1;int defender_pos = defender-1;int rival = !now;int attack_value = hero[now].followers[attack_pos].attack_power;int defend_value;if(defender!=0){defend_value = hero[rival].followers[defender_pos].attack_power;}else{defend_value=0;}// cout<<"attack:"<<attack_value<<endl;//攻擊方hero[now].followers[attack_pos].HP -= defend_value;if(hero[now].followers[attack_pos].HP <= 0 ){for(int i = attack_pos;i<hero[now].followers.size()-1;i++){hero[now].followers[i] = hero[now].followers[i+1];hero[now].followers[i].position--;}hero[now].followers.pop_back();}//承受攻擊方 if(defender == 0){//攻擊英雄 hero[rival].HP -= attack_value;}else{//攻擊隨從hero[rival].followers[defender_pos].HP -= attack_value;if(hero[rival].followers[defender_pos].HP <= 0 ){for(int i = defender_pos;i<hero[rival].followers.size()-1;i++){hero[rival].followers[i] = hero[rival].followers[i+1];hero[rival].followers[i].position--;}hero[rival].followers.pop_back();} }}void _end(){//轉(zhuǎn)換 now = !now; }void output(){//輸出結(jié)果int winner;if(hero[0].HP > 0 && hero[1].HP <= 0) winner = 1;else if (hero[0].HP <= 0 && hero[1].HP > 0 ) winner = -1;else winner = 0;cout<<winner<<endl;if(hero[0].HP)cout<<hero[0].HP<<endl;else cout<<0<<endl;cout<<hero[0].followers.size();for(int i=0;i<hero[0].followers.size();i++){cout<<" "<<hero[0].followers[i].HP;}cout<<endl;if(hero[1].HP)cout<<hero[1].HP<<endl;else cout<<0<<endl;cout<<hero[1].followers.size();for(int i=0;i<hero[1].followers.size();i++){cout<<" "<<hero[1].followers[i].HP;} }void init(){hero[0].HP = hero[1].HP = 30; }int main(){cin>>n;string arg;init();while(n--){cin>>arg;if(arg == actions[0]){_summon();}else if (arg == actions[1]){_attack();}else if (arg == actions[2]){_end();}}output(); }總結(jié)
以上是生活随笔為你收集整理的CSP 201609-3 炉石传说的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一页纸项目管理pdf_项目管理,一页纸就
- 下一篇: 决策理论的基本概念