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