C++課大作業 魔獸世界Part 2

URNOTJANET發表於2017-12-13

【題目描述】 【由於太長感覺變成程式碼格式會好看一點】【?】

#魔獸世界終極版

【跟part1描述一致】 【魔獸世界的西面是紅魔軍的司令部,東面是藍魔軍的司令部。兩個司令部之間是依次排列的若干城市,城市從西向東依次編號為1,2,3 .... N ( N <= 20 )。紅魔軍的司令部算作編號為0的城市,藍魔軍的司令部算作編號為N+1的城市。 司令部有生命元,用於製造武士。兩軍的司令部都會製造武士。武士一共有dragon 、ninja、iceman、lion、wolf 五種。每種武士都有編號、生命值、攻擊力這三種屬性。雙方的武士編號都是從1開始計算。紅方製造出來的第n 個武士,編號就是n。同樣,藍方製造出來的第n 個武士,編號也是n。武士在剛降生的時候有一個初始的生命值,生命值在戰鬥中會發生變化,如果生命值減少到0(生命值變為負數時應當做變為0處理),則武士死亡(消失)。 有的武士可以擁有武器。武器有三種,sword, bomb,和arrow,編號分別為0, 1, 2。】

武士降生後就朝對方司令部走,在經過的城市如果遇到敵人(同一時刻每個城市最多隻可能有1個藍武士和1個紅武士),就會發生戰鬥。每次戰鬥只有一方發起主動進攻一次。被攻擊者生命值會減去進攻者的攻擊力值和進攻者手中sword的攻擊力值。被攻擊者若沒死,就會發起反擊,被反擊者的生命值要減去反擊者攻擊力值的一半(去尾取整)和反擊者手中sword的攻擊力值。反擊可能致敵人於死地。

如果武士在戰鬥中殺死敵人(不論是主動進攻殺死還是反擊殺死),則其司令部會立即向其傳送8個生命元作為獎勵,使其生命值增加8。當然前提是司令部有8個生命元。如果司令部的生命元不足以獎勵所有的武士,則優先獎勵距離敵方司令部近的武士。

如果某武士在某城市的戰鬥中殺死了敵人,則該武士的司令部立即取得該城市中所有的生命元。注意,司令部總是先完成全部獎勵工作,然後才開始從各個打了勝仗的城市回收生命元。對於因司令部生命元不足而領不到獎勵的武士,司令部也不會在取得戰利品生命元后為其補發獎勵。如果一次戰鬥的結果是雙方都倖存(平局),則雙方都不能拿走發生戰鬥的城市的生命元。

城市可以插旗子,一開始所有城市都沒有旗子。在插紅旗的城市,以及編號為奇數的無旗城市,由紅武士主動發起進攻。在插藍旗的城市,以及編號為偶數的無旗城市,由藍武士主動發起進攻。當某個城市有連續兩場戰鬥都是同一方的武士殺死敵人(兩場戰鬥之間如果有若干個戰鬥時刻並沒有發生戰鬥,則這兩場戰鬥仍然算是連續的;但如果中間有平局的戰鬥,就不算連續了),那麼該城市就會插上勝方的旗幟。一個城市最多隻能插一面旗幟,旗幟沒被敵人更換前,也不會再次插同顏色的旗。

#各種武器有其特點:

sword武器的初始攻擊力為擁有它的武士的攻擊力的20%(去尾取整)。但是sword每經過一次戰鬥(不論是主動攻擊還是反擊)就會變鈍,攻擊力變為本次戰鬥前的80% (去尾取整)。sword攻擊力變為0時,視為武士失去了sword。如果武士降生時得到了一個初始攻擊力為0的sword,則視為武士沒有sword。

arrow有一個攻擊力值R。如果下一步要走到的城市有敵人,那麼擁有arrow的武士就會放箭攻擊下一個城市的敵人(不能攻擊對方司令部裡的敵人)而不被還擊。arrow使敵人的生命值減少R,若減至小於等於0,則敵人被殺死。arrow使用3次後即被耗盡,武士失去arrow。兩個相鄰的武士可能同時放箭把對方射死。

