Всегда лучше разбить то, что вам нужно сделать, на более мелкие шаги:
- Получите 10 слов от игрока Один
- Для каждого слова играйте в один раунд игры, используя это слово
Давайте назовем эти шаги 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 );
}
}
Так что теперь у нас есть более простая задача - сыграть один раунд, который включает в себя следующие шаги:
- выберите три позиции, где мы хотим замаскировать букву
- создать замаскированную версию слова с выделенными пунктирными буквами и показать ее игроку Два
- игрок Два угадывает букву:
- верно ли предположение? Если это так, замените соответствующую черту этой буквой
- повторите с шага 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 букв.
Остальное оставлю на ваше усмотрение:)