CCF模拟试题炉石传说100分代码
以及60分可能的一个原因
//炉石传说
//1Hero:30health,0attack
//7followers,
//3operation;summon();attack();end();
//health can be less than 0;
import java.util.Scanner;
public class Main {
public static void main(String[]args) {
int n,pA[][]=new int[8][2],pB[][]=new int[8][2];
//pA[0][0]为health,pA[0][1]为随从数
//pA[i][0]和pA[i][1]分别为编号i的随从的攻击和生命
int state=0; //游戏状1/0/-1依次为A获胜/未结束/B获胜
// int fA=0,fB=0; //玩家在场上的随从个数
pA[0][0]=30;pB[0][0]=30;//英雄生命初始化30
Scanner in=new Scanner(System.in);
String action[]= {"summon","attack","end"};
String input;
n=in.nextInt();
while(n>0) {
int i=0;
input=in.next();
n--;
while(!input.equals(action[2])) { //先手玩家A的回合
if(input.equals(action[0])) {
i=in.nextInt();
if(i>pA[0][1])
i=pA[0][1]+1; //if position>fA position=fA+1
else {
for(int j=pA[0][1]+1;j>i;j--) {
pA[j][0]=pA[j-1][0];
pA[j][1]=pA[j-1][1];
}
}
pA[i][0]=in.nextInt();
pA[i][1]=in.nextInt();
pA[0][1]++;
}
else if(input.equals(action[1])) {
int a=in.nextInt();
int b=in.nextInt();
if(b==0) {
pB[0][0]-=pA[a][0];
if(pB[0][0]<=0)
state=1;
}
else {
pB[b][1]-=pA[a][0];
pA[a][1]-=pB[b][0];
}
if(pA[a][1]<=0) {
for(int p=a;p<7;p++) {
pA[p][0]=pA[p+1][0];//死一个随从
pA[p][1]=pA[p+1][1];//左移
}
pA[7][0]=0;
pA[7][1]=0;
pA[0][1]--;
}
if(pB[b][1]<=0&&b!=0) {
for(int p=b;p<7;p++) {
pB[p][0]=pB[p+1][0];//死一个随从
pB[p][1]=pB[p+1][1];//左移
}
pB[7][0]=0;
pB[7][1]=0;
pB[0][1]--;
}
}
else if(input.equals(action[2]))
break;
if(state!=0)
break;
if(n==0)
break;
input=in.next();
n--;
}
if(state!=0)
break;
if(n==0)
break;
input=in.next();
n--;
while(!input.equals(action[2])) { //玩家B的回合
if(input.equals(action[0])){
i=in.nextInt();
if(i>pB[0][1])
i=pB[0][1]+1; //if position>fB position=fB+1
else {
for(int j=pB[0][1]+1;j>i;j--) {
pB[j][0]=pB[j-1][0];//插入
pB[j][1]=pB[j-1][1];//右移
}
}
pB[i][0]=in.nextInt();
pB[i][1]=in.nextInt();
pB[0][1]++;
}
else if(input.equals(action[1])) {
int b=in.nextInt();
int a=in.nextInt();
if(a==0) {
pA[0][0]-=pB[b][0];
if(pA[0][0]<=0)
state=-1;
}
else {
pA[a][1]-=pB[b][0];
pB[b][1]-=pA[a][0];
}
if(pA[a][1]<=0&&a!=0) {
for(int p=a;p<7;p++) {
pA[p][0]=pA[p+1][0];//死一个随从
pA[p][1]=pA[p+1][1];//左移
}
pA[7][0]=0;
pA[7][1]=0;
pA[0][1]--;
}
if(pB[b][1]<=0) {
for(int p=b;p<7;p++) {
pB[p][0]=pB[p+1][0];//死一个随从
pB[p][1]=pB[p+1][1];//左移
}
pB[7][0]=0;
pB[7][1]=0;
pB[0][1]--;
}
}
else if(input.equals(action[2]))
break;
if(state!=0)
break;
if(n==0)
break;
input=in.next();
n--;
}
if(state!=0)
break;
}
System.out.println(state);
System.out.println(pA[0][0]);
int live=pA[0][1];
System.out.print(live+" ");
for(int i=1;i<=live;i++) {
System.out.print(pA[i][1]+" ");
}
System.out.println();
System.out.println(pB[0][0]);
live=pB[0][1];
System.out.print(live+" ");
for(int i=1;i<=live;i++) {
System.out.print(pB[i][1]+" ");
}
System.out.println();
in.close();
}
}
上面是一个100分代码,作为一个初学者调试了很多次,遇到过10分,50分,60分的情况
基本上50分是接近成功了,一般可能是我们没有考虑到一些输入或者输出的可能。比如我开始的时候看到题目给的测试范例英雄都是满血的结果没有考虑英雄被攻击也就是输入attack 的时候defender我没有考虑它是0的情况,一开始我看的不仔细,后来回头仔细看题目发现defender=0就是代表英雄被攻击。好像就是没有考虑这个情况所以一直卡在10分的情况。
60分的时候最后发现是因为我输出的时候因为输出后手玩家数据的代码是直接copy输出先手玩家数据的代码的,然后漏改了一个字母,就是没有把输出框里面的playerA改成playerB,就一个字母就找了我很久。
以后我们就知道如果得了50分意思首先可以认真检查输出代码是否有问题。
另外,我看了其他人的一些代码,发现不写类和方法像我这样直接全挤在main函数确实很糟糕可读性差,新手不要学我,我这是反面教材。正确的做法是把操作都放在专门的类及其方法里面,这样我们的main函数只需要几行代码的创建对象和用对象直接调用方法就可以了,可读性是大大增强的。
感谢各位愿意看一个菜鸡的经验分享。
因为作业要求,虽然很懒还是又写了一个用类写的代码
好笑的是我又又犯了同一个错误,又一个60分作文(0_0)
我在print()里面还是copy 玩家A的输出格式给玩家B的输出,然后又找了好一会才发现漏改一个数组下标的 0->1,尴尬呀
下面是代码Hearth Stonee:
import java.util.Scanner;
class HearthStone{
private int player[][][]=new int [2][8][2];
private int turn; //turn==0/1分别表示当前回合是先手玩家A的回合/后手玩家B的回合
private int state; //state==1/0/-1依次表示A获胜/未结束/B获胜
public HearthStone() {
player[0][0][0]=30;//3维依次为玩家编号(0-1),角色和英雄编号(0-7),攻击和生命
player[1][0][0]=30;//player[0][0][0]和player[0][0][1]分别表示英雄生命和存活角色数量
turn=0;
state=0;
}
void summon(int p,int a,int h) { //p-position a-attack h-health
if(turn==0) {
if(p>player[0][0][1]) { //因为题目保证p为1~m+1,m为角色存活数
}
else {
for(int j=player[0][0][1]+1;j>p;j--) {
player[0][j][0]=player[0][j-1][0];
player[0][j][1]=player[0][j-1][1];
}
}
player[0][p][0]=a;
player[0][p][1]=h;
player[0][0][1]++;
}
else {
if(p>player[1][0][1]) { //因为题目保证p为1~m+1,m为角色存活数
}
else {
for(int j=player[1][0][1]+1;j>p;j--) {
player[1][j][0]=player[1][j-1][0]; //插入,右移
player[1][j][1]=player[1][j-1][1];
}
}
player[1][p][0]=a;
player[1][p][1]=h;
player[1][0][1]++;
}
}
int attack(int a,int d) { //a-attacker d-defender
if(turn==0) {
if(d==0) {
player[1][0][0]-=player[0][a][0]; //A角色编号a攻击敌方英雄
if(player[1][0][0]<=0)
state=1; //A win
}
else {
player[1][d][1]-=player[0][a][0];
player[0][a][1]-=player[1][d][0];
if(player[0][a][1]<=0) {
for(int p=a;p<7;p++) {
player[0][p][0]=player[0][p+1][0];//A死一个随从
player[0][p][1]=player[0][p+1][1];//左移
}
player[0][7][0]=0;
player[0][7][1]=0;
player[0][0][1]--;
}
if(player[1][d][1]<=0) {
for(int p=d;p<7;p++) {
player[1][p][0]=player[1][p+1][0];//B死一个随从
player[1][p][1]=player[1][p+1][1];//左移
}
player[1][7][0]=0;
player[1][7][1]=0;
player[1][0][1]--;
}
}
}
else {
if(d==0) {
player[0][0][0]-=player[1][a][0]; //B角色编号a攻击敌方英雄
if(player[0][0][0]<=0)
state=-1; //B win
}
else {
player[0][d][1]-=player[1][a][0];
player[1][a][1]-=player[0][d][0];
if(player[1][a][1]<=0) {
for(int p=a;p<7;p++) {
player[1][p][0]=player[1][p+1][0];//B死一个随从
player[1][p][1]=player[1][p+1][1];//左移
}
player[1][7][0]=0;
player[1][7][1]=0;
player[1][0][1]--;
}
if(player[0][d][1]<=0) {
for(int p=d;p<7;p++) {
player[0][p][0]=player[0][p+1][0];//A死一个随从
player[0][p][1]=player[0][p+1][1];//左移
}
player[0][7][0]=0;
player[0][7][1]=0;
player[0][0][1]--;
}
}
}
return state;
}
void end() {
if(turn==0)
turn=1;
else
turn=0;
}
void print() {
System.out.println(state);
System.out.println(player[0][0][0]); //A的剩余生命
int a=player[0][0][1];
System.out.print(a+" ");
for(int i=1;i<=a;i++)
System.out.print(player[0][i][1]+" ");
System.out.println();
System.out.println(player[1][0][0]);//B的剩余生命
int b=player[1][0][1];
System.out.print(b+" ");
for(int i=1;i<=b;i++)
System.out.print(player[1][i][1]+" ");
System.out.println();
}
}//炉石传说类
public class Main {
public static void main(String[]args) {
int n,k,state=0;
String ac;
String action[]= {"summon","attack","end"};
Scanner in=new Scanner(System.in);
HearthStone hs=new HearthStone();
n=in.nextInt();
while(n>0) {
ac=in.next();
k=0;
if(ac.equals(action[1]))
k=1;
else if(ac.equals(action[2]))
k=2;
switch(k) {
case 0:{
int p,a,h;
p=in.nextInt();
a=in.nextInt();
h=in.nextInt();
hs.summon(p, a, h);
break;
}
case 1:{
int a,d;
a=in.nextInt();
d=in.nextInt();
state=hs.attack(a, d);
break;
}
case 2:{
hs.end();
break;
}
}
if(state!=0)
break;
n--;
}
hs.print();
in.close();
}
}
感谢阅读,也希望朋友们不吝赐教,有什么地方可以改进的请帮忙指出来,毕竟自己很难看到自己的问题。