需求分析
- 就设计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();
}
}
测试运行
- 显示骰子初始信息并在投掷一次后显示当前骰子信息
- 连续投掷三次此骰子
- 不出现4的情况下投掷骰子
- 指定骰子面值为2-4并投掷
- 初始化骰子
- 预先指定骰盅内有3个骰子并依次投掷
- 指定骰盅内3个骰子的面值为2-4并投掷
- 不出现2的情况下投掷骰盅内所有骰子
- 初始化骰盅
- 投掷时指定骰盅内有3个骰子
- 获取骰盅内所有骰子的值
个人小结
- 耗时3-4个小时吧,开始构思没想好,导致调试的时候反复报错反复修改,感觉Die.java与Cup.java中有挺多累赘的代码,且为图方便没有交互,不足之处还有很多。
通过这次经验,下次要预先画好类图,理清关系,这样不仅可以节省非常多的时间,还可以让思路更加清晰。
PS:感觉在纸上画类图比较舒服,虽然到后面纸有可能不够大。。。