问题描述
  《炉石传说:魔兽英雄传》(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 行,每行描述一个操作,格式如下:
  <action> <arg1> <arg2> …
  其中表示操作类型,是一个字符串,共有 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 行类似,只是将玩家从先手玩家换为后手玩家。
样例输入
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
样例说明
  按照样例输入从第 2 行开始逐行的解释如下:
  1. 先手玩家在位置 1 召唤一个生命值为 6、攻击力为 3 的随从 A,是本方战场上唯一的随从。
  2. 先手玩家在位置 2 召唤一个生命值为 2、攻击力为 4 的随从 B,出现在随从 A 的右边。
  3. 先手玩家回合结束。
  4. 后手玩家在位置 1 召唤一个生命值为 5、攻击力为 4 的随从 C,是本方战场上唯一的随从。
  5. 后手玩家在位置 1 召唤一个生命值为 1、攻击力为 2 的随从 D,出现在随从 C 的左边。
  6. 随从 D 攻击随从 B,双方均死亡。
  7. 后手玩家回合结束。
  8. 随从 A 攻击随从 C,双方的生命值都降低至 2。
评测用例规模与约定
  * 操作的个数0 ≤ n ≤ 1000。
  * 随从的初始生命值为 1 到 100 的整数,攻击力为 0 到 100 的整数。
  * 保证所有操作均合法,包括但不限于:
  1) 召唤随从的位置一定是合法的,即如果当前本方战场上有 m 个随从,则召唤随从的位置一定在 1 到 m + 1 之间,其中 1 表示战场最左边的位置,m + 1 表示战场最右边的位置。
  2) 当本方战场有 7 个随从时,不会再召唤新的随从。
  3) 发起攻击和被攻击的角色一定存在,发起攻击的角色攻击力大于 0。
  4) 一方英雄如果死亡,就不再会有后续操作。
  * 数据约定:
  前 20% 的评测用例召唤随从的位置都是战场的最右边。
  前 40% 的评测用例没有 attack 操作。
  前 60% 的评测用例不会出现随从死亡的情况。

思路:这个题就是一个模拟题,只要大家有足够的内心,一定可以做出来。我先上一个70分代码大家看看吧:大家可以直接看最下面的100分代码

package csp201609;
import java.util.LinkedList;
import java.util.Scanner;
public class C {public static void main(String[] args) {// TODO Auto-generated method stubScanner sc = new Scanner(System.in);int n = sc.nextInt();sc.nextLine();LinkedList<Summon> list1 = new LinkedList<>();LinkedList<Summon> list2 = new LinkedList<>();LinkedList<Summon> currentPlayer = list1;LinkedList<Summon> opponent = list2;list1.add(new Summon(0, 30));list2.add(new Summon(0, 30));for (int i = 0; i < n; i++) {String tmp = sc.nextLine();String arr[] = tmp.split("\\ ");if (arr[0].equals("summon")) {currentPlayer.add(Integer.parseInt(arr[1]),new Summon(Integer.parseInt(arr[2]), Integer.parseInt(arr[3])));} else if (arr[0].equals("attack")) {int attackerNum = Integer.parseInt(arr[1]);int defenderNum = Integer.parseInt(arr[2]);Summon attSummon = currentPlayer.get(attackerNum);Summon deSummon = opponent.get(defenderNum);attSummon.health -= deSummon.attack;deSummon.health -= attSummon.attack;if (attSummon.health <= 0) {currentPlayer.remove(attackerNum);}if (deSummon.health <= 0) {opponent.remove(defenderNum);}} else if (arr[0].equals("end")) {if (currentPlayer.equals(list1)) {currentPlayer = list2;opponent = list1;} else {currentPlayer = list1;opponent = list2;}}}if (list2.getFirst().health <= 0) {System.out.println("1");} else if (list1.getFirst().health <= 0) {System.out.println("-1");} else {System.out.println("0");}System.out.println(list1.getFirst().health);System.out.print(list1.size() - 1 + " ");for (int i = 1; i < list1.size(); i++) {System.out.print(list1.get(i).health + " ");}System.out.println();System.out.println(list2.getFirst().health);System.out.print(list2.size() - 1 + " ");for (int i = 1; i < list2.size(); i++) {System.out.print(list2.get(i).health + " ");}}
}
class Summon {int attack;int health;public Summon(int attack, int health) {super();this.attack = attack;this.health = health;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn "attach:" + String.valueOf(attack) + " health:" + String.valueOf(health);}
}

为什么得了70分呢?只因为少写了一行代码:

