Как я могу случайно отобразить один символ из данного слова

Вот обновление о том, где я нахожусь и что я застрял на основе того, что предложил @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(...) метод рандомизации букв.

При каждом нажатии кнопки "Подсказка" вы:

  1. получить письмо по индексу 0
  2. "убрать" письмо из позиции 0
  3. дать подсказку.

Теперь при следующем нажатии кнопки "Подсказка" в индексе 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
        }
    }
}
Другие вопросы по тегам