前端时间发表了一片上色球有关的java小程序:http://color4you.iteye.com/admin/blogs/259442
今天来博客发现大家发表了一些意见,自己也重新研究了一下这个小程序,其实大家说得很好,这个程序更像是面向过程语言。于是想到了对这个程序进行重构,因为今天是星期天,本来就无聊嘛。
添加了一个Ball类,用于构建红色球和蓝色球的共同特征:
package com.color.program.ball;
import java.util.Arrays;
public abstract class Ball {
protected String[] ball;
protected int capacity;
protected int index;
/**
* 构造一个指定大小的ball
* @param capacity
*/
public Ball(int capacity){
this.capacity = capacity;
this.ball = new String[capacity];
}
/**
* 取得一个随机的字符串
* @return
*/
protected abstract String getNumber();
/**
* 返回当前的ball中元素数量
* @return
*/
protected int size(){
return this.index;
}
/**
* 确定能添加的数据没有越界
* @return
*/
protected boolean ensureCapacity(){
return index<capacity;
}
/**
* 覆写toString方法
*/
public String toString(){
StringBuffer sb = new StringBuffer();
for(int i=0;i<index;i++){
sb.append(ball[i]+"\t");
}
return sb.toString();
}
/**
* 为ball中已经添加的元素排序
*/
protected void sort(){
Arrays.sort(ball,0,index);
}
/**
* 根据指定的大小,完成数据的添加
*/
public void generate(){
for(int i=0;i<capacity;i++){
add();
}
}
/**
* 添加一个元素到ball中,如果当前生成的随机数已经在数组中存在,
* 则重新生成号码,添加到此位置
*/
protected void add(){
String number = getNumber();
if(!ensureCapacity()){
throw new RuntimeException("can't add more number");
}
for(int i=0;i<index;i++){
if(number.equals(ball[i])){
add();
return;
}
}
ball[index++] = number;
}
}
然后是红色球:
package com.color.program.ball;
public class RedBall extends Ball{
/**
* 创建指定大小的红色球
* @param capacity
*/
public RedBall(int capacity){
super(capacity);
}
/**
* 默认为6个红色球
*/
public RedBall(){
this(6);
}
/**
* 取得一个1--33之间的随机数,如果数字小于10,在数字前补加0,
* 保证为两位数
*/
@Override
protected String getNumber() {
int number = 1 + (int)Math.round(Math.random()*32);
return number <10 ?"0"+number:""+number;
}
public boolean equals(Object ob){
if(this == ob)
return true;
if(ob instanceof RedBall){
RedBall red = (RedBall)ob;
if(red.size() != this.size() || red.capacity != this.capacity)
return false;
this.sort();
red.sort();
for(int i=0;i<capacity;i++){
if(this.ball[i].equals(red.ball[i])){
return false;
}
}
return true;
}
return false;
}
}
蓝色球:
package com.color.program.ball;
public class BlueBall extends Ball{
/**
* 创建指定大小的蓝色球
* @param capacity
*/
public BlueBall(int capacity){
super(capacity);
}
/**
* 默认只有一个蓝色球
*/
public BlueBall(){
this(1);
}
/**
* 取得一个1--16之间的随机数,如果小于10,则在前面补加一个0
* 保证是两位数
*/
@Override
protected String getNumber() {
int number = 1 + (int)Math.round(Math.random()*15);
return number<10?"0"+number:""+number;
}
public boolean equals(Object ob){
if(this == ob)
return true;
if(ob instanceof BlueBall){
BlueBall blue = (BlueBall)ob;
if(blue.size() != this.size() || blue.capacity != this.capacity)
return false;
this.sort();
blue.sort();
for(int i=0;i<capacity;i++){
if(this.ball[i].equals(blue.ball[i])){
return false;
}
}
return true;
}
return false;
}
}
完整包含红色球和蓝色球的双色球:
package com.color.program.ball;
public class DoubleBall {
private Ball redBall;
private Ball blueBall;
public DoubleBall(int redSize,int blueSize){
this.redBall = new RedBall(redSize);
this.blueBall = new BlueBall(blueSize);
}
public DoubleBall(){
this.redBall = new RedBall();
this.blueBall = new BlueBall();
}
/**
* 产生一注完整号码,并完成排序
*/
public void generate(){
redBall.generate();
blueBall.generate();
redBall.sort();
blueBall.sort();
}
public void show(){
System.out.print(redBall);
System.out.println(blueBall);
}
public boolean equals(Object ob){
if(this == ob){
return true;
}
if(ob instanceof DoubleBall){
DoubleBall db = (DoubleBall)ob;
return (this.redBall.equals(db.redBall) && this.blueBall.equals(db.blueBall));
}
return false;
}
}
测试的主程序:
package com.color.program.ball;
public class DoubleMain {
public static void main(String[] args){
for(int i=0;i<5;i++){
DoubleBall doubleBall = new DoubleBall();
doubleBall.generate();
doubleBall.show();
}
}
}
希望大家指出我的不足之处,谢谢。
分享到:
相关推荐
【模拟双色球机选彩票MFC小程序】是一款利用Microsoft Foundation Classes (MFC)库开发的小型应用程序,专为双色球彩票爱好者提供机选功能。MFC是Microsoft为Windows平台设计的一种C++类库,它封装了Windows API,...
【双色球机选程序】是一种利用编程技术模拟随机选取双色球彩票号码的软件应用。双色球是中国流行的彩票游戏,由6个红球和1个蓝球组成,红球范围从1到33,蓝球范围从1到16。本程序的核心在于生成一组符合规则的随机...
双色球机选器是一款基于C++编程语言开发的简单应用程序,主要功能是自动生成双色球彩票的随机号码,供用户参考选择。这个程序对于初学者来说是一个很好的学习资源,因为它提供了完整的源代码,可以帮助他们理解C++...
linux c++ 双色球机选彩票源码 如何编译就不啰嗦了 可能有考虑不到的地方欢迎指正
一个用VC做的MFC基本对话框模式的双色球机选工具。有源代码,涉及到MFC基本控件应用,获取指定范围内随机数的算法,顺序排序算法,感兴趣的可以参考下。还有就是,随机出的号码可以买的哦,说不定就真中了!!
双色球机选代码,简单实用,代码简介。 可以学习一下。
使用西门子plc进行双色球机选
Java双色球机选法程序解析 在本文中,我们将详细解析Java双色球机选法程序,该程序主要用于生成双色球机选法结果,包括红球和蓝球的随机生成和排序。下面是知识点总结: 1. 随机数生成:使用Java的Random类来生成...
PHP模拟双色球随机选号 一、开发环境 1、环境搭建:Windows 8+Apache 2.4.18+MySQL 5.7.11+PHP 7.1.0 。 2、文本编辑器:Sublime Text3。 二、主要技术 本实验主要使用while循环、GD库和函数的封装和调用实现迷宫的...
本程序是关于对数组,随机数,循环语句的掌握,在做程序之前作出分析,首先建立两个数组红球和蓝球并用for语句遍历赋值,在新建一个数组记录从1-33个球里面随机出来的红球,同时定义一个boolean类型的数组用于比较...
用html+css+javascript实现的模拟机选双色球,通过定时器模拟选出一组或多组号码,可以将选择的号码进行排序,添加到列表中,导出excel,分页等操作,除此外还实现了图片的上传预览等功能......
根据往期双色球情况,优化选号。 技术原理说明 根据偶然误差原理:红球和值偏 差 ∑△△ δ=√------------------- n 则它的或然误差为: ρ=(2*δ)/3 由往期可知和值平均值:H 则当期最可能出现和值为...
php双色球在线机选程序V1.0(支持复式机选) 运行环境: php5.0及以上 安装方法: 上传所有文件到服务器. 本人平生也经常购买福彩双色球,本人不相信所谓的规律,我只相信运气。 所以每次选号都是直接机选。后来时间...
非常简单的双色球代码,希望对你的js开发有所帮助
excel双色球选号 随机性 取号 祝大家心想事成
这个小程序为喜爱双色球的朋友们带来福音啦,主要功能是可以实现部分号码手选、部分号码机选。这个功能可是在卖双色球的网页上都没有的哦。亲们,1个积分,赶快下载吧。
通过这个程序,我们可以利用C#的强大功能轻松地模拟双色球机选过程。此代码适用于学习C#编程、理解随机数生成以及数据结构如数组和HashSet的应用。对于彩票爱好者来说,这也是一个有趣的实践项目,可以在娱乐中学习...
本项目是一个关于"双色球 单/复式随机选号 c#源码"的实践案例,旨在帮助我们了解如何使用C#进行随机数生成和简单的数据分析。 首先,双色球是一种流行的彩票游戏,其玩法分为单式和复式两种。单式选号通常是指选择6...