Java - игра Палач со StringBuilder. Поймать несколько букв в слове - PullRequest
0 голосов
/ 15 июня 2019

Я только начинающий в программировании и пытаюсь создать свой первый проект с несколькими классами, который является палачом. Я знаю, что по этой теме много тем, но не смог найти решение, которое бы работало с StringBuilder. Я застрял с ловлей нескольких букв в слове. Может ли кто-нибудь помочь? рассматриваемый метод - checkAnswer и находится ниже:

public void checkAnswer (){
    if (logic.line.indexOf(answer)!= -1){
    System.out.println ("You are right! The letter " + answer + " exists");
    StringBuilder guessedChar = new StringBuilder(logic.newLine);
    guessedChar.setCharAt(logic.line.indexOf(answer), answer);
    lettersGuessed = answer +lettersGuessed;
            score = score + 1;
            System.out.println("Letters guessed: " + lettersGuessed);
            System.out.println("Letters missed: " + lettersMissed);
            System.out.println("Your score is:" + score);
   logic.newLine = guessedChar.toString();
    System.out.println(logic.newLine);
        }}

Ниже приведен полный код: основной класс Публичный класс Main {

public static void main(String[] args) throws Exception {
    Logic act = new Logic();
    Game game = new Game();
    act.getListOfMovies();
    act.CodedLine();
    do { game.input();
    game.checkCondition();
            game.checkAnswer();
            game.checkScore();
    } while (game.lettersGuessed.length() != act.line.length() && game.score!= -10);
}}

Классовая логика

public class Logic {
static String line;
static String newLine;
public String[] listOfMovies;
public Scanner fileScanner;

public Logic() {
}

public String getListOfMovies() throws Exception {
    File fileWithMovies = new File("MoviesList.txt");//file access
    Scanner fileScanner = new Scanner(fileWithMovies);//file scan
    while (fileScanner.hasNext()) { // while there is a next line
        line = fileScanner.nextLine();
        String[] listOfMovies = new String[24];  //introduce array
        for (int i = 0; i < listOfMovies.length; i++) { //
            listOfMovies[i] = fileScanner.nextLine();
        } 
        int random = (int) (Math.random() * listOfMovies.length);  //get random number
        for (int i = 0; i < line.length(); i++) {             //get random movie
            if (Character.isLetter(line.charAt(i))) {
                line = listOfMovies[random];
                System.out.println(line);
            }
            return line;
        }
        return line;
    }return line;
}



public String CodedLine() {
    newLine = line.replaceAll("[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]", "_");
    System.out.println(newLine);
    return newLine;
}}

Класс игры

public class Game {
char answer;
Logic logic = new Logic();
String lettersGuessed = " ";
String lettersMissed = " ";
int score = 0;


public char input () {
    Scanner inputScanner = new Scanner(System.in);
    System.out.println("Type in your guess");
    answer = inputScanner.next().charAt(0);
    System.out.println("Your guess: " + answer);
    return answer;
    }
public void checkCondition (){
if (logic.line.indexOf(answer)==-1){
    System.out.println("You are wrong. The letter " + answer + " does not exist");
    lettersMissed = answer + lettersMissed;
    score = score - 1;
    System.out.println("Letters guessed: " + lettersGuessed);
    System.out.println("Letters missed: " + lettersMissed);
    System.out.println("Your score is:" + score);
}}

public void checkAnswer (){
    if (logic.line.indexOf(answer)!= -1){
    System.out.println ("You are right! The letter " + answer + " exists");
    StringBuilder guessedChar = new StringBuilder(logic.newLine);
    guessedChar.setCharAt(logic.line.indexOf(answer), answer);
    lettersGuessed = answer +lettersGuessed;
            score = score + 1;
            System.out.println("Letters guessed: " + lettersGuessed);
            System.out.println("Letters missed: " + lettersMissed);
            System.out.println("Your score is:" + score);
   logic.newLine = guessedChar.toString();
    System.out.println(logic.newLine);
        }}

public void checkScore (){
    if (score == -10) {
        System.out.println("The game is over! You lost..."); }}}

Ответы [ 2 ]

1 голос
/ 15 июня 2019
//Create list for index 
ArrayList<Integer>answerIndexList=new ArrayList<Integer>();


//get char index
for (int i=0;i<logic.line.length();i++){
    if(logic.line.charAt(i) == answer){
        answerIndexList.add(i);
     }
}


//replace index with answer
for(int i=0;i<answerIndexList.size();i++){

    guessedChar.setCharAt(answerIndexList.get(i), answer);
}

logic.newLine = guessedChar.toString();
0 голосов
/ 15 июня 2019

Не собираюсь решать это за вас, не то, для чего этот сайт, но предложения:

  1. отметьте этот метод - в основном вы указываете, где indexOf должен начать поиск. Сначала вы начинаете с 0, затем, если вы найдете результат, начинающийся с foundResultIndex + 1, поместите все в цикл и вуаля.
word: batman, guess: a

int startAt = 0;

int foundResultIndex = "batman".indexOf('a', startAt) // 1

startAt = foundResultIndex + 1;

foundResultIndex = "batman".indexOf('a', startAt) // 4

...
  1. не хранит так много состояний в ваших программах, особенно статических, как в Logic классе. Ваш getListOfMovies является идеальным примером, вы уже возвращаете результат, зачем хранить его в некоторой переменной line? Вместо этого используйте возвращенный результат.

  2. replaceAll смешно, сделайте это вместо line.replaceAll("[a-z]", "_");

...