日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【CSP201609-3】炉石传说【模拟】

發布時間:2024/3/13 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【CSP201609-3】炉石传说【模拟】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:

規則:

  • 玩家會控制一些角色,每個角色有自己的生命值和攻擊力。當生命值小于等于 0 時,該角色死亡。角色分為英雄和隨從。
  • 玩家各控制一個英雄,游戲開始時,英雄的生命值為 30,攻擊力為 0。當英雄死亡時,游戲結束,英雄未死亡的一方獲勝。
  • 玩家可在游戲過程中召喚隨從。棋盤上每方都有 7 個可用于放置隨從的空位,從左到右一字排開,被稱為戰場。當隨從死亡時,它將被從戰場上移除。
  • 游戲開始后,兩位玩家輪流進行操作,每個玩家的連續一組操作稱為一個回合。
  • 每個回合中,當前玩家可進行零個或者多個以下操作:
  • 召喚隨從:玩家召喚一個隨從進入戰場,隨從具有指定的生命值和攻擊力。
  • 隨從攻擊:玩家控制自己的某個隨從攻擊對手的英雄或者某個隨從。
  • 結束回合:玩家聲明自己的當前回合結束,游戲將進入對手的回合。該操作一定是一個回合的最后一個操作。
    • 當隨從攻擊時,攻擊方和被攻擊方會同時對彼此造成等同于自己攻擊力的傷害。受到傷害的角色的生命值將會減少,數值等同于受到的傷害。例如,隨從 X 的生命值為 HX、攻擊力為 AX,隨從 Y 的生命值為 HY、攻擊力為 AY,如果隨從 X 攻擊隨從 Y,則攻擊發生后隨從 X 的生命值變為 HX - AY,隨從 Y 的生命值變為 HY - AX。攻擊發生后,角色的生命值可以為負數。
      本題將給出一個游戲的過程,要求編寫程序模擬該游戲過程并輸出最后的局面。

    輸入第一行是一個整數 n,表示操作的個數。接下來 n 行,每行描述一個操作,格式如下:< action > < arg1 > < arg2 > …
    其中< action >表示操作類型,是一個字符串,共有 3 種:summon表示召喚隨從,attack表示隨從攻擊,end表示結束回合。這 3 種操作的具體格式如下:

    • summon < position > < attack > < health >:當前玩家在位置< position >召喚一個生命值為< health >、攻擊力為< attack >的隨從。其中< position >是一個 1 到 7 的整數,表示召喚的隨從出現在戰場上的位置,原來該位置及右邊的隨從都將順次向右移動一位。
    • attack < attacker > < defender >:當前玩家的角色< attacker>攻擊對方的角色 < defender >。< attacker >是 1 到 7 的整數,表示發起攻擊的本方隨從編號,< defender >是 0 到 7 的整數,表示被攻擊的對方角色,0 表示攻擊對方英雄,1 到 7 表示攻擊對方隨從的編號。
    • end:當前玩家結束本回合。
      注意:隨從的編號會隨著游戲的進程發生變化,當召喚一個隨從時,玩家指定召喚該隨從放入戰場的位置,此時,原來該位置及右邊的所有隨從編號都會增加 1。而當一個隨從死亡時,它右邊的所有隨從編號都會減少 1。任意時刻,戰場上的隨從總是從1開始連續編號。

    輸出共 5 行。
    第 1 行包含一個整數,表示這 n 次操作后(以下稱為 T 時刻)游戲的勝負結果,1 表示先手玩家獲勝,-1 表示后手玩家獲勝,0 表示游戲尚未結束,還沒有人獲勝。
    第 2 行包含一個整數,表示 T 時刻先手玩家的英雄的生命值。
    第 3 行包含若干個整數,第一個整數 p 表示 T 時刻先手玩家在戰場上存活的隨從個數,之后 p 個整數,分別表示這些隨從在 T 時刻的生命值(按照從左往右的順序)。
    第 4 行和第 5 行與第 2 行和第 3 行類似,只是將玩家從先手玩家換為后手玩家。


    思路:

    結構體element用來表示英雄與隨從,它有int a,int h;攻擊力與血量。用vector v[2]來表示先手玩家和后手玩家的英雄與隨從。v[0].at(0)即先手玩家的英雄,1-7為場上隨從,后手玩家同理。
    召喚隨從summon:創建一個新隨從,然后加入到vector的相應位置即可。
    進行攻擊att:取出攻擊者和被攻擊者的攻擊力與血量,將兩者的血量進行消減,然后判斷血量是否大于0。血量大于0,只需要更改血量;血量<=0,要將隨從從vector中刪去;若英雄血量<=0,則更新英雄血量,然后記錄哪個玩家贏。
    回合結束end:只需要更改玩家為下一個玩家即可。這里用player=0,1來表示先手后手玩家,于是player=(player+1)%2就是到下一個玩家。


    總結:

    一道題目很長、稍稍復雜的模擬題,但是對于玩過爐石的人來說非常簡單易懂好寫。


    代碼:

    #include <iostream> #include <vector> #include <string> using namespace std;int win=0; //游戲是否結束 struct element //英雄與隨從 {int a;int h;element (int a1,int h1){a=a1,h=h1;} }; vector<element> v[2]; //先手玩家的隨從與后手玩家的隨從 //0號位為英雄,1-7為隨從 void summon(int player,int position,int attack,int health) //召喚隨從 {element sc(attack,health);v[player].insert(v[player].begin()+position,sc); } void att(int player1,int attacker,int defender) //進行攻擊 {int h1=v[player1][attacker].h,a1=v[player1][attacker].a;int player2=(player1+1)%2;int h2=v[player2][defender].h,a2=v[player2][defender].a;h1=h1-a2,h2=h2-a1;//攻擊隨從if(defender!=0){//判斷血量是否大于0if(h1>0)v[player1][attacker].h=h1;elsev[player1].erase(v[player1].begin()+attacker);if(h2>0)v[player2][defender].h=h2;elsev[player2].erase(v[player2].begin()+defender);}else //攻擊英雄{if(h1>0)v[player1][attacker].h=h1;elsev[player1].erase(v[player1].begin()+attacker);if(h2>0)v[player2][defender].h=h2;else //游戲結束{v[player2][defender].h=h2;if(player1==0) //先手贏win=1;elsewin=-1;}} } void end(int &player) {player=(player+1)%2; } int main() {int n;cin>>n;element hero(0,30);v[0].push_back(hero),v[1].push_back(hero);int player=0;while(n--) //先手player=0,后手player=1{string s;cin>>s;if(s=="summon") //召喚隨從{int position,attack,health;cin>>position>>attack>>health;summon(player,position,attack,health);}else if(s=="attack") //進行攻擊{int attacker,defender;cin>>attacker>>defender;att(player,attacker,defender);}else if(s=="end") //回合結束{end(player);}}//輸出cout<<win<<endl;cout<<v[0].at(0).h<<endl;int size1=v[0].size(); //隨從個數+1cout<<size1-1<<" ";for(int i=1; i<size1; i++)cout<<v[0].at(i).h<<" ";cout<<endl;cout<<v[1][0].h<<endl;int size2=v[1].size();cout<<size2-1<<" ";for(int i=1; i<size2; i++)cout<<v[1].at(i).h<<" ";cout<<endl; }

    總結

    以上是生活随笔為你收集整理的【CSP201609-3】炉石传说【模拟】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。