模測(爐石傳說)

2021-10-07 02:54:57 字數 3735 閱讀 5166

題目:

《爐石傳說:魔獸英雄傳》(hearthstone: heroes of warcraft,簡稱爐石傳說)是暴雪娛樂開發的一款集換式卡牌遊戲。遊戲在乙個戰鬥棋盤上進行,由兩名玩家輪流進行操作,本題所使用的爐石傳說遊戲的簡化規則如下:

* 玩家會控制一些角色,每個角色有自己的生命值和攻擊力。當生命值小於等於 0 時,該角色死亡。角色分為英雄和隨從。

* 玩家各控制乙個英雄,遊戲開始時,英雄的生命值為 30,攻擊力為 0。當英雄死亡時,遊戲結束,英雄未死亡的一方獲勝。

* 玩家可在遊戲過程中召喚隨從。棋盤上每方都有 7 個可用於放置隨從的空位,從左到右一字排開,被稱為戰場。當隨從死亡時,它將被從戰場上移除。

* 遊戲開始後,兩位玩家輪流進行操作,每個玩家的連續一組操作稱為乙個回合。

* 每個回合中,當前玩家可進行零個或者多個以下操作:

1) 召喚隨從:玩家召喚乙個隨從進入戰場,隨從具有指定的生命值和攻擊力。

2) 隨從攻擊:玩家控制自己的某個隨從攻擊對手的英雄或者某個隨從。

3) 結束回合:玩家宣告自己的當前回合結束,遊戲將進入對手的回合。該操作一定是乙個回合的最後乙個操作。

* 當隨從攻擊時,攻擊方和被攻擊方會同時對彼此造成等同於自己攻擊力的傷害。受到傷害的角色的生命值將會減少,數值等同於受到的傷害。例如,隨從 x 的生命值為 hx、攻擊力為 ax,隨從 y 的生命值為 hy、攻擊力為 ay,如果隨從 x 攻擊隨從 y,則攻擊發生後隨從 x 的生命值變為 hx - ay,隨從 y 的生命值變為 hy - ax。攻擊發生後,角色的生命值可以為負數。

本題將給出乙個遊戲的過程,要求編寫程式模擬該遊戲過程並輸出最後的局面。

輸入:

輸入第一行是乙個整數 n,表示操作的個數。接下來 n 行,每行描述乙個操作,格式如下:

…其中表示操作型別,是乙個字串,共有 3 種:summon表示召喚隨從,attack表示隨從攻擊,end表示結束回合。這 3 種操作的具體格式如下:

* summon :當前玩家在位置召喚乙個生命值為、攻擊力為的隨從。其中是乙個 1 到 7 的整數,表示召喚的隨從出現在戰場上的位置,原來該位置及右邊的隨從都將順次向右移動一位。

* attack :當前玩家的角色攻擊對方的角色 。是 1 到 7 的整數,表示發起攻擊的本方隨從編號,是 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 行類似,只是將玩家從先手玩家換為後手玩家。

思想:

儲存使用自定義的鍊錶,類中有血量和攻擊兩個屬性,新增操作中引數position用來表明新加入的summon的位置,按順序遍歷到指定節點加入就好。對於attack操作,考慮到具體哪方為攻擊方、哪方為被攻擊方,使用引數panduan(在主函式中該變數名是biaozhi,每次讀到end表明一方操作結束後就更新biaozhi)來判斷,並且每次攻擊結束後呼叫delete_dead函式來刪除兩方死亡的隨從。因為是鍊錶結構,因此隨從位置的向左靠攏特性也就輕易解決。

**:

#include

#include

#include

using

namespace std;

class

node

;node xianshou;

node houshou;

node*

create

(int blood,

int kougeki)

//召喚新隨從

void

add(

int position,

int blood,

int kougeki,

int taisou)

//taisou:物件

node* change=

create

(blood,kougeki)

; change-

>next=p-

>next;

p->next=change;

}void

delete_dead()

p1=p1-

>next;}

p2=houshou.head;

while

(p2-

>next)

p2=p2-

>next;}}

void

attack

(int panduan,

int attacker,

int defender)

//panduan表明當前的攻擊者,主動者,被動者

else

if(panduan==1)

for(

int i=

0;i) p1=p1-

>next;

for(

int i=

0;i) p2=p2-

>next;

p1_result=p1-

>blood-p2-

>kougeki;

p2_result=p2-

>blood-p1-

>kougeki;

p1->blood=p1_result;

p2->blood=p2_result;

delete_dead()

;return;}

void

handan()

while

(p2)

if(xianshou.head-

>blood>

0&& houshou.head-

>blood>0)

else

if(xianshou.head-

>blood<=

0&& houshou.head-

>blood>0)

else

if(xianshou.head-

>blood>

0&& houshou.head-

>blood<=0)

cout<>blood

>next;p2=houshou.head-

>next;

cout

(p1)

coutblood

(p2)

cout<}int

main()

else

if(order==

"summon"

)else

if(order==

"attack")}

handan()

;}

CCF 爐石傳說

這題原本想的比較複雜,因為每次召喚隨從或隨從死亡時都要對右邊的隨從編號進行變動,然後構建了鍊錶的資料結構,但是越寫越複雜,所以馬上放棄這個思路。其實只要構建乙個結構體,結構體儲存隨從的health和attack,以及乙個flag表示隨從是否死亡。構建兩個size為8的陣列,用以儲存隨從即可。incl...

CCF爐石傳說

參考了 問題描述 爐石傳說 魔獸英雄傳 hearthstone heroes of warcraft,簡稱爐石傳說 是暴雪娛樂開發的一款集換式卡牌遊戲 如下圖所示 遊戲在乙個戰鬥棋盤上進行,由兩名玩家輪流進行操作,本題所使用的爐石傳說遊戲的簡化規則如下 玩家會控制一些角色,每個角色有自己的生命值和攻...

爐石傳說輔助

實現原理 修改遊戲檔案 注入機械人 使用 monocecil,修改 unity3d 生成的 assembly 檔案,在內部注入我們自己編寫的unity3d模組!實現細節 修改遊戲檔案 其實主要是 monocecil 的使用 通過檔名 類名 方法名,取出方法的定義 static methoddefin...