 if (deSummon.health <= 0) {opponent.remove(defenderNum);}

切记:如果被攻击方是英雄,不能删掉这个英雄,不然最后在判断他剩余生命的时候,就会报错。
大家先仔细读懂题,这个题用LinkedList处理起来很方便。而且随从的编号虽然他说的

当召唤一个随从时,玩家指定召唤该随从放入战场的位置,此时,原来该位置及右边的所有随从编号都会增加 1。而当一个随从死亡时,它右边的所有随从编号都会减少 1

大家千万别被他影响。。他最后还写了一句 战场上的随从总是从1开始连续编号。 所以第i个位置就是编号为i的随从。
大家直接看100分代码吧:

package csp201609;
import java.util.LinkedList;
import java.util.Scanner;
public class C {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();sc.nextLine();LinkedList<Summon> list1 = new LinkedList<>();//先手玩家的英雄和随从,位置0为英雄,位置1--7为随从LinkedList<Summon> list2 = new LinkedList<>();//后手玩家的英雄和随从,位置0为英雄,位置1--7为随从LinkedList<Summon> currentPlayer = list1;//当前玩家LinkedList<Summon> opponent = list2;//对手玩家list1.add(new Summon(0, 30));//先初始化英雄,攻击力为0,生命值为30list2.add(new Summon(0, 30));for (int i = 0; i < n; i++) {String tmp = sc.nextLine();String arr[] = tmp.split("\\ ");if (arr[0].equals("summon")) {//在arr[1]的位置插入一个随从currentPlayer.add(Integer.parseInt(arr[1]),new Summon(Integer.parseInt(arr[2]), Integer.parseInt(arr[3])));} else if (arr[0].equals("attack")) {int attackerNum = Integer.parseInt(arr[1]);//攻击方当的随从编号int defenderNum = Integer.parseInt(arr[2]);//被攻击放的随从编号Summon attSummon = currentPlayer.get(attackerNum);//攻击方的随从Summon deSummon = opponent.get(defenderNum);//被攻击方的随从attSummon.health -= deSummon.attack;//生命值更新deSummon.health -= attSummon.attack;//生命值更新if (attSummon.health <= 0 ) {currentPlayer.remove(attackerNum);}if (deSummon.health <= 0 && defenderNum!=0) {//如果被攻击方的生命值小于0,且被攻击放不是英雄,则删掉opponent.remove(defenderNum);}} else if (arr[0].equals("end")) {if (currentPlayer.equals(list1)) {currentPlayer = list2;opponent = list1;} else {currentPlayer = list1;opponent = list2;}}}if (list2.getFirst().health <= 0) {System.out.println("1");} else if (list1.getFirst().health <= 0) {System.out.println("-1");} else {System.out.println("0");}System.out.println(list1.getFirst().health);System.out.print(list1.size() - 1 + " ");for (int i = 1; i < list1.size(); i++) {System.out.print(list1.get(i).health + " ");}System.out.println();System.out.println(list2.getFirst().health);System.out.print(list2.size() - 1 + " ");for (int i = 1; i < list2.size(); i++) {System.out.print(list2.get(i).health + " ");}}
}
class Summon {int attack;int health;public Summon(int attack, int health) {super();this.attack = attack;this.health = health;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn "attach:" + String.valueOf(attack) + " health:" + String.valueOf(health);}
}

欢迎指正,不喜勿喷!!!

CSP201609-3(炉石传说)(Java 100分)(只有78行代码)相关推荐

  1. CCF201609-3 炉石传说(100分)

