Логика циклов Java с помощью StringBuilder (палач) - PullRequest
0 голосов
/ 06 июня 2018

Так что моя проблема в том, что я установил большую часть своего кода, за исключением циклов, которые я пробовал всегда, кажется, повторяются дополнительные времена, отбрасывая правильный / неправильный счет.Я застрял, пробуя различные комбинации цикла while и for, и это было последней каплей.Любая помощь или идеи о том, как я могу получить ее в правильном направлении, была бы очень признательна.Я новичок, поэтому мой код может быть небрежным или каким-либо другим, но пока он работает. Подкласс для получения ввода

package hangman;
import java.util.Scanner;
public class Hangman {

    private String word;

    public void setWord() {
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter the secret word: (Under 7 letters)");
        this.word = scan.nextLine();
        this.word = word; 
    }

    public String getWord() {
        return this.word;
    }





}

Суперкласс, содержащий логику игры

 /*
 * Hangman 
     * 5/23/18
     * JDK Version 1.8.0
     */
    package hangman;

    import java.awt.*;
    import java.util.Scanner;
    import javax.swing.*;

    public class PlayHangman {

        public static void main(String[] args) {
            Hangman hangman = new Hangman();
            Scanner scn = new Scanner(System.in);
            int triesCount = 0;
            int correctCount = 0;
            int triesLimit = 7;
            hangman.setWord();
            String secretWord = hangman.getWord();
            int winCount = secretWord.length();
            StringBuilder b = new StringBuilder(secretWord.length());
            for (int i = 0; i < secretWord.length(); i++) {
                b.append("*");
            }
            char[] secrectStrCharArr = secretWord.toCharArray();
            int charCnt = secretWord.length();
            for (int x = 0; triesCount < triesLimit; x++) {

                    System.out.println("Secrect Word :" + b.toString());
                    System.out.println("Guess a letter :");

                    char guessChar = scn.next().toCharArray()[0];
                    for (int i = 0; i < secrectStrCharArr.length; i++) {
                        if(correctCount == winCount)
                        {System.out.println("Congrats! You have won!");}    
                        else if (guessChar == secrectStrCharArr[i]) {
                            b.setCharAt(i, guessChar);
                            correctCount++;hangmanImage(triesCount,correctCount);
                        } else if (guessChar != secrectStrCharArr[i]) {
                            triesCount++;
                            System.out.println("Incorrect: " + triesCount);
                            hangmanImage(triesCount, correctCount);
                        }

                    }
            }
        }

        public static void hangmanImage(int triesCount, int correctCount) {

          if (triesCount == 1) {
                    System.out.println("Wrong guess, try again - Incorrect: " + triesCount+" |Correct: "+correctCount);
                    System.out.println("   ____________");
                    System.out.println("   |          _|_");
                    System.out.println("   |         /   \\");
                    System.out.println("   |        |     |");
                    System.out.println("   |         \\_ _/");
                    System.out.println("   |                      ");
                    System.out.println("   |                        ");
                    System.out.println("   |                       ");
                    System.out.println("   |                           ");
                    System.out.println("   |                           ");
                    System.out.println("   |                           ");


                }
            if (triesCount == 2) {
                    System.out.println("Wrong guess, try again - Incorrect: " + triesCount+" | Correct: "+correctCount);
                    System.out.println("   ____________");
                    System.out.println("   |          _|_");
                    System.out.println("   |         /   \\");
                    System.out.println("   |        |     |");
                    System.out.println("   |         \\_ _/");
                    System.out.println("   |            |               ");
                    System.out.println("   |            |                ");
                    System.out.println("   |            |               ");
                    System.out.println("   |                           ");
                    System.out.println("   |                           ");
                    System.out.println("   |                           ");


                }
            if (triesCount == 3) {
                    System.out.println("Wrong guess, try again - Incorrect: " + triesCount+" | Correct: "+correctCount);
                    System.out.println("   ____________");
                    System.out.println("   |          _|_");
                    System.out.println("   |         /   \\");
                    System.out.println("   |        |     |");
                    System.out.println("   |         \\_ _/");
                    System.out.println("   |            |   /            ");
                    System.out.println("   |            | -/               ");
                    System.out.println("   |            |               ");
                    System.out.println("   |                           ");
                    System.out.println("   |                           ");
                    System.out.println("   |                           ");


                }
                if (triesCount == 4) {
                    System.out.println("Wrong guess, try again - Incorrect: " + triesCount+" | Correct: "+correctCount);
                    System.out.println("   ____________");
                    System.out.println("   |          _|_");
                    System.out.println("   |         /   \\");
                    System.out.println("   |        |     |");
                    System.out.println("   |         \\_ _/");
                    System.out.println("   |            |   /             ");
                    System.out.println("   |            | -/                ");
                    System.out.println("   |            |               ");
                    System.out.println("   |                           ");
                    System.out.println("   |                           ");
                    System.out.println("   |                           ");


                }
                if (triesCount == 5) {
                    System.out.println("Wrong guess, try again - Incorrect: " + triesCount+" |Correct: "+correctCount);
                    System.out.println("   ____________");
                    System.out.println("   |          _|_");
                    System.out.println("   |         /   \\");
                    System.out.println("   |        |     |");
                    System.out.println("   |         \\_ _/");
                    System.out.println("   |      \\    |   /            ");
                    System.out.println("   |        \\- | -/               ");
                    System.out.println("   |            |               ");
                    System.out.println("   |                           ");
                    System.out.println("   |                           ");
                    System.out.println("   |                           ");


                }
                if (triesCount == 6) {
                    System.out.println("Wrong guess, try again - Incorrect: " + triesCount+" |Correct: "+correctCount);
                    System.out.println("   ____________");
                    System.out.println("   |          _|_");
                    System.out.println("   |         /   \\");
                    System.out.println("   |        |     |");
                    System.out.println("   |         \\_ _/");
                    System.out.println("   |      \\    |   /            ");
                    System.out.println("   |        \\- | -/               ");
                    System.out.println("   |            |               ");
                    System.out.println("   |             \\               ");
                    System.out.println("   |               \\             ");
                    System.out.println("   |                 --          ");


                }

                if (triesCount == 7) {
                    System.out.println("Wrong guess, try again - Incorrect: " + triesCount+" |Correct: "+correctCount);
                    System.out.println("   ____________");
                    System.out.println("   |          _|_");
                    System.out.println("   |         /   \\");
                    System.out.println("   |        |     |");
                    System.out.println("   |         \\_ _/");
                    System.out.println("   |      \\    |   /            ");
                    System.out.println("   |        \\- | -/               ");
                    System.out.println("   |            |               ");
                    System.out.println("   |           /  \\               ");
                    System.out.println("   |          /     \\             ");
                    System.out.println("   |       ---        ---          ");


                }

                if(triesCount>7)
                {System.out.println("You lost");}


        }

    }

