2作业 骰子传奇

需求分析

  • 就设计1-6范围的骰子而言我觉得是简单的,计划半小时内完成。但是扩展部分我觉得有些难,开始没想明白,如需要多个骰子时直接循环多次,实际上这是一个骰子投掷多次,不符合面向对象的思想。而后设计两个类:Die(骰子类)、Cup(骰盅类)。Die类中有多次投掷骰子的方法等,Cup类中有投掷多个骰子的方法,具体见下。

设计实现

代码如下

Die.java

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

//定义一个骰子类且面值只能为正整数
public class Die{
	private int id = 1;//骰子投掷的次数编号
	private int maxValue = 6;
	private int minValue = 1;
	private int faceValue = 0;//默认朝上面值为0,表示未投掷过骰子
	private Map<Integer,Integer> dieMap = new HashMap<Integer,Integer>();   

	public void die(int id){
		this.id = id;
   	}

	public void detail(){//显示骰子详细信息,仅能显示骰子当前设定的面值范围,未完成:每次投掷时的骰子面值范围
   	int i = 1;
   	if (faceValue == 0) {
	   	System.out.println("骰子的信息如下:");
	   	System.out.println("此骰子还未投掷过");
	   	System.out.println("当前最大面值:" + getMaxValue());
	   	System.out.println("当前最小面值:" + getMinValue());
   	}
   	else{
	   	System.out.println("骰子的信息如下:");
	   	System.out.println("此骰子已投掷:" + getId() + "次");
	   	System.out.println("当前最大面值:" + getMaxValue());
	   	System.out.println("当前最小面值:" + getMinValue());
	   	for (i = 1;i<=getId();i++)
		   	System.out.println("第" + i + "次投掷结果为:" + getValue(i));
   	}
   	System.out.println("\n");
	}

	public void initDie(){//初始化骰子
		this.id = 1;
   		this.maxValue = 6;
		this.minValue = 1;
		this.faceValue = 0;
		dieMap.clear();
	}

	public int getId(){//获取此骰子已投掷的次数
		if (id == 1) return id;
  		else return id-1;
	}

	public void setMaxValue(int maxValue){//设置投掷最大面值
		this.maxValue = maxValue;
 	}

	public int getMaxValue(){//获得骰子当前最大面值
		return maxValue;
	}

	public void setMinValue(int minValue){//设置投掷最小面值
		this.minValue = minValue;
	}

	public int getMinValue(){//获得骰子当前最小面值
		return minValue;
	}

	public int getValue(){//获取当前次骰子投掷的朝上面值
		if (faceValue == 0) return faceValue;//未投掷骰子时的返回值
		else{
			this.faceValue = dieMap.get(id-1);
			return faceValue;
		}
	}

	public int getValue(int id){//获得第id次投掷时骰子朝上面值
		if (faceValue == 0 || id > this.id-1) return 0;//未投掷骰子时的返回值
   		else{
	   		this.faceValue = dieMap.get(id);
	   		return faceValue;
   		}
	}

	public void roll(){//投掷一次骰子
		Random result = new Random();
   		faceValue = result.nextInt(maxValue - minValue +1) + minValue;
   		dieMap.put(id,faceValue);
   		System.out.println("此次为您第" + id + "次投掷此骰子");
   		id++;
	}

	public void roll(int number){//连续投掷number次骰子
		Random result = new Random();
   		int i = id;
   		int k = id + number;
   		for (i = id; i < k; i++){
	   		faceValue = result.nextInt(maxValue - minValue +1) + minValue;
	   		dieMap.put(id,faceValue);
	   		System.out.println("此次为您第" + id + "次投掷此骰子");
	   		id++;
   		}
	}

	public void rollNoNumber(int noNumber){//投掷骰子且不希望某个数(noNumber)出现
		Random result = new Random();
   		faceValue = result.nextInt(maxValue - minValue +1) + minValue;
   		while (faceValue == noNumber){
	   		faceValue = result.nextInt(maxValue - minValue +1) + minValue;
   		}
   		dieMap.put(id,faceValue);
   		System.out.println("此次为您第" + id + "次投掷此骰子" + "且本次不出现正整数" + noNumber);
   		id++;
	}

}

Cup.java

import java.util.HashMap;
import java.util.Map;

//定义一个骰盅且默认其内有一个骰子
public class Cup{

	private int number = 1;
	private Map<Integer,Integer> cupMap = new HashMap<Integer,Integer>();

	public void cup(int number){
		this.number = number;
	}

	public void initCup(){//初始化骰盅
		this.number = 1;
		cupMap.clear();
	}

   	public void setNumber(int number){//设置骰盅内骰子数量
		this.number = number;
	}

	public int getNumber(){//获得骰盅内骰子数量
		return number;
	}

	public void getValue(){//获取骰盅内所有骰子朝上的面值
		int i = 1;
	   	if (cupMap.get(1) == null) 	System.out.println(cupMap.get(1));
	   	else{
		   	for (i = 1; i<=number; i++) System.out.println("骰盅中第" + i + "个骰子的面值:" + cupMap.get(i));
	   	}
	}

	public int getValue(int number){//获得第id个骰子	朝上的面值
	   	this.number = number;
	   	if (cupMap.get(number) != null) return cupMap.get(number);
   		else return 0;
	}