擁有bomb的武士,在戰鬥開始前如果判斷自己將被殺死(不論主動攻擊敵人,或者被敵人主動攻擊都可能導致自己被殺死,而且假設武士可以知道敵人的攻擊力和生命值),那麼就會使用bomb和敵人同歸於盡。武士不預測對方是否會使用bomb。武士使用bomb和敵人同歸於盡的情況下,不算是一場戰鬥,雙方都不能拿走城市的生命元,也不影響城市的旗幟。

#不同的武士有不同的特點:

dragon可以擁有一件武器。編號為n的dragon降生時即獲得編號為n%3 的武器。dragon還有“士氣”這個屬性,是個浮點數,其值為它降生後其司令部剩餘生命元的數量除以造dragon所需的生命元數量。dragon在一次它主動進攻的戰鬥結束後,如果還沒有戰死,而且士氣值大於0.8,就會歡呼。dragon每取得一次戰鬥的勝利(敵人被殺死),士氣值就會增加0.2,每經歷一次未能獲勝的戰鬥,士氣值就會減少0.2。士氣值增減發生在歡呼之前。

ninja可以擁有兩件武器。編號為n的ninja降生時即獲得編號為n%3 和(n+1)%3的武器。ninja 捱打了也從不反擊敵人。

iceman有一件武器。編號為n的iceman降生時即獲得編號為n%3 的武器。iceman 每前進兩步,在第2步完成的時候,生命值會減少9,攻擊力會增加20。但是若生命值減9後會小於等於0,則生命值不減9,而是變為1。即iceman不會因走多了而死。

lion 有“忠誠度”這個屬性,其初始值等於它降生之後其司令部剩餘生命元的數目。每經過一場未能殺死敵人的戰鬥,忠誠度就降低K。忠誠度降至0或0以下,則該lion逃離戰場,永遠消失。但是已經到達敵人司令部的lion不會逃跑。Lion在己方司令部可能逃跑。lion 若是戰死,則其戰鬥前的生命值就會轉移到對手身上。所謂“戰鬥前”,就是每個小時的40分前的一瞬間。

wolf降生時沒有武器,但是在戰鬥中如果獲勝(殺死敵人),就會繳獲敵人的武器,但自己已有的武器就不繳獲了。被繳獲的武器當然不能算新的,已經被用到什麼樣了,就是什麼樣的。

#以下是不同時間會發生的不同事件:

在每個小時的第0分,雙方的司令部中各有一個武士降生。紅方司令部按照iceman、lion、wolf、ninja、dragon 的順序製造武士。藍方司令部按照lion、dragon、ninja、iceman、wolf 的順序製造武士。製造武士需要生命元。製造一個初始生命值為m的武士,司令部中的生命元就要減少m 個。如果司令部中的生命元不足以製造某武士,那麼司令部就等待,直到獲得足夠生命元后的第一個整點,才製造該武士。例如,在2:00,紅方司令部本該製造一個wolf,如果此時生命元不足,那麼就會等待,直到生命元足夠後的下一個整點,才製造一個wolf。

在每個小時的第5分,該逃跑的lion就在這一時刻逃跑了。

在每個小時的第10分,所有的武士朝敵人司令部方向前進一步。即從己方司令部走到相鄰城市,或從一個城市走到下一個城市,或從和敵軍司令部相鄰的城市到達敵軍司令部。

在每個小時的第20分,每個城市產出10個生命元。生命元留在城市,直到被武士取走。

在每個小時的第30分,如果某個城市中只有一個武士,那麼該武士取走該城市中的所有生命元,並立即將這些生命元傳送到其所屬的司令部。

在每個小時的第35分,擁有arrow的武士放箭,對敵人造成傷害。放箭事件應算髮生在箭發出的城市。注意,放箭不算是戰鬥,因此放箭的武士不會得到任何好處。武士在沒有敵人的城市被箭射死也不影響其所在城市的旗幟更換情況。

