Intellij Idea JavaFX座位安排应用程序随机挑选尚未有人坐的座位?

8mmmxcuj  于 2022-12-03  发布在  Java
关注(0)|答案(2)|浏览(142)

我正在创建JavaFX座位安排应用程序

@FXML
void addStudentClicked(ActionEvent event) {

    String str = studentname.getText();
    Random random = new Random();
    int randomInt = random.nextInt(9);
    if(randomInt == 0){
        if(str.isEmpty()){
          errorLabel.setText("ERROR");
        }
        else{
        studentname1.setText(studentname.getText());
        student1.setFill(studentcolour.getValue());
        }

    }
    else if(randomInt == 1){
        if(str.isEmpty()){
            errorLabel.setText("ERROR");
        }

这是我的代码,到目前为止,它将接受用户输入,并将其应用到一个随机的座位上,它继续使用else if's for each seat,有没有一个更干净的方法来完成这个任务,然后使用所有else if's,以及我如何检查座位是否已经被填满,这样我就不会重复填充同一个座位了?
还有,有没有办法检查颜色是否已经采取?

dddzy1tm

dddzy1tm1#

一个有趣的替代方法是将所有选项放入List中,然后应用Collection方法shuffle(),这样就可以遍历列表,确保每个选项只被选择一次。
我还没有仔细研究代码,无法判断switch/case结构是否是更好的选择,但这总是需要考虑的。

r8uurelv

r8uurelv2#

下面是一个仅使用控制台的 * 类似 *(故意不相同)示例。
我把它留给您来创建GUI。

  • 提示 *

1.编写GUI与编写控制台应用程序不同,因为GUI是事件驱动的,所以您需要摆脱一些循环并对事件进行操作。
1.您可以使用ObservableLists在UI中反映列表更改。

  • 当您从ObservableList中删除某个内容时,它将不再位于列表中,因此如果它绑定到UI中的某个内容,它将不再位于列表中
  • 例如,如果它是颜色选择列表并且从其中移除了颜色,则该颜色将不再可用于选择。
  • 随机播放列表,然后从随机播放的列表中选择 *

这与物理地洗牌一副牌,然后从上到下按顺序抓牌的想法是一样的。
基本思想是,解决这个问题的一种方法是应用:

您还可以学习:

但是您不需要自己编写shuffle算法,您可以使用java集合库中已经实现的算法。

Collections.shuffle(seatNumbers);
  • 示例应用 *

基于控制台应用程序的示例。
我相信这个例子使用了一些你不熟悉的概念,如果你使用了它们,你应该理解它们或者用不同的方式去做。特别是:

  • 颜色可以从预定义的数组中选择(就像名称一样),而不是使用插值生成器。
  • 可以使用添加到列表的循环而不是添加到lambda中的集合的流来生成座位号数组。

尝试运行示例应用程序并查看输出,看看它做了什么,然后尝试思考如何将类似的概念应用到程序中。

import javafx.scene.paint.Color;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class MusicalDragons {

    public static final int NUM_ROUNDS = 3;

    public static void main(String[] args) {
        MusicalDragons game = new MusicalDragons();

        for (int i = 0; i < NUM_ROUNDS; i++) {
            System.out.println("Round " + (i+1));
            System.out.println("=========");
            game.play();
            System.out.println();
        }
    }

    private final List<String> dragons;
    private final List<Color> palette;
    private final List<Integer> seatNumbers;

    private final int numSeats;

    public MusicalDragons() {
        // generate a list of names.
        dragons = Arrays.asList(
                "Oyositatu (Old + Dragon)",
                "Tamasipionosi (Soul + Master)",
                "Timatamï (Crossroad + Snake)",
                "Tômiarôzi (Wealth + Master)",
                "Ararepemi (Hail + Snake)",
                "Umasumera (Horse + Emperor)",
                "Umitatu (Sea + Dragon)",
                "Akitatu (Autumn + Dragon)",
                "Tawayatatu (Weak + Dragon)",
                "Amoritatu (Descend From Heaven + Dragon)"
        );

        numSeats = dragons.size() - 1;

        // generate a list of colors.
        palette = new ArrayList<>();
        for (int i = 0; i < numSeats; i++) {
            palette.add(
                    Color.RED.interpolate(
                            Color.VIOLET, 
                            i * (1.0 / (numSeats - 1))
                    )
            );
        }

        // generate a list of seat numbers.
        seatNumbers =
                IntStream.range(0, numSeats)
                        .boxed()
                        .collect(
                                Collectors.toCollection(
                                        ArrayList::new
                                )
                        );
    }

    private void play() {
        // randomize the order of everything.
        Collections.shuffle(palette);
        Collections.shuffle(seatNumbers);
        Collections.shuffle(dragons);

        // display the seat assignments.
        for (int i = 0; i < numSeats; i++) {
            System.out.println(
                    dragons.get(i) + "\n" +
                            "  gets seat #" + seatNumbers.get(i) + "\n" +
                            "  colored " + palette.get(i)
            );
        }

        // hmm, one dragon missed out . . .
        System.out.println();
        System.out.println(
                dragons.get(numSeats) + 
                        " does not get a seat and is very angry."
        );
    }
}
  • 输出 *
Round 1
=========
Tawayatatu (Weak + Dragon)
  gets seat #1
  colored 0xf64884ff
Tamasipionosi (Soul + Master)
  gets seat #4
  colored 0xff0000ff
Oyositatu (Old + Dragon)
  gets seat #7
  colored 0xfd0e1aff
Ararepemi (Hail + Snake)
  gets seat #0
  colored 0xf074d4ff
Umasumera (Horse + Emperor)
  gets seat #8
  colored 0xfb1d35ff
Amoritatu (Descend From Heaven + Dragon)
  gets seat #3
  colored 0xf73a6aff
Timatamï (Crossroad + Snake)
  gets seat #2
  colored 0xf4579fff
Umitatu (Sea + Dragon)
  gets seat #5
  colored 0xf265b9ff
Tômiarôzi (Wealth + Master)
  gets seat #6
  colored 0xf92b4fff

Akitatu (Autumn + Dragon) does not get a seat and is very angry.

相关问题