   	public void roll(){//按顺序投掷骰盅内的骰子
	  	int i = 1;
	  	for(i=1; i<=number; i++){
		  	Die d = new Die();
		  	d.roll();
		  	cupMap.put(i,d.getValue());
	  	}
	}

	public void roll(int number){//指定骰盅内骰子数量且按顺序投掷骰盅内的骰子
	  	this.number = number;
	  	int i = 1;
	  	for(i=1; i<=number; i++){
		  	Die d = new Die();
		  	d.roll();
		  	cupMap.put(i,d.getValue());
	  	}
	}

	public void roll(int maxValue,int minValue){//按顺序投掷骰盅内的骰且指定骰子的面值
	  	int i = 1;
	  	for(i=1; i<=number; i++){
		  	Die d = new Die();
		  	d.setMaxValue(maxValue);
		  	d.setMinValue(minValue);
		  	d.roll();
		  	cupMap.put(i,d.getValue());
	  	}
	}

	public void roll(int maxValue,int minValue,int noNumber){//按顺序投掷骰盅内的骰,指定骰子的面值且不出现某个数(noNumber)
	  	int i = 1;
	  	for(i=1; i<=number; i++){
		  	Die d = new Die();
		  	d.setMaxValue(maxValue);
		  	d.setMinValue(minValue);
		  	d.rollNoNumber(noNumber);
		  	cupMap.put(i,d.getValue());
	  	}
	}

}

Test.java

public class Test {

	public static void main(String[] args){
		Die d = new Die();

		d.detail();
		d.roll();
		d.detail();
	
		d.roll(3);
		d.detail();

		d.rollNoNumber(4);
		System.out.println("骰子的信息如下:");
		System.out.println("id:" + d.getId());
		System.out.println("maxValue:" + d.getMaxValue());
		System.out.println("minValue:" + d.getMinValue());
		System.out.println("不希望某个数(4)出现时的朝上面值::" + d.getValue() + "\n");
	
		d.setMaxValue(4);
		d.setMinValue(2);
		d.roll();
		d.detail();
	
		d.initDie();
		System.out.println("骰子初始化完成");
		d.detail();
	
		Cup c = new Cup();
		c.setNumber(3);
		c.roll();
		System.out.println("当前骰盅内骰子的个数:" + c.getNumber());
		System.out.println("骰盅中第一个骰子的面值::" + c.getValue(1));
		System.out.println("骰盅中第二个骰子的面值:" + c.getValue(2));
		System.out.println("骰盅中第三个骰子的面值:" + c.getValue(3));
		System.out.println();

		c.roll(4,2);
		System.out.println("当前骰盅内骰子的个数:" + c.getNumber());
		System.out.println("骰盅中第一个骰子的面值::" + c.getValue(1));
		System.out.println("骰盅中第二个骰子的面值:" + c.getValue(2));
		System.out.println("骰盅中第三个骰子的面值:" + c.getValue(3));
		System.out.println();

		c.roll(4,2,2);
		System.out.println("当前骰盅内骰子的个数:" + c.getNumber());
		System.out.println("骰盅中第一个骰子的面值::" + c.getValue(1));
		System.out.println("骰盅中第二个骰子的面值:" + c.getValue(2));
		System.out.println("骰盅中第三个骰子的面值:" + c.getValue(3));
		System.out.println();
	
		c.initCup();
		System.out.println("初始化骰盅后骰子的信息如下:");
		System.out.println("当前骰盅内骰子的个数:" + c.getNumber());
		System.out.println("骰盅中第一个骰子的面值::" + c.getValue(1));
		System.out.println();
	
		c.roll(3);
		System.out.println("当前骰盅内骰子的个数:" + c.getNumber());
		System.out.println("骰盅中第一个骰子的面值::" + c.getValue(1));
		System.out.println("骰盅中第二个骰子的面值:" + c.getValue(2));
		System.out.println("骰盅中第三个骰子的面值:" + c.getValue(3));
		System.out.println();
		c.getValue();
	}
}

测试运行

  1. 显示骰子初始信息并在投掷一次后显示当前骰子信息
  • 连续投掷三次此骰子
  • 不出现4的情况下投掷骰子
  • 指定骰子面值为2-4并投掷
  • 初始化骰子
  • 预先指定骰盅内有3个骰子并依次投掷
  • 指定骰盅内3个骰子的面值为2-4并投掷
  • 不出现2的情况下投掷骰盅内所有骰子
  • 初始化骰盅
  • 投掷时指定骰盅内有3个骰子
  • 获取骰盅内所有骰子的值

个人小结

  • 耗时3-4个小时吧,开始构思没想好,导致调试的时候反复报错反复修改,感觉Die.java与Cup.java中有挺多累赘的代码,且为图方便没有交互,不足之处还有很多。
    通过这次经验,下次要预先画好类图,理清关系,这样不仅可以节省非常多的时间,还可以让思路更加清晰。
    PS:感觉在纸上画类图比较舒服,虽然到后面纸有可能不够大。。。

posted on 2017-10-12 15:37  L_Name  阅读(291)  评论(1编辑  收藏  举报

导航