javafx 多线程赛马设计

根据上一篇博客的内容,这篇将展示设计过程:

二.概要设计

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了,可以下载。

  • 10
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值