csp模拟题-炉石传说
題目
試題編號: 201609-3
試題名稱: 爐石傳說
時間限制: 1.0s
內(nèi)存限制: 256.0MB
問題描述:
《爐石傳說:魔獸英雄傳》(Hearthstone: Heroes of Warcraft,簡稱爐石傳說)是暴雪娛樂開發(fā)的一款集換式卡牌游戲(如下圖所示)。游戲在一個戰(zhàn)斗棋盤上進行,由兩名玩家輪流進行操作,本題所使用的爐石傳說游戲的簡化規(guī)則如下:
* 玩家會控制一些角色,每個角色有自己的生命值和攻擊力。當生命值小于等于 0 時,該角色死亡。角色分為英雄和隨從。
* 玩家各控制一個英雄,游戲開始時,英雄的生命值為 30,攻擊力為 0。當英雄死亡時,游戲結(jié)束,英雄未死亡的一方獲勝。
* 玩家可在游戲過程中召喚隨從。棋盤上每方都有 7 個可用于放置隨從的空位,從左到右一字排開,被稱為戰(zhàn)場。當隨從死亡時,它將被從戰(zhàn)場上移除。
* 游戲開始后,兩位玩家輪流進行操作,每個玩家的連續(xù)一組操作稱為一個回合。
* 每個回合中,當前玩家可進行零個或者多個以下操作:
1) 召喚隨從:玩家召喚一個隨從進入戰(zhàn)場,隨從具有指定的生命值和攻擊力。
2) 隨從攻擊:玩家控制自己的某個隨從攻擊對手的英雄或者某個隨從。
3) 結(jié)束回合:玩家聲明自己的當前回合結(jié)束,游戲?qū)⑦M入對手的回合。該操作一定是一個回合的最后一個操作。
* 當隨從攻擊時,攻擊方和被攻擊方會同時對彼此造成等同于自己攻擊力的傷害。受到傷害的角色的生命值將會減少,數(shù)值等同于受到的傷害。例如,隨從 X 的生命值為 HX、攻擊力為 AX,隨從 Y 的生命值為 HY、攻擊力為 AY,如果隨從 X 攻擊隨從 Y,則攻擊發(fā)生后隨從 X 的生命值變?yōu)?HX - AY,隨從 Y 的生命值變?yōu)?HY - AX。攻擊發(fā)生后,角色的生命值可以為負數(shù)。
本題將給出一個游戲的過程,要求編寫程序模擬該游戲過程并輸出最后的局面。
輸入格式
輸入第一行是一個整數(shù) n,表示操作的個數(shù)。接下來 n 行,每行描述一個操作,格式如下:
< action > < arg1 > < arg2 > …
其中< action >表示操作類型,是一個字符串,共有 3 種:summon表示召喚隨從,attack表示隨從攻擊,end表示結(jié)束回合。這 3 種操作的具體格式如下:
* summon < position> < attack> < health>:當前玩家在位置召喚一個生命值為< health>、攻擊力為< attack>的隨從。其中是一個 1 到 7 的整數(shù),表示召喚的隨從出現(xiàn)在戰(zhàn)場上的位置,原來該位置及右邊的隨從都將順次向右移動一位。
* attack < attacker> < defender>:當前玩家的角色< attacker>攻擊對方的角色 < defender>。< attacker>是 1 到 7 的整數(shù),表示發(fā)起攻擊的本方隨從編號,< defender>是 0 到 7 的整數(shù),表示被攻擊的對方角色,0 表示攻擊對方英雄,1 到 7 表示攻擊對方隨從的編號。
* end:當前玩家結(jié)束本回合。
注意:隨從的編號會隨著游戲的進程發(fā)生變化,當召喚一個隨從時,玩家指定召喚該隨從放入戰(zhàn)場的位置,此時,原來該位置及右邊的所有隨從編號都會增加 1。而當一個隨從死亡時,它右邊的所有隨從編號都會減少 1。任意時刻,戰(zhàn)場上的隨從總是從1開始連續(xù)編號。
輸出格式
輸出共 5 行。
第 1 行包含一個整數(shù),表示這 n 次操作后(以下稱為 T 時刻)游戲的勝負結(jié)果,1 表示先手玩家獲勝,-1 表示后手玩家獲勝,0 表示游戲尚未結(jié)束,還沒有人獲勝。
第 2 行包含一個整數(shù),表示 T 時刻先手玩家的英雄的生命值。
第 3 行包含若干個整數(shù),第一個整數(shù) p 表示 T 時刻先手玩家在戰(zhàn)場上存活的隨從個數(shù),之后 p 個整數(shù),分別表示這些隨從在 T 時刻的生命值(按照從左往右的順序)。
第 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
樣例說明
按照樣例輸入從第 2 行開始逐行的解釋如下:
1. 先手玩家在位置 1 召喚一個生命值為 6、攻擊力為 3 的隨從 A,是本方戰(zhàn)場上唯一的隨從。
2. 先手玩家在位置 2 召喚一個生命值為 2、攻擊力為 4 的隨從 B,出現(xiàn)在隨從 A 的右邊。
3. 先手玩家回合結(jié)束。
4. 后手玩家在位置 1 召喚一個生命值為 5、攻擊力為 4 的隨從 C,是本方戰(zhàn)場上唯一的隨從。
5. 后手玩家在位置 1 召喚一個生命值為 1、攻擊力為 2 的隨從 D,出現(xiàn)在隨從 C 的左邊。
6. 隨從 D 攻擊隨從 B,雙方均死亡。
7. 后手玩家回合結(jié)束。
8. 隨從 A 攻擊隨從 C,雙方的生命值都降低至 2。
分析
1、一般做模擬題,從main函數(shù)入手,寫好該輸入什么東西,這時候,就會思考如何記錄每一個角色(生命值、攻擊力),只需要用sturct類型記錄就好啦:
struct Role {int H; //生命值int A; //攻擊力Role(){H=30,A=0};//默認的英雄生命值為30,攻擊力為0Role(int h, int a) {H=h;A=a};//給定的隨從的生命力和攻擊力 };2、如何記錄考慮好之后,有三種操作,我們可以一個一個寫對應的操作函數(shù):
1)召喚隨從:這個函數(shù)給位置,生命值、攻擊值、當前的玩家,就可以把這個隨從加入當前玩家
2、攻擊:給出當前玩家和當前玩家的攻擊者位置;對方玩家和對方玩家的抵御者位置;然后就只要雙方玩家的生命值減去對方玩家的攻擊值就行了,不過需要處理的是,如果有的玩家的隨從死去(需要delete掉這個隨從),還有,如果被攻擊的英雄死掉,游戲結(jié)束。
void Attack(int attacker,int defender,vector<Role> &playerAttack,vector<Role> &playerDefend) {//playerAttack[attacker].H -= playerDefend[defender].A;playerDefend[defender].H -= playerAttack[attacker].A;if (playerAttack[attacker].H <= 0)//攻擊方的隨從死掉了ClearDeath(attacker, playerAttack);if (playerDefend[defender].H <= 0) {//被攻擊方的隨從或英雄死掉了if (defender == 0)//如果死的是英雄,那么游戲就結(jié)束了return;ClearDeath(defender, playerDefend);} }3)回合結(jié)束end:這時候,只需要把當前玩家和對方玩家互換,用flag來記錄著兩個狀態(tài)。
內(nèi)心os,這個題和之前的目錄管理器的題,思路有異曲同工之妙,不過這個稍微簡單一點…
代碼
#include<bits/stdc++.h> using namespace std; struct Role {int H; //生命值int A; //攻擊力Role(){H=30,A=0};//默認的英雄生命值為30,攻擊力為0Role(int h, int a) {H=h;A=a};//給定的隨從的生命力和攻擊力 }; //將死亡的隨從從戰(zhàn)場上清理掉 void ClearDeath(int position, vector<Role> &player){auto i = player.begin();i += position;player.erase(i); } //playerAttack對playerDefend發(fā)起攻擊 void Attack(int attacker,int defender,vector<Role> &playerAttack,vector<Role> &playerDefend) {playerAttack[attacker].H -= playerDefend[defender].A;playerDefend[defender].H -= playerAttack[attacker].A;if (playerAttack[attacker].H <= 0)//攻擊方的隨從死掉了ClearDeath(attacker, playerAttack);if (playerDefend[defender].H <= 0) {//被攻擊方的隨從或英雄死掉了if (defender == 0)//如果死的是英雄,那么游戲就結(jié)束了return;ClearDeath(defender, playerDefend);} } //召喚隨從 void SummonRetinue(int position,int attack,int health,vector<Role> &player) {//給出位置,生命值,攻擊力以及當前玩家(A\B),召喚隨從(也就是玩家中加入隨從)Role retinue = { health,attack};auto i = player.begin();i += position;player.insert(i, retinue);//在這個位置加入一個隨從 } //輸出英雄的生命值和隨從的情況 void Output(vector<Role> &player) {cout << player[0].H << endl;int number = player.size() - 1;cout << number;for (int i = 0; i < number; i++)cout << " " << player[i + 1].H;cout << endl; } int main() {int n;string str;Role hero;int flag = 1;//標記當前回合是先手玩家還是后手玩家,1是先手玩家,0是后手玩家vector<Role> playerARole, playerBRole;//分別為先手玩家和后手玩家的角色,其中第0個元素為英雄,后面的元素為隨從playerARole.push_back(hero);playerBRole.push_back(hero);cin >> n;while (n--) {cin >> str;if (str == "summon") {int position, attack, health;cin >> position >> attack >> health;if(flag)//當前回合是先手玩家SummonRetinue(position, attack, health, playerARole);elseSummonRetinue(position, attack, health, playerBRole);}else if (str == "attack") {int attacker, defender;cin >> attacker >> defender;if (flag)//當前回合是先手玩家對后手玩家發(fā)起攻擊Attack(attacker, defender, playerARole,playerBRole);elseAttack(attacker, defender, playerBRole,playerARole);}else //切換玩家flag = !flag;}if (playerARole[0].H <= 0)cout << -1 << endl;else if (playerBRole[0].H <= 0)cout << 1 << endl;elsecout << 0 << endl;Output(playerARole);Output(playerBRole); }總結(jié)
以上是生活随笔為你收集整理的csp模拟题-炉石传说的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FDR计算
- 下一篇: 杨贵妃深受日本人喜爱 供奉为“热田大明神