摇个骰子

  • 分析要求

  一开始思考如何实现骰子类的时候,感觉只需要实现得到一个1到6的随机数的方法,这样看来似乎不是一件困难的事,原计划半个小时内完成,然而在老师的指导下,渐渐发现自己代码中不规范的地方所在。现在思考的问题变成,如何实现一个规范的骰子类,代码中变量的定义是否规范,是否将骰子独立成一个可重复调用,适应一般情况的类,而不是当条件变更的时候还要进行反复修改,这就是老师所要求要学会面向对象的思考。

  • 设计实现

如图所示的各类间关系,当骰子数只有一个的时候,直接使用Dice类的方法;当骰子数不只一个的时候,通过使用骰盅Cup类调用Dice类的方法。

  • 代码说明

1.Dice.java

//骰子类的实现
public class Dice {
	private  int faceValue;  //定义骰子面值
	
	public Dice(){
		faceValue = (int)(Math.random() * 6) + 1;  //获得一	个1-6的随机数
	}
	public void roll(){	 //摇骰子
		faceValue = (int)(Math.random() * 6) + 1;
	}

	public  void unnormalroll(){  //摇不出4的骰子
		while(faceValue==4){
			faceValue = (int)(Math.random() * 6) + 1;
		}
	}

	public int getValue(){  //获得骰子数值
		return faceValue;
	}
}

2.Cup.java

//骰盅类的实现:可以放入多个骰子。
public class Cup {

	private int num=1;// num记录骰子的个数,默认为一个
	private Dice dice[]; //声明骰子数组

	public Cup(){ //往骰盅放入一个骰子
		dice = new Dice[num]; 

	}
	public Cup(int num){ //往骰盅放入多个骰子
		this.num = num;
		dice = new Dice[num];
	}

	public void roll(){ //摇动骰盅
		int i;
		for(i=0;i<num;i++){
			dice[i] = new Dice();	
		}
	}

	public int getValue(){  //一个骰子开盅看大小,并返回该数值
		return (dice[0].getValue());
	}

	public void getValues(int a[]){  //多个骰子开盅看大小。并将每个骰子的数值通过整型数组传出
			int i;
			for(i = 0;i < num;i++)
				a[i]=dice[i].getValue();
		}		
		public int getTotal(){ //返回多个骰子的总数值
			int sum=0,i;
			for(i=0;i<num;i++){
				sum += dice[i].getValue();
			}
			return sum;				
		}
}

3.Player.java

//Player1进行测试
import java.util.Scanner;
public class Player1 {

	public static void main(String[] args){	
		int i,myDice,normal; //myDice定义骰子的个数,normal标记是否使用正常骰子
		Scanner input = new Scanner(System.in);
	
		System.out.println("你要几个骰子?");
		myDice = input.nextInt(); //从键盘读入骰子数量
	
		if(myDice==1){		//一个骰子的情况
			System.out.println("使用摇不出4的骰子?Yes--0,No--1");  //特殊骰子情况
			normal = input.nextInt(); 
		
			Dice dice = new Dice();
			if(normal==1)     //摇骰子
				dice.roll();
			else
				dice.unnormalroll();  //特殊骰子
			System.out.println("You get "+dice.getValue());//输出所摇数值
		}else{					//多个骰子的情况
			int[] myValue = new int[myDice]; 
			Cup dice2 = new Cup(myDice);
			
			dice2.roll();
			dice2.getValues(myValue); //通过myvalue数组获取每个骰子的大小
			
			for(i = 0;i < myDice;i++) //输出每个骰子的大小
				System.out.println("第 "+(i+1)+"个骰子为:"+myValue[i]);
			System.out.println("骰子总数为"+dice2.getTotal());//输出总大小			
		}
	}
}
  • 测试运行

    1.一个正常骰子



    2.一个特殊骰子



    3.多个骰子


  • 小结

    总的来看,通过反复的修改,调试,最后用了将近两个小时。对比自己预估的时间,在要求分析和编写代码所用的时间较多,仔细思考,编写代码的不熟练也消耗了大部分时间,以及自己编写代码前,没有思考好各个类间的关系,导致多次大面积重改代码浪费许多时间。现在想想,写代码前先搞清楚类间关系,画好类图,养成这样的好习惯,对整体效率的提升有很大的意义。

posted @ 2017-10-08 16:46  mokuang  阅读(350)  评论(1编辑  收藏  举报