在每個小時的第38分,擁有bomb的武士評估是否應該使用bomb。如果是,就用bomb和敵人同歸於盡。

在每個小時的第40分,在有兩個武士的城市,會發生戰鬥。 如果敵人在5分鐘前已經被飛來的arrow射死,那麼仍然視為發生了一場戰鬥,而且存活者視為獲得了戰鬥的勝利。此情況下不會有“武士主動攻擊”,“武士反擊”,“武士戰死”的事件發生,但戰鬥勝利後應該發生的事情都會發生。如wolf一樣能繳獲武器,旗幟也可能更換等等。在此情況下,dragon同樣會通過判斷是否應該輪到自己主動攻擊來決定是否歡呼。

在每個小時的第50分,司令部報告它擁有的生命元數量。

在每個小時的第55分,每個武士報告其擁有的武器情況。

武士到達對方司令部後就算完成任務了,從此就呆在那裡無所事事。任何一方的司令部裡若是出現了2個敵人,則認為該司令部已被敵人佔領。任何一方的司令部被敵人佔領,則戰爭結束。戰爭結束之後就不會發生任何事情了。

給定一個時間,要求你將從0點0分開始到此時間為止的所有事件按順序輸出。事件及其對應的輸出樣例如下:

1)武士降生

輸出樣例:000:00 blue lion 1 born
表示在0點0分,編號為1的藍魔lion武士降生。
如果造出的是dragon,那麼還要多輸出一行,例:
000:00 blue dragon 1 born
Its morale is 23.34
表示該dragon降生時士氣是23. 34(四捨五入到小數點後兩位)。

如果造出的是lion,那麼還要多輸出一行,例:
000:00 blue lion 1 born
Its loyalty is 24
表示該lion降生時的忠誠度是24。

2)lion逃跑
輸出樣例:000:05 blue lion 1 ran away

表示在0點5分,編號為1的藍魔lion武士逃走。

3)武士前進到某一城市
輸出樣例:000:10 red iceman 1 marched to city 1 with 20 elements and force 30

表示在0點10分,紅魔1號武士iceman前進到1號城市,此時他生命值為20,攻擊力為30。對於iceman,輸出的生命值和攻擊力應該是變化後的數值。

4)武士放箭
輸出樣例:000:35 blue dragon 1 shot

表示在0點35分,編號為1的藍魔dragon武士射出一支箭。如果射出的箭殺死了敵人,則應如下輸出:000:35 blue dragon 1 shot and killed red lion 4

表示在0點35分,編號為1的藍魔dragon武士射出一支箭,殺死了編號為4的紅魔lion。

5)武士使用bomb
輸出樣例:000:38 blue dragon 1 used a bomb and killed red lion 7

表示在0點38分,編號為1的藍魔dragon武士用炸彈和編號為7的紅魔lion同歸於盡。

6)武士主動進攻
輸出樣例:000:40 red iceman 1 attacked blue lion 1 in city 1 with 20 elements and
force 30

表示在0點40分,1號城市中,紅魔1號武士iceman 進攻藍魔1號武士lion,在發起進攻前,紅魔1號武士iceman生命值為20,攻擊力為30。

7)武士反擊
輸出樣例:001:40 blue dragon 2 fought back against red lion 2 in city 1

表示在1點40分,1號城市中,藍魔2號武士dragon反擊紅魔2號武士lion。

8)武士戰死
輸出樣例:001:40 red lion 2 was killed in city 1

被箭射死的武士就不會有這一條輸出。

9)武士歡呼
輸出樣例:003:40 blue dragon 2 yelled in city 4

10)武士獲取生命元( elements )
輸出樣例:001:40 blue dragon 2 earned 10 elements for his headquarter

11)旗幟升起
輸出樣例:004:40 blue flag raised in city 4

12)武士抵達敵軍司令部
輸出樣例:001:10 red iceman 1 reached blue headquarter with 20 elements and
force 30

(此時他生命值為20,攻擊力為30)對於iceman,輸出的生命值和攻擊力應該是變化後的數值。

13)司令部被佔領
輸出樣例:003:10 blue headquarter was taken

