CCF201609 爐石傳說(JAVA)
問 題 描述: |
問題描述 《爐石傳說:魔獸英雄傳》(Hearthstone: Heroes of Warcraft,簡稱爐石傳說)是暴雪娛樂開發的一款集換式卡牌遊戲(如下圖所示)。遊戲在一個戰鬥棋盤上進行,由兩名玩家輪流進行操作,本題所使用的爐石傳說遊戲的簡化規則如下: * 遊戲開始後,兩位玩家輪流進行操作,每個玩家的連續一組操作稱為一個回合。 * 每個回合中,當前玩家可進行零個或者多個以下操作: 1) 召喚隨從:玩家召喚一個隨從進入戰場,隨從具有指定的生命值和攻擊力。 2) 隨從攻擊:玩家控制自己的某個隨從攻擊對手的英雄或者某個隨從。 3) 結束回合:玩家宣告自己的當前回合結束,遊戲將進入對手的回合。該操作一定是一個回合的最後一個操作。 * 當隨從攻擊時,攻擊方和被攻擊方會同時對彼此造成等同於自己攻擊力的傷害。受到傷害的角色的生命值將會減少,數值等同於受到的傷害。例如,隨從 X 的生命值為 HX、攻擊力為 AX 本題將給出一個遊戲的過程,要求編寫程式模擬該遊戲過程並輸出最後的局面。 輸入格式 輸入第一行是一個整數 n,表示操作的個數。接下來 n 行,每行描述一個操作,格式如下: 輸出格式 輸出共 5 行。 樣例輸入 8 樣例輸出 0 樣例說明 按照樣例輸入從第 2 行開始逐行的解釋如下: 評測用例規模與約定 * 操作的個數0 ≤ n ≤ 1000。 |
package hearthStone;
import java.util.Scanner;
import java.util.Vector;
public class Main {
static Vector<Role> player1 = new Vector<>();// 先手玩家
static Vector<Role> player2 = new Vector<>();// 後手玩家
static Vector<Role> player;// 當前回合玩家
static Vector<Role> oppo;// 當前回合對手玩家
@SuppressWarnings("resource")
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();// 運算元
String operation;// 操作語句
Role hero1 = new Role(0, 30);// 建立先手玩家的英雄0攻30血
Role hero2 = new Role(0, 30);// 建立後手玩家的英雄
player1.add(hero1);// 0下標位置儲存該玩家英雄
player2.add(hero2);
sc.nextLine();
boolean flag = true;// 回合標記:先手玩家回合值為:true,後手玩家回合值為:false
for (int i = 0; i < n; i++) {
player = round(flag);// 判斷當前回合玩家
operation = sc.nextLine();// 獲取操作指令
String[] values = operation.split(" ");
switch (values[0]) {
case "summon":
int pos = Integer.valueOf(values[1]);// 獲取位置
int atk = Integer.valueOf(values[2]);// 獲取攻擊力
int health = Integer.valueOf(values[3]);// 獲取生命值
Role servant = new Role(atk, health);// 建立隨從,初始化攻擊力與生命值
player.add(pos, servant);// 將該隨從置入戰場
break;
case "attack":
int attacker = Integer.valueOf(values[1]);// 攻擊者序號
int defender = Integer.valueOf(values[2]);// 防禦者序號
oppo = round(!flag);
oppo.get(defender).setHealth(
oppo.get(defender).health - player.get(attacker).atk);
// 攻擊者對防禦者生命值造成攻擊力值的傷害
player.get(attacker).setHealth(
player.get(attacker).health - oppo.get(defender).atk);
// 攻擊者生命值受到防禦者攻擊力值的傷害
if (player.get(attacker).health <= 0)// 隨從生命值小於0則移除
player.remove(attacker);
if (defender != 0 && oppo.get(defender).health <= 0)
oppo.remove(defender);
break;
case "end":
flag = !flag;//切換玩家回合
break;
}
}
// 輸出
int winner = 0;
String str;
if (player1.get(0).health <= 0)// 判斷當前勝負
winner = -1;
if (player2.get(0).health <= 0)
winner = 1;
System.out.println(winner);
System.out.println(player1.get(0).health);
str = String.valueOf(player1.size() - 1);
for (int i = 1; i < player1.size(); i++) {
str += " " + player1.get(i).health;
}
System.out.println(str);
System.out.println(player2.get(0).health);
str = String.valueOf(player2.size() - 1);
for (int i = 1; i < player2.size(); i++) {
str += " " + player2.get(i).health;
}
System.out.println(str);
}
public static Vector<Role> round(boolean flag) {
if (flag)// 判斷當前屬於哪位玩家的回合
return player1;
else
return player2;
}
}
class Role// 角色
{
int atk;
int health;
public Role(int atk, int health) {
this.atk = atk;
this.health = health;
}
public int getAtk() {
return atk;
}
public void setAtk(int atk) {
this.atk = atk;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
}