1 Ответ

0 голосов
/ 06 июня 2018

Ваш цикл таков, что он сравнивает символ с каждой позицией, поэтому, даже если ввод символа находится в какой-то позиции, то, как и ваш цикл, он перейдет к else if (guessChar != secrectStrCharArr[i] для всех других позиций в строке.Например, слово hello и input h, цикл будет также выполняться для ello и вернет неверное число как 4.

Вместо этого вы должны проверить совпадение и разорвать внутренний цикл, когда вынайти соответствие:

for (; triesCount < triesLimit; ) { //for loop can used like this

    System.out.println("Secret Word :" + b.toString());
    System.out.println("Guess a letter :");
    Boolean flag = false; //using a flag to check for match
    char guessChar = scn.next().toCharArray()[0];
    for (int i = 0; i < secretWord.length(); i++) {

        if (guessChar == secretWord.charAt(i)) {
            b.setCharAt(i, guessChar);
            correctCount++;
            hangmanImage(triesCount, correctCount);
            flag = true; //match found
            break; 
        }
     }
     if (!flag) { 
         //if no match is found after checking entire array,
         //increase triesCount
         triesCount++;
         hangmanImage(triesCount, correctCount);
     }
     if (!b.toString().contains("*")) { //game win check
          System.out.println("Congrats! You have won!");
          break;
     }
}

Обратите внимание, что я удалил строку char[] secrectStrCharArr = secretWord.toCharArray();, так как она избыточна и не требуется.Также обратите внимание, что я изменил логику проверки, выиграна ли игра.

Кроме того, соглашения Java таковы, что функция установки написана так:

public void setWord(String word) {
    this.word = word;

}

И используется как hangman.setWord(word)

...