14)司令部報告生命元數量
000:50 100 elements in red headquarter
000:50 120 elements in blue headquarter

表示在0點50分,紅方司令部有100個生命元,藍方有120個。

15)武士報告武器情況

000:55 blue wolf 2 has
arrow(2),bomb,sword(23)
000:55 blue wolf 4 has no weapon
000:55 blue wolf 5 has sword(20)

表示在0點55分,藍魔2號武士wolf有一支arrow(這支arrow還可以用2次),一個bomb,還有一支攻擊力為23的sword。藍魔4號武士wolf沒武器。藍魔5號武士wolf有一支攻擊力為20的sword。

交代武器情況時,次序依次是:arrow,bomb,sword。如果沒有某種武器,某種武器就不用提。報告時,先按從西向東的順序所有的紅武士報告,然後再從西向東所有的藍武士報告。

輸出事件時,首先按時間順序輸出;同一時間發生的事件,按發生地點從西向東依次輸出. 武士前進的事件, 算是發生在目的地。在一次戰鬥中有可能發生上面的6 至11 號事件。這些事件都算同時發生,其時間就是戰鬥開始時間。一次戰鬥中的這些事件,序號小的應該先輸出。兩個武士同時抵達同一城市,則先輸出紅武士的前進事件,後輸出藍武士的。顯然,13號事件發生之前的一瞬間一定發生了12號事件。輸出時,這兩件事算同一時間發生,但是應先輸出12號事件。雖然任何一方的司令部被佔領之後,就不會有任何事情發生了。但和司令部被佔領同時發生的事件,全都要輸出。
複製程式碼

#輸入

第一行是t,代表測試資料組數。
每組樣例共三行:

第一行,五個整數M,N,R,K,T。其含義為:每個司令部一開始都有M個生命元(1 <= M <= 10000);兩個司令部之間一共有N個城市(1 <= N <= 20);arrow的攻擊力是R;lion每經過一場未能殺死敵人的戰鬥,忠誠度就降低K;要求輸出從0時0分開始,到時間T為止(包括T)的所有事件。T以分鐘為單位,0 <= T <= 5000。

第二行:五個整數,依次是dragon 、ninja、iceman、lion、wolf 的初始生命值。它們都大於0小於等於10000。

第三行:五個整數,依次是dragon 、ninja、iceman、lion、wolf 的攻擊力。它們都大於0小於等於10000。
複製程式碼

#輸出

對每組資料,先輸出一行:
Case n:
如對第一組資料就輸出Case1:
然後按恰當的順序和格式輸出到時間T為止發生的所有事件。每個事件都以事件發生的時間開頭,時間格式是“時: 分”,“時”有三位,“分”有兩位。

樣例輸入
1
20 1 10 10 1000
20 20 30 10 20
5 5 5 5 5

樣例輸出
Case 1:
000:00 blue lion 1 born
Its loyalty is 10
000:10 blue lion 1 marched to city 1 with
10 elements and force 5
000:30 blue lion 1 earned 10 elements for
his headquarter
000:50 20 elements in red headquarter
000:50 20 elements in blue headquarter
000:55 blue lion 1 has no weapon
001:00 blue dragon 2 born
Its morale is 0.00001:10 blue lion 1
reached red headquarter with 10 elements and force 5
001:10 blue dragon 2 marched to city 1 with
20 elements and force 5
001:30 blue dragon 2 earned 10 elements for
his headquarter
001:50 20 elements in red headquarter
001:50 10 elements in blue headquarter
001:55 blue lion 1 has no weapon
001:55 blue dragon 2 has arrow(3)
002:10 blue dragon 2 reached red
headquarter with 20 elements and force 5
002:10 red headquarter was taken

複製程式碼

由於近期事情太多,在網上找了一個程式碼交了了事了.... 具體連結是http://blog.csdn.net/ckcz123/article/details/8734954 感謝這位博主,他讓我知道了delete的正確開啟方式...... 等我12.4考完之後回顧一下,然後對這道題的思路做一個分析。

相關文章