根据上一篇博客的内容,这篇将展示设计过程:
二.概要设计
2.1 系统流程图
2.2 功能模块图
2.3 赛马程序模拟程序初始化模块
在这一模块当中,要求使用者选择当局需要赛马的马匹数量,界面包含内容:
下拉框cb选择马匹数量,按钮enter用于进入下一界面
2.4 修改参数模块
本模块分为两个小模块,第一模块主要是用于选择需要修改的号码,然后进入第二模块,第二模块主要是用于修改每匹马的参数(力量,耐力,配合力),且范围为0-20,超出范围会有提示
2.5 投注区模块
这一模块主要实现的是让用户选择投注号码和投注金额
2.6 线程处理模块
这里使用线程实现接口的run()方法,然后随机改变图片的横坐标。
2.7 赛马比赛区模块
该模块是整个程序的核心模块,在这里实现赛马的移动,这里通过动态的创建线程,使马跑起来,并且跑完后自动的显示结果,并将结果存入文件中去
2.8 比赛结果显示模块
此模块创建一个文本处理线程,当赛马线程结束后,即比赛结束后,动态的更新各个文本域的内容
2.9 系统类图
三.详细设计
3.1 赛马程序模拟程序初始化模块
在这一模块当中,要求使用者选择当局需要赛马的马匹数量,界面包含内容:
下拉框cb选择马匹数量,按钮enter用于进入下一界面
核心代码:
Image image = new Image("File:Start.gif");
ImageView imageView1 = new ImageView(image);
vbox.getChildren().add(imageView1);
vbox.getChildren().add(new Label("请输入您想赛马的马匹数量:"));
// 下拉数量
int[] greetings = new int[] { 2, 3, 4, 5, 6, 7, 8 };
ChoiceBox<Integer> cb = new ChoiceBox<Integer>(FXCollections.observableArrayList(2, 3, 4, 5, 6, 7, 8));
// 监听下拉框
cb.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
public void changed(ObservableValue ov, Number value, Number new_value) {
horsenum = greetings[new_value.intValue()];
}
});
3.2 修改参数模块
基本数据申明:
private int numberOfselect = 1;// 所要改变参数的马匹
private int horsenum = 8;// 马匹数
Label label = new Label();//
VBox vb = new VBox(20);
Label[] l = new Label[3];
private HorseData[] horseData = new HorseData[horsenum];// 马匹的参数数组
//核心代码:
ComboBox<Integer> cb = new ComboBox<Integer>(FXCollections.observableArrayList(l));// 监听下拉框
cb.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>(){public void changed(ObservableValue ov, Number value, Number new_value) {
numberOfselect = (l.get(new_value.intValue()));
try {
CheckData t = new CheckData(numberOfselect, horseData, horsenum);
Thread.sleep(200);
t.start(primaryStage);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
});betting.setOnAction(e->
{
Betting t = new Betting(horsenum, horseData);
try {
t.start(primaryStage);
} catch (Exception e1) {
e1.printStackTrace();
}
});
3.2.1 投注区模块
这一模块主要实现的是让用户选择投注号码和投注金额
核心代码:
ToggleGroup group = new ToggleGroup();
RadioButton[] button = new RadioButton[horsenum];
for(int i = 0;i<horsenum;i++){
button[i] = new RadioButton((i+1)+"号马");
button[i].setToggleGroup(group);
button[i].setUserData(i+1);
}
//监听选中的马编号
group.selectedToggleProperty().addListener(new ChangeListener<Toggle>() {
public void changed(ObservableValue<? extends Toggle> ov,
Toggle old_toggle, Toggle new_toggle) {
if (group.getSelectedToggle() != null) {
selectHorseNum =(int) group.getSelectedToggle().getUserData();
}
}
});
Label amount = new Label("下注金额:");
//下拉下注金额
int[] greetings = new int[] {100,200,300,400,500,600,700,800,900,1000};
ChoiceBox<Integer> cb = new ChoiceBox<Integer>(
FXCollections.observableArrayList(100,200,300,400,500,600,700,800,900,1000));
//监听下拉框
cb.getSelectionModel().selectedIndexProperty()
.addListener(new ChangeListener<Number>() {
public void changed(ObservableValue ov, Number value, Number new_value) {
noteAmount = greetings[new_value.intValue()];
}
});
3.2.2 线程处理模块
核心代码:
这里使用线程实现接口的run()方法,然后随机改变图片的横坐标。
public void run() {
Date date1 = new Date();
d.setTiemInit(date1.getTime());
while (true) {
try {
// 通过参数控制线程速度
Thread.sleep((int) parameterEffect());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.x += Horse.getNum();
// 此处如果改变图片位置,会导致线程卡住,所以将数据传入
// 另一个专门画图的线程
d.setX((int) this.x);
if (this.x >= 850) {
Date date = new Date();
d.setTimeEnd(date.getTime());
d.f = true;
break;
}
}
}
3.2.3 赛马比赛区模块
StackPane paneFirst = new StackPane();
ImageView imageView11 = new ImageView("File:6.jpg");
paneFirst.getChildren().add(imageView11);
Pane pane = new Pane();
paneFirst.getChildren().add(pane);
Button enter = new Button("开始游戏!");
Label[] lab1 = new Label[horsenum];//显示马的号码
//设置文本区域
HBox showAmount = new HBox();//用于显示金额
Label labelOfAmount = new Label(" 起始金额:");
Label labelOfPutChip = new Label(" 下注金额:");
Label labelOfLast = new Label(" 赛后金额:");
Label labelOfStr = new Label(" 所投注号码:");
labelOfAmount.setStyle("-fx-background-color:red");
labelOfPutChip.setStyle("-fx-background-color:red");
labelOfLast.setStyle("-fx-background-color:red");
labelOfStr.setStyle("-fx-background-color:red");
javafx.scene.control.TextField textOfAmount = new javafx.scene.control.TextField();
javafx.scene.control.TextField textOfPutChip = new javafx.scene.control.TextField();
javafx.scene.control.TextField textOfLast = new javafx.scene.control.TextField();
javafx.scene.control.TextField textOfStr = new javafx.scene.control.TextField();
textOfAmount.setText(totalChip+"");
textOfAmount.setEditable(false);
textOfPutChip.setText(putChip+"");
textOfPutChip.setEditable(false);
textOfLast.setText("");
textOfLast.setEditable(false);
textOfStr.setEditable(false);
textOfStr.setText(""+selectNum+"号马");
showAmount.getChildren().add(labelOfAmount);
showAmount.getChildren().add(textOfAmount);
showAmount.getChildren().add(labelOfPutChip);
showAmount.getChildren().add(textOfPutChip);
showAmount.getChildren().add(labelOfLast);
showAmount.getChildren().add(textOfLast);
showAmount.getChildren().add(labelOfStr);
showAmount.getChildren().add(textOfStr);
Text te = new Text();
te.setX(300);
te.setY(200);
te.setCache(true);
te.setFill(Color.RED);
te.setFont(Font.font(null, FontWeight.BOLD, 30));
pane.getChildren().add(te);
pane.getChildren().add(showAmount);
textArea.setWrapText(true);
textArea.setEditable(false);
HBox hb = new HBox();
// 初始化马匹,规划赛道
VBox vb = new VBox();
vb.getChildren().add(enter);
// 生成马的图像
for (int i = 0; i < horsenum; i++) {
String style = "";//用于随机选择马匹颜色
style = selectRandom1();
lab1[i] = new Label((i+1)+"号马");
lab1[i].setLayoutX(5);
lab1[i].setLayoutY(iniy+55);
lab1[i].setStyle("-fx-background-color:red");
image[i] = new Image(style);
imageView[i] = new ImageView(image[i]);
imageView[i].setX(10);
imageView[i].setY(iniy);
imageView[i].setStyle("-fx-background-color:red");
iniy += 50;
pane.getChildren().add(lab1[i]);
pane.getChildren().add(imageView[i]);
}
for (int i = 0; i < horsenum; i++) {
d[i] = new Data((int) imageView[i].getX(),i);
}
Runnable[] r = new Runnable[horsenum];
Thread[] t = new Thread[horsenum];
for (int i = 0; i < horsenum; i++) {
r[i] = new Horse(imageView[i],d[i],horseData[i]);
t[i] = new Thread(r[i]);
}
enter.setOnAction(e -> {
enter.setDisable(true);
// 启动线程
for (int i = 0; i < horsenum; i++) {
t[i].start();
}
// 画图线程
new Thread(new Runnable() {
@Override
public void run() {
try {
while (judgeFinish()) {
for (int i = 0; i < horsenum; i++) {
try {
Thread.sleep(2);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
imageView[i].setX(d[i].getX());
}
Thread.sleep(200);
Platform.runLater(new Runnable() {
@Override
public void run() {
}
});
Thread.sleep(200);
}
} catch (InterruptedException ex) {
}
}
}).start();
//文本域线程
new Thread(new Runnable() {
@Override
public void run() {
try {
while (true) {
if(judge()){
for (int i = 0; i < horsenum; i++) {
try {
Thread.sleep(2);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
saveDataInList();//数据存入链表
getString();//获取结果
if(judgeWinOrLose()){
te.setText("恭喜您赢了!");
textOfLast.setText(""+(totalChip+putChip));
}
else{
te.setText("抱歉,您输了!");
textOfLast.setText(""+(totalChip-putChip));
}
textArea.setText(s);
s += "\r\n$$$$$$$$$$$$$$$$$$$$";
FileDeal fileInput = new FileDeal();
fileInput.fileAdd("输赢记录.txt",s);
break;
}
Thread.sleep(200);
Platform.runLater(new Runnable() {
@Override
public void run() {
for(int i = 0;i<horsenum;i++){
pane.getChildren().remove(imageView[i]);
}
int y = 10;
for(int j = 0;j<horsenum;j++){
imageView[j] = new ImageView(selectRandom());
imageView[j].setX(900);
imageView[j].setY(y);
y += 50;
pane.getChildren().add(imageView[j]);
}
}
});
Thread.sleep(200);
break;
}
}
} catch (InterruptedException ex) {
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
try {
} catch (Exception e1) {
e1.printStackTrace();
}
});
3.2.4 比赛结果显示模块
此模块创建一个文本处理线程,当赛马线程结束后,即比赛结束后,动态的更新各个文本域的内容
//文本域线程
new Thread(new Runnable() {
@Override
public void run() {
try {
while (true) {
if(judge()){
for (int i = 0; i < horsenum; i++) {
try {
Thread.sleep(2);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
saveDataInList();//数据存入链表
getString();//获取结果
if(judgeWinOrLose()){
te.setText("恭喜您赢了!");
textOfLast.setText(""+(totalChip+putChip));
}
else{
te.setText("抱歉,您输了!");
textOfLast.setText(""+(totalChip-putChip));
}
textArea.setText(s);
s += "\r\n$$$$$$$$$$$$$$$$$$$$";
FileDeal fileInput = new FileDeal();
fileInput.fileAdd("输赢记录.txt",s);
break;
}
Thread.sleep(200);
Platform.runLater(new Runnable() {
@Override
public void run() {
for(int i = 0;i<horsenum;i++){
pane.getChildren().remove(imageView[i]);
}
int y = 10;
for(int j = 0;j<horsenum;j++){
imageView[j] = new ImageView(selectRandom());
imageView[j].setX(900);
imageView[j].setY(y);
y += 50;
pane.getChildren().add(imageView[j]);
}
}
});
Thread.sleep(200);
break;
}
}
} catch (InterruptedException ex) {
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
最后,是现阶段的代码已经上传到csdn了,可以下载。