2017-09-22 27 views
6
public class Hangman { 

    public static void ttt(String inputWord) {       //setting up the game and declaring the secret word to be the input 
     int wordLength = inputWord.length();       //making new integer variable for length of word 
     String blanks = "";            //creating blanks string 
     for(int i = 0; i < wordLength; i++) {       //making one blank for every letter of the word 
      blanks = blanks.concat("_ "); 
     } 
     System.out.println(blanks);          //initially just to show user how many blanks/letters there are to guess 
     int points = 0;             //setting up points int, one is awarded for each correct letter 
     int counter = 0;            //setting up counter int, used to keep track of lives, reference lines 58+ 
     ArrayList<String> usedChars = new ArrayList<String>();   //creating new array to store used letters 
     ArrayList<String> allChars = new ArrayList<String>();   //creating new array to store all letters 
     for(int i = 0; i < wordLength; i++) {       //filling allChars with all the letters 
      allChars.add(inputWord.substring(i, i + 1)); 
     } 
     while(points < wordLength) {         //the entire game is run off of the points system, user needs as many points as number of letters to exit the while loop 
      Scanner reader = new Scanner(System.in);     //making scanner thing 
      System.out.println("Guess: ");        //asking user to guess a letter 
      String guess = reader.nextLine();       //string guess is set to the input 
      int checker = 0;           //setting up checker int, used to check for duplicate answers 
      for(int k = 0; k < usedChars.size(); k++) {     //for loop iterates through every item in usedChars and checks them against the user guess 
       if(!usedChars.get(k).equals(guess)) {     //if the guess is different from that used letter 
        checker = checker + 1;        //add one to the checker 
       } 
       else {}             //or else nothing happens, this probably isn't necessary 
      } 
      if(checker == usedChars.size()) {       //if statement protects the for loop inside, only runs if the checker got a point for every used letter (proving the guess was unique) 
       for(int i = 0; i < wordLength; i++) {     //for loop iterates through every letter of the secret word, checking each against the guess 
        if(guess.equals(inputWord.substring(i, i + 1))) { 
         points = points + 1;       //one point is added for every matching letter, refer back to line 20 
         System.out.println("Correct!");     //prints correct for every matching letter 
        } 
        else {}            //again this probably isn't necessary 
       } 
       usedChars.add(guess);         //after the guess is checked against the secret word, the guess is added to the used letters array 
       ArrayList<String> tempList = new ArrayList<String>(); //a temporary list is created to store the letters that haven't yet been guessed 
       for(int i = 0; i < allChars.size(); i++) {    //for loop iterates through every string in the all letters array 
        for(int k = 0; k < usedChars.size(); k++) {   //nested for loop iterates through every string in the used letters array 
         if(!allChars.get(i).equals(usedChars.get(k))) { //every string in allChars is checked against every string in usedChars 
          tempList.add(allChars.get(i));    //the temporary list is filled with the letters in allChars that were not found in usedChars 
         } 
        } 
       } 
       String inputWord2 = inputWord;         //inputWord is duplicated, the copy will be manipulated but the original is still used in the above code 
       for(int i = 0; i < tempList.size(); i++) {      //for loop iterates through every string in tempList (the list with the letters the user hasn't guessed yet) 
        inputWord2 = inputWord2.replace(tempList.get(i), "_");  //the full word has every letter it shares with tempList replaced with _ for the user to guess 
       } 
       System.out.println(inputWord2);         //the word censored for any letters not guessed yet is printed 
       System.out.println("Used letters: " + usedChars);    //the user is reminded which letters have already been used 
      } 
      else { 
       System.out.print("Sorry, that letter has already been used\n"); //if the checker didn't end up being equal to the number of items in usedChars then the guess was a repeat (found in usedChars) 
      } 
      counter = counter + 1;            //tracking lives by adding one to counter after each guess 
      if(counter == 5) {             //when the counter reaches x tries, user runs out of lives 
       points = wordLength;           //this forcibly exits the while loop by satisfying the condition of points being equal to the number of letters 
      } 
     } 
     System.out.println("The word was " + inputWord);      //prints the secret word 
     System.out.println("Game over");          //prints game over 
    } 

    public static void main(String[] args) { 
     ttt("barbarian"); 

    } 
} 

Tôi biết phải cố gắng hết sức để xem mã của mọi người, đặc biệt là của tôi. tốt nhất của tôi để bình luận ra tất cả các mã của tôi để cố gắng giải thích những gì tôi đang suy nghĩ. Các trò chơi treo cổ được khá nhiều tinh chế, và tôi chỉ cố gắng để có nó in vào chỗ trống nhưng với chữ đoán điền vào.Tôi gặp sự cố khi sử dụng chức năng thay thế cho vòng lặp và chức năng thay thế chuỗi

Vì vậy, ví dụ, từ bí mật là java

Tôi đoán j

đầu ra: j___

mã của tôi thực sự nhận được rằng đến nay, nhưng đối với bất kỳ đoán hơn đầu ra chỉ là: ______

Câu hỏi của tôi về cơ bản là làm thế nào để tôi có được điều đó để thay thế vòng lặp để thực sự tiếp tục làm việc sau lần đầu tiên?

Một lần nữa, tôi muốn cảm ơn mọi người đã trả lời trước và sau khi tôi đọc chúng vào sáng mai.

+1

OT, bạn nên viết tài liệu, nhưng không tốt nếu không đọc được. – nullpointer

+3