    试题编号: 201609-3 试题名称: 炉石传说 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 <炉石传说:魔兽英雄传>(Hearthstone: Heroes ...

  2. CCF201609-3 炉石传说 (100分)

    试题编号: 201609-3 试题名称: 炉石传说 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 <炉石传说:魔兽英雄传>(Hearthstone: Heroes ...

  3. 炉石传说 java实现

    试题编号: 201609-3 试题名称: 炉石传说 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 <炉石传说:魔兽英雄传>(Hearthstone: Heroes ...

  4. CCF 201612-3 炉石传说 JAVA实现

    炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthstone: Heroes of Warcraft,简称炉石传说)是暴雪娱乐开发的一款集换式卡牌游戏(如下图所示).游戏在一个战斗 ...

  5. 炉石传说 java_炉石传说 java实现

    试题编号: 201609-3 试题名称:炉石传说 时间限制:1.0s 内存限制:256.0MB 问题描述: 问题描述 <炉石传说:魔兽英雄传>(Hearthstone: Heroes of ...

  6. 炉石java版_炉石传说 java实现

    试题编号: 201609-3 试题名称:炉石传说 时间限制:1.0s 内存限制:256.0MB 问题描述: 问题描述 <炉石传说:魔兽英雄传>(Hearthstone: Heroes of ...

  7. 炉石传说JAVA脚本怎么写_安卓按键精灵源码分享,安卓炉石传说脚本

    本帖最后由 ugly 于 2019-4-9 18:34 编辑 为了避免争吵,本帖不适应无编程基础的人或很酸的人,请alt+F4谢谢. 之前本人发布的炉石传说安卓自动刷金币使用经常出问题,原因在于本人特 ...

  8. 7-3 接话茬 (100分)(简洁易懂的代码含思路分析)

    7-3 接话茬 (100分) 小CC最喜欢的就是接话茬,别人说一句,小CC就会接着他的话尾巴继续说下去,然后告诉他这是"顶针"修辞手法,活活将人气死.小XX也喜欢接话茬,每天都要与 ...

  9. java selenium_java+selenium,40行代码完成支付宝账单爬取

    java+selenium,40行代码完成支付宝账单爬取 需要jar selenium-server-4.0.0-alpha-5.jar 需要驱动 chromedriver.exe 驱动需要和浏览器版 ...

最新文章

  1. PubChem分子库
  2. matlab做交互作用图,MatlabMatlab工程应用案例精要.ppt
  3. SSE命令示例代码(转换、加载、置位、存储)
  4. 40岁了,还要跟小年青一样埋头敲代码吗?
  5. 2018-06-22 第四十七天 oracle
  6. Pycharm(社区版) 创建Flask项目
  7. 汇编语言实现led灯的跑马灯
  8. 虚拟化--051 vsphere linux搭建NTP服务器搭建
  9. PS基础冷门小技巧,巧用“标尺工具”…
  10. SPC是什么,有什么用
  11. 人脑能用计算机算法吗,电脑到人脑,计算机必不可少的4大思维
  12. 【软件工程】软件工程系统开发——系统设计概述
  13. GitHub 优秀的 Android 开源项目——转自多篇网络文章
  14. Vim、Shell及Linux命令的高效使用
  15. Compose主题切换——让你的APP也能一键换肤
  16. 强国杯半决赛东部赛区部分wp
  17. 2022年河南省房地产经纪人(房地产交易制度政策)练习题及答案
  18. 用Python实现BT种子转化为磁力链接
  19. Oracle 给某列前后添加后缀或者前缀
  20. ubuntu 终端中连接有线网络的命令

热门文章

  1. 爬虫系列之爬取1688
  2. Graphics2D的使用详情
  3. 虚拟机镜像的创建方法
  4. GBase 8c的运行环境
  5. [HAOI2008] 排名系统
  6. 遇见未来 | 对话朱贤文:PostgreSQL是一匹即将发力的黑马
  7. Tensorflow移动端之如何将自己训练的MNIST模型加载到Android手机上
  8. python+opencv代码给证件照换底色(别再用PS啦)(转载)
  9. Ubuntu 18.04及Snap体验——让Linux入门更简单(转))
  10. 苏州园林年卡 办理与使用 附 苏州园林门票价格