CCF模拟题201609-3炉石传说

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();
	}
}

感谢阅读,也希望朋友们不吝赐教,有什么地方可以改进的请帮忙指出来,毕竟自己很难看到自己的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值