простая игра "Угадай буквы" в Java - PullRequest
0 голосов
/ 12 мая 2018

Я только начал писать (игра в догадки) в качестве задания .. в Java (первый игрок вводит 10 слов, а затем 3 случайных персонажа будут скрыты, после чего второй игрок будет угадывать каждого персонажа, и если он угадал правильнозатем будет показано новое слово от первого игрока, чтобы угадать скрытых символов, пока все 10 слов не будут правильно угаданы .. у него есть только 10 попыток выйти из программы, если он угадал неправильно >>>> проблема была в заменескрытые символы с угаданными от второго игрока


вот как я прячу 3 случайных символа, образующих строку:

Scanner s = new Scanner(System.in);


       Random r= new Random();
  String word= null;
    for (int i=0; i<10;i++){
                 word= s.nextLine();

    }
    int wordlength = word.length();
    int a=0, b=0,c=0;
    while(a==b||b==c||a==c){
    a= r.nextInt( wordlength);
     b= r.nextInt( wordlength);
    c= r.nextInt( wordlength);        
    }

    char[] wordsArray = word.toCharArray();
    wordsArray [a]='-';
            wordsArray [b]='-';
    wordsArray [c]='-';

    String modwords =new String (wordsArray);
    System.out.println(modwords );

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Всегда лучше разбить то, что вам нужно сделать, на более мелкие шаги:

  1. Получите 10 слов от игрока Один
  2. Для каждого слова играйте в один раунд игры, используя это слово

Давайте назовем эти шаги getWords и playRound

С первого шага мы хотим получить список из 10 слов: для этого мы можем использовать List<String>

Итак, давайте создадим для него метод:

private static List<String> getWords( int numberOfWords )
{
    Scanner s = new Scanner( System.in );
    List<String> words = new ArrayList<String>();
    for ( int i = 0; i < numberOfWords; i++ )
    {
        words.add( s.nextLine() );
    }
    return words;
}

Теперь мы можем вызвать этот метод, чтобы получить наш список слов и передать их по одному слову за раз нашему второму методу:

public static void main( String[] args )
{
    int numberOfWords = 10;
    System.out.println( "Player 1: enter " + numberOfWords + " words" );

    List<String> words = getWords( numberOfWords )

    System.out.println( "Ready, player 2?" );

    for ( String word : words )
    {
        playRound( word );
    }
}

Так что теперь у нас есть более простая задача - сыграть один раунд, который включает в себя следующие шаги:

  1. выберите три позиции, где мы хотим замаскировать букву
  2. создать замаскированную версию слова с выделенными пунктирными буквами и показать ее игроку Два
  3. игрок Два угадывает букву:
  4. верно ли предположение? Если это так, замените соответствующую черту этой буквой
  5. повторите с шага 3, пока все черточки не исчезнут

Давайте назовем первые три шага в качестве методов:

private static List<Integer> getMaskPositions( String word ) { ... }

private static StringBuilder createdMaskedWord( String word, List<Integer> maskPositions ) { ... }

private static char getNextGuess( ) { ... }

Тогда мы можем использовать их в нашем playRound() методе:

private static void playRound( String word )
{
    // choose three positions to mask out:
    List<Integer> maskPositions = getMaskPositions( word );

    // mask our word by dashing out the three chosen positions:
    StringBuilder maskedWord = createdMaskedWord( word, maskPositions );

    System.out.println( "The next word is: " + maskedWord );

    while ( maskedWord.toString().contains( "-" ) )
    {
        // fetch a one-character guess from Player 2:
        char guess = getNextGuess();

        for ( Integer position : maskPositions )
        {
            if ( word.charAt( position ) == guess )
            {
                // guess is correct: replace the dash with the right letter
                maskedWord.setCharAt( position, guess );
            }
        }
        // now re-display the masked word (showing any correctly-guessed letters):
        System.out.println( maskedWord );
    }

    // no more dashes left: all missing letters correctly guessed:
    System.out.println( "Well Done!" );
}

Это все еще оставляет три метода для реализации: getMaskPositions () , creationMaskedWord () и getNextGuess () , но теперь это гораздо более простые проблемы для вам решать (и вы можете повторно использовать часть кода, который вы уже написали).

Обратите внимание, что мы используем StringBuilder для хранения maskedWord: это позволяет нам менять буквы (это невозможно сделать с String, который является неизменным).

Вы также можете улучшить мой код, проверив правильность ввода: например, каждое слово должно быть не короче 3 букв.

Остальное оставлю на ваше усмотрение:)

0 голосов
/ 12 мая 2018

читает пользовательский ввод в StringBuilder и сравнивает позиции a, b и c, если символ пользовательского ввода равен оригинальному слову char, чем заменить его, что-то вроде этого

public static void main(String[] args) {
    String word = "hello";
    StringBuilder obscureWord = new StringBuilder("h-l-o");
    Scanner s = new Scanner(System.in);

    while (true){
        int pos = obscureWord.indexOf("-");
        if (pos == -1)
            break;

        System.out.println("guess the letter " + obscureWord + " : ");
        char c = s.nextLine().charAt(0);
        if (c == word.charAt(pos)){
            obscureWord.replace(pos,pos+1, word.substring(pos,pos+1));
            System.out.println("correct guess! " + obscureWord);
        }
        else {
            System.out.println("incorrect, try again");
        }
    }
}

конечно, вы можете заменить while на for loop для лимитных попыток

...