Как я могу случайно отобразить один символ из данного слова
Вот обновление о том, где я нахожусь и что я застрял на основе того, что предложил @camickr. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что, поскольку в конце мне нужно иметь оператор return, я могу только возвращать буквы ArrayList.
Кроме того, каждый раз, когда нажимается кнопка подсказки, в месте решения появляется только один символ, и это [], но никаких реальных букв, из которых состоит решение, не появляется.
public String generateLetterHint(int count, String word) {
String[] answerArray = word.split("");
ArrayList<String> letters = new ArrayList<String>(Arrays.asList(answerArray));
//StringBuilder string = new StringBuilder();
Collections.shuffle(letters);
while (!letters.isEmpty()) {
String letter = letters.remove(0);
System.out.println(letter);
}
return letters.toString();
}
Любая помощь приветствуется!
2 ответа
Один способ добавить каждую (уникальную) букву строки в ArrayList
,
Тогда вы можете использовать Collections.shuffle(...)
метод рандомизации букв.
При каждом нажатии кнопки "Подсказка" вы:
- получить письмо по индексу 0
- "убрать" письмо из позиции 0
- дать подсказку.
Теперь при следующем нажатии кнопки "Подсказка" в индексе 0 будет другая буква.
Конечно, каждый раз, когда пользователь угадывает правильное письмо, вам также необходимо "удалить" это письмо из ArrayList.
Редактировать:
Простой пример, подтверждающий концепцию:
import java.util.*;
public class Main
{
public static void main(String[] args) throws Exception
{
String answer = "answer";
String[] answerArray = answer.split("");
ArrayList<String> letters = new ArrayList<String>(Arrays.asList(answerArray));
Collections.shuffle( letters );
while (!letters.isEmpty())
{
String letter = letters.remove(0);
System.out.println(letter);
}
}
}
В вашем реальном коде вы только один раз создадите ArrayList и сделаете случайное перемешивание один раз, когда определите, что такое слово "ответ".
Затем каждый раз, когда вам нужна подсказка, вы можете просто вызвать метод, который делает:
public String getHint(ArrayList letters)
{
return (letters.isEmpty() ? "" : letters.remove(0);
}
Это просто вернет пустую строку, если больше нет подсказок. Хотя лучшим решением было бы отключить кнопку подсказки, когда подсказки закончены.
Это работает только для одного ответа. Вы можете изменить, а затем работать с несколькими ответами одновременно. Когда вы отправляете строку в функцию, она дает вам уникальное письмо из строки.
package com.Stackru;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class RandomlyString {
private static List<Character> selectableLetters; // it store randomly selectable letters
private static boolean isFirst = true;
private static char letterHint(String answer) {
Random rnd = new Random();
// when function starts in first time, split the string letter by letter
if (isFirst) {
selectableLetters = splitString(answer);
}
isFirst = false;
if(!selectableLetters.isEmpty()) {
int hintIndex = rnd.nextInt(selectableLetters.size()); // select a letter randomly
char hint = selectableLetters.get(hintIndex); // put this letter to hint
selectableLetters.remove(hintIndex); // then remove this letter from selectableLetters, this is for don't select the same letter twice
return hint;
} else {
System.out.println("There is no hint!");
return ' ';
}
}
private static List<Character> splitString(String string) {
List<Character> chars = new ArrayList<>();
// split the string to letters and add to chars
for (char c: string.toCharArray()) {
chars.add(c);
}
return chars;
}
public static void main(String[] args) {
String answer = "Monkey";
for(int i=0; i<7; i++) {
System.out.println("Hints: " + letterHint(answer)); // it writes hint to screen
System.out.println("Other letters: " + selectableLetters); // currently selectable letters for hint
}
}
}