Bạn có một vài câu trả lời hay, vì vậy tôi không có gì để thêm ở đó, nhưng chỉ muốn nói rằng bạn đang hơi khắc nghiệt với chính mình bằng cách xin lỗi mã 'nghiệp dư' - chắc chắn, nó rõ ràng là bằng văn bản bởi một người mới lập trình, nhưng nó được định dạng tốt, bạn đã sử dụng tên biến một cách thích hợp và nó được cấu trúc một cách logic và lành mạnh. Tôi không cần phải tham khảo ý kiến ​​của bạn cả. Điều này đặt nó vào top 10% của tất cả các mã được đăng trên SO, và nhiều, tốt hơn nhiều so với rất nhiều người đăng bài ở đây và dường như được trả tiền cho những gì họ làm! – DaveyDaveDave

+1

Một vài điều nhỏ mang tính phong cách có thể hữu ích: 1 - Bạn không cần 'else {}' - nếu bạn không cần 'else' chỉ không bao gồm nó, chỉ có' if' sẽ được thực thi. 2 - Xem tài liệu cho ['ArrayList.contains()'] (https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#contains (java.lang.Object)) - bạn có thể đơn giản hóa mã của bạn một chút và loại bỏ một số vòng lặp. 3 - ditto cho ['String.contains()'] (https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#contains (java.lang.CharSequence)) – DaveyDaveDave

Trả lời

3

Bạn đang xây dựng không chính xác tempList.

Trong vòng lặp thứ hai, cho mỗi ký tự đã sử dụng, nó thêm tất cả các ký tự của allChars đến tempList không khớp với ký tự được sử dụng cụ thể này. Bên cạnh hiệu quả của việc thêm các bản sao trong các lần lặp tiếp theo của vòng lặp, điều này cũng có thể thêm các ký tự đã có trong usedChars.

Thay đổi

ArrayList<String> tempList = new ArrayList<String>(); 
for(int i = 0; i < allChars.size(); i++) {    
    for(int k = 0; k < usedChars.size(); k++) {   
     if(!allChars.get(i).equals(usedChars.get(k))) { 
      tempList.add(allChars.get(i));    
     } 
    } 
} 

để

ArrayList<String> tempList = new ArrayList<String>(); 
for(int i = 0; i < allChars.size(); i++) {    
    if (!usedChars.contains(allChars.get(i))) { 
     tempList.add(allChars.get(i));     
    } 
} 
1
ArrayList<String> tempList = new ArrayList<String>(); //a temporary list is created to store the letters that haven't yet been guessed 
      for(int i = 0; i < allChars.size(); i++) {    //for loop iterates through every string in the all letters array 
       for(int k = 0; k < usedChars.size(); k++) {   //nested for loop iterates through every string in the used letters array 
        if(!allChars.get(i).equals(usedChars.get(k))) { //every string in allChars is checked against every string in usedChars 
         tempList.add(allChars.get(i));    //the temporary list is filled with the letters in allChars that were not found in usedChars 
        } 
       } 
      } 

Vấn đề của bạn là !allChars.get(i).equals(usedChars.get(k)) sẽ luôn thêm mỗi nhân vật để tempList của bạn bởi vì mỗi lá thư được kiểm tra chống lại mọi lá thư. thử này:

ArrayList<String> tempList = new ArrayList<String>(); 
      for(int i = 0; i < allChars.size(); i++) { 
       boolean tmp = false;   
       for(int k = 0; k < usedChars.size(); k++) {   
        if(allChars.get(i).equals(usedChars.get(k))) { 
         tmp = true;    
        } 
       } 
       if(!tmp) { 
        tempList.add(allChars.get(i)); 
       } 
      } 
1

Thay thế:

ArrayList<String> tempList = new ArrayList<String>(); 
for(int i = 0; i < allChars.size(); i++) { 
    for(int k = 0; k < usedChars.size(); k++) { 
     if(!allChars.get(i).equals(usedChars.get(k))) { 
      tempList.add(allChars.get(i)); in usedChars 
     } 
    } 
} 
String inputWord2 = inputWord; 
for(int i = 0; i < tempList.size(); i++) { 
    inputWord2 = inputWord2.replace(tempList.get(i), "_"); 
} 
System.out.println(inputWord2); 

Với:

String maskedInputWord = inputWord; 
for (String s : allChars) { 
    if (!usedChars.contains(s)) { 
     maskedInputWord = maskedInputWord.replace(s, "_"); 
    } 
} 
System.out.println(maskedInputWord); 

Giống như câu trả lời khác đã nói, bạn đang xây dựng tempList không chính xác. Hóa ra bạn thậm chí không cần nó :).

Hai mẹo thưởng:

  • Đừng nhận xét mã của bạn như thế. Thực hành tốt nhất là đặt tên cho các phương thức/biến của bạn theo cách mà rõ ràng chúng là gì/không có bất kỳ nhận xét nào. Vì vậy, không có inputWord2, hãy gọi nó, ví dụ: maskedInputWord. mistakeCounter thay vì counter.
  • counter của bạn (mà tôi giả định chỉ nên tính sai lầm) cũng tăng theo dự đoán tốt. Cách nó là bây giờ, bạn không bao giờ có thể đoán một từ với 6 hoặc nhiều nhân vật độc đáo một cách chính xác.
+0

Cảm ơn tôi sẽ thay đổi tên biến như bạn đã đề xuất! – ark0n

Các vấn đề liên quan