
我正在創建一個 JavaFX 座位安排 APP
@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 以及我如何檢查看看座位是否已經坐滿,所以我不會在同一個座位上坐兩次?
還有沒有辦法檢查顏色是否已經被拍攝?
uj5u.com熱心網友回復:
使用隨機函式的一個有趣的替代方法是將您的所有選擇放在 a 中List,然后應用Collection方法shuffle()。然后,您可以遍歷串列。這確保了每個選項被選擇一次且僅一次。
我還沒有仔細研究代碼來判斷 switch/case 構造是否是更好的選擇,但這總是需要考慮的。
uj5u.com熱心網友回復:
這是一個僅使用控制臺的類似(故意不相同)示例。
我把它留給你來創建一個 GUI。
提示
- 撰寫 GUI 與撰寫控制臺應用程式不同,因為 GUI 是事件驅動的,因此您需要擺脫一些回圈并對事件采取行動。
- 您可以使用 ObservableLists 將串列更改反映在 UI 中。
- 當您從 ObservableList 中洗掉某些內容時,它將不再在串列中,因此如果它系結到 UI 中的某些內容,它將不再存在
- 例如,如果它是一個顏色選擇串列并且從其中洗掉了一種顏色,則該顏色將不再可供選擇。
隨機播放串列,然后從隨機播放的串列中選擇
這與物理洗牌一副牌,然后從上到下依次抓取卡片的想法相同。
基本思想是解決這個問題的一種方法是應用:
- 陣列的隨機洗牌
你還可以學習:
- O(1) 中的唯一(非重復)亂數?
- https://en.wikipedia.org/wiki/Fisher–Yates_shuffle
但是你不需要自己寫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.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/389855.html
