Оригинальный вопрос, связанный с использованием перетаскивания мышью, чтобы имитировать ручную игру в Toss Word.
Этот метод перетаскивания не очень хорошо работал, так что вот новый метод
Эта игра была продуктом КракДата написания копии игры 1948 года, написана Ади Э. Гиссоу.
Toss Word имеет 14 кубиков, буквы на кубиках следующие:
d1 = "GHDCEI";d2 = "IKLHIG";d3 = "TARSMV";d4 = "EYIUAO";d5 = "SABODY";
d6 = "BACEFD";d7 = "МНКЛИТ";d8 = "LMONIP";d9 = "IEOHRF";d10 = "MEORSN";
d11 = "EAXWYZ";d12 = "МОРЕ";d13 = "UNSHOT";d14 = "PROSTQ";
Правила броска слов
Игроки по очереди бросают кубики и формируют слова из полученных букв. Слова должны иметь как минимум 3 буквы и не иметь собственных имен. Наберите один балл за каждую букву, использованную при составлении слов. Бонус: использование всех 14 букв означает 25, а не 14. Бонус: слово «ИГРА» насчитывает 50 баллов.
Дизайн игры
Мы использовали TextFields для представленияИгральные кости и доска для игры в мишени
Мы используем минимальные символы для именования этих источников (s1) и цели (t1)
Мы использовали события «При нажатии мыши» для имитации размещения буквы «кости» на доске для игры в мишени
Затем мыиспользуется событие «При нажатии мыши», чтобы разрешить удаление буквы «Кости» и разместить ее в новой позиции
. Мы используем логическое значение PLAY = false, чтобы запретить бросание костей после начала игры
Для имитации броскаигральные кости, которые мы используем для генерации случайных чисел, лямбда с одним слоем
. 1032 * БОЛЬШОЙ откат к дизайну Target Playing Board - каждый TextField требует 117 строк кода
Мы уменьшаем нашу Target Playing Board до 10 строкна 8 столбцов, что составляет примерно 9360 строк очень избыточного кода для каждого TextField на игровом поле
Если у кого-то есть лучший дизайн макета для Target Playing Board, не стесняйтесь комментировать!
Одно очень аккуратное объявление CSS-стиля было использовано не моим творением, а найдено на SO
Это предотвращает потерю границы вокруг TextField при применении цветового стиля
Здесьэто t2.setStyle ("- fx-control-inner-background: lightblue")
Мы опубликуем фрагмент кода генератора случайных чисел и выбор Dice
Мы опубликуем полный код для одногоВзаимодействие с игровым столом
Бросание костей
@FXML
private void onRandom() throws NoSuchFieldException{
//new Random().ints(7, 1, 7).forEach(System.out::println);
makeEnabled();
if(PLAY == true){
btnOK.requestFocus();
return;
}
makeVisible();
new Random().ints(1, 1, 7).forEach(ints -> {
int V = ints;
String d1 = "GHDCEI";
String S1 = String.valueOf(d1.charAt(V-1));
s1.setText(S1);
});<br>
Выбор костей
@Override
public void initialize(URL url, ResourceBundle rb) {
s1.setOnMouseClicked((MouseEvent )->{
move = s1.getText();
s1.setVisible(false);
PLAY = true;
});
s2.setOnMouseClicked((MouseEvent )->{
move = s2.getText();
s2.setVisible(false);
PLAY = true;
});<br>
Размещение и удаление букв с игрового поля
@FXML
private void onMC2(){
if(PLAY == false){
t2.setStyle("-fx-control-inner-background:red");
return;
}
t2.setText(move);
move = "";
btnOK.requestFocus();
if(t2.getText().isEmpty()){
t2.setStyle("-fx-control-inner-background:white");
}else{;
t2.setStyle("-fx-control-inner-background:lightblue");
}
// Code above error traps and places dice on Play Field
// Code below removes the dice to permit moving to alternate target location
t2.setOnMousePressed((MouseEvent event) -> {
if(t2.getText().equals(s1.getText())){
if(!s1.isVisible()){
s1.setVisible(true);
t2.setText("");
return;
}
}
if(t2.getText().equals(s2.getText())){
if(!s2.isVisible()){
s2.setVisible(true);
t2.setText("");
return;
}
}
if(t2.getText().equals(s3.getText())){
if(!s3.isVisible()){
s3.setVisible(true);
t2.setText("");
return;
}
}
if(t2.getText().equals(s4.getText())){
if(!s4.isVisible()){
s4.setVisible(true);
t2.setText("");
return;
}
}
if(t2.getText().equals(s5.getText())){
if(!s5.isVisible()){
s5.setVisible(true);
t2.setText("");
return;
}
}
if(t2.getText().equals(s6.getText())){
if(!s6.isVisible()){
s6.setVisible(true);
t2.setText("");
return;
}
}
if(t2.getText().equals(s7.getText())){
if(!s7.isVisible()){
s7.setVisible(true);
t2.setText("");
return;
}
}
if(t2.getText().equals(s8.getText())){
if(!s8.isVisible()){
s8.setVisible(true);
t2.setText("");
return;
}
}
if(t2.getText().equals(s9.getText())){
if(!s9.isVisible()){
s9.setVisible(true);
t2.setText("");
return;
}
}
if(t2.getText().equals(s10.getText())){
if(!s10.isVisible()){
s10.setVisible(true);
t2.setText("");
return;
}
}
if(t2.getText().equals(s11.getText())){
if(!s11.isVisible()){
s11.setVisible(true);
t2.setText("");
return;
}
}
if(t2.getText().equals(s12.getText())){
if(!s12.isVisible()){
s12.setVisible(true);
t2.setText("");
return;
}
}
if(t2.getText().equals(s13.getText())){
if(!s13.isVisible()){
s13.setVisible(true);
t2.setText("");
return;
}
}
if(t2.getText().equals(s14.getText())){
if(!s14.isVisible()){
s14.setVisible(true);
t2.setText("");
return;
}
}
});
}<br>
Одно время мы рассматривали возможность использования процесса для генерации возможных слов из результатов броскадисе. Вот код, который генерирует поисковые комбинации из броска костей. Затем он запускается против словаря с потоком
Мы не включили это в игру, казалось, что он победил идею игры
, которая должна была ДУМАТЬ
Код для построения поисковых слов
Private Void buildSearchWords(){
String W = "ILRYADIIEMASHT".toLowerCase();
int L = W.length();
ArrayList<String> rearange = new ArrayList<>();
for(int i = 1; i <= L; i++){
String firstLetter = W.substring(0, i);
String endLetter = W.substring(L - (L-i), L);
String endLetterNew = W.substring(L-i);
StringBuilder sb = new StringBuilder(W);
sb.replace(0, i, endLetterNew);
sb.replace(L-i, L, firstLetter);
rearange.add(sb.toString());
}
for(int X = 0; X < rearange.size();X++){
String A = rearange.get(X);
txaInput.appendText(A);
txaInput.appendText(" ");
}
Код для сравнения со словарем
List<String> dictionary = Arrays.asList(dictionaryArray);
ArrayList<String> list = new ArrayList<>();
int W = txtMonitor.getText().length();
String newFirstLetter = txtMonitor.getText().substring(0, 1).toLowerCase();
String newEndLetter = txtMonitor.getText().substring(W - 2, W);
}
dictionary.stream().filter(s -> s.startsWith(searchString)
|| s.startsWith(nF, 0)
&& s.length() > 1 && s.length() <= W+3
&& s.endsWith(nE))
.forEach(list :: add);