java摇两个色子代码_摇个骰子 - mokuang - 博客园

分析要求

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

设计实现

675c313e6db241733d1d6733b755b4e0.png

如图所示的各类间关系,当骰子数只有一个的时候,直接使用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

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

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.一个正常骰子

f2fa4fcde0412183ca710c31f55e1ba5.png

2.一个特殊骰子

fc1b5d0ad6dbd5dc4e24a76a6fbff9bd.png

3.多个骰子

9ebd955e49c7058c53d36809a21701a5.png

db13650d1ac8ab986f9a6f09ffa0e1d1.png

小结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值