2016-01-21 27 views
0

大家好,Stackoverflowers。我對Java和編程相當陌生,首先這是我在StackOverflow上的第一個問題,所以請原諒我寫的任何錯誤或愚蠢的代碼。Java/javaFX Hang子手幫忙倒計時錯過嘗試

我正在用Java/JavaFX製作Hangman遊戲。 到目前爲止,我已經能夠閱讀並從文本文件中隨機選擇一個詞。用「%」替換單詞中的每個字符,然後檢查輸入的字母是否存在於隱藏的單詞中,並用正確的字母替換「%」符號。

基本上,除了計算錯誤的數量以外,基本上游戲的作用不大,當一定數量的錯誤已經讓你輸了。

所以讓我們從這裏開始: 我有一個生成了文件中的隨機字的類。 那麼這個詞被返回到另一個類替換所有charcters中

private loadWord LW = new loadWord(); 
private String unGuessedWord; 
private String correctWord; 
private StringBuffer sb; 

public String replaceWord(){ 
    correctWord = LW.readWords(); 

    char pos[] = new char[correctWord.length()]; 
    for(int i = 0; i < correctWord.length(); i++){ 
     pos[i] += '%'; 
    } 
    unGuessedWord = new String(pos); 
    return unGuessedWord; 
} 

這種方法現在已經變成在「correctWord」到「%」的每一個字母的「%」的方法。

接下來的這個方法檢查是否由玩家猜測的字母是「correctWord」,如果這是真的,顯示出正確的位置正確的字母:

public String letterMatch(char guess){ 

    sb = new StringBuffer(unGuessedWord); 

    for (int i = 0; i < correctWord.length(); i++) { 
     if(correctWord.charAt(i) == guess){ 
      sb.setCharAt(i, guess); 
     } 
    } 
    unGuessedWord = new String(sb); 
    return unGuessedWord; 
} 

它按預期工作。讓我展示了「FX」的一部分:

play.setOnAction(e->{ 
     gE = new GenerateWord(); 
     hiddenText.setText(gE.randomWord()); 
     play.setText("RESTART"); 
     guesses.clear(); 
    }); 

這是一個按鈕按下時生成並顯示「unGuessedWord」爲「%」的跡象。

playerField.setOnAction(e->{ 
     hiddenText.setText(gE.letterMatch(guessField.getText().charAt(0)).toUpperCase()); 
     } 
    }); 

「playerField」是在JavaFX正常的文本字段,用戶可以輸入文本。 「hiddentext」是一個文本這是猜測,只顯示「%」,直到正確的字母已經猜到了字。

我需要幫助是計算量是錯誤/錯誤的猜測用戶作出後例如6個錯字,遊戲結束。併爲每個錯誤畫一個「男人」的身體部分。

(我看到它在我的頭上):

int lives = 6; 
int dead = 0; 
//some code 
lives--; 
if(lives == dead); 
//end game 

我在這裏停留,我不知道該怎麼辦,什麼我嘗試的作品或沒有按預期。請幫我在這裏。 我,因爲我已經在這個問題上的任何失誤或道歉,如果我的代碼只是簡單的可怕。

+0

只要在調用'letterMatch'之前和之後檢查當前單詞是否相同,並且如果相同,則減少'lives'。 –

+0

@kinKuruna - 查看下面的答案。 – DevilsHnd

回答

0

你已經有一個方法(letterMatch()方法),它檢查提供的字符是否在正確的字中。這種方法可行,但用同樣的方法,你實際上也知道所提供的信件不起作用。您需要保留該事實,並在檢查完正確字中的所有字符後採取相應措施。

您需要假定letterMatch()方法的guess參數中提供的任何字符參數在您的方法開始時是錯誤的。要做到這一點建立一個布爾變量(我們將其命名爲:letterCorrect)並對其進行初始化爲

boolean letterCorrect = false; 

現在我們假設,不管什麼供給,這是簡直是錯的。我們需要證明它是正確的,這就是for-loop發揮作用的地方。由於for循環迭代雖然正確的單詞,並檢查所提供的角色,我們判斷如果字符是正確的,如果是,那好我們的假設是錯誤的,因此我們設定letterCorrect變量真正。我們也想中斷在我們的for循環在這個時候(更多在這之後)。因此,我們for循環應該是這樣的:

boolean letterCorrect = false; // Assume the supplied character is wrong. 
for (int i = 0; i < correctWord.length(); i++) { 
    if(correctWord.charAt(i) == guess) { 
     // The supplied character is Correct! 
     sb.setCharAt(i, guess); 
     letterCorrect = true; //change our assumption to true. 
     break; 
    } 
} 

後,我們已經與供給這是我們布爾letterCorrect變量,快告訴我們是否該字符覈對正確的單詞中的所有字符不是提供的猜測字符是正確的錯誤的。所以,我們檢查它的條件,是它真正或者是它仍然

if (!letterCorrect) { 
    lives--; 
    if(lives == dead) { 
     System.out.println("YOUR DEAD!"); 
     //end the game code or Method call here... 
    } 
} 

如果它是一個正確字符那麼,我們只是去我們的快樂方式,讓代碼在letterMatch()方法內完成。但是,如果我們最初的假設是正確的,所提供的人物的確是那麼我們的假設,就不用換了,我們的布爾letterCorrect變量仍然是,如果它那麼我們遞減我們全球申報的的整數變量爲。我們也很快檢查人的還沒有達到死亡但是如果它有我們退出遊戲。

現在,您注意到我們已經使用了break;我們的for-loop中的聲明。我們實際上需要這樣的情況下,如果有正確的單詞在該單詞中包含兩個或更多相同的字符。例如,取字,如果用戶提供的字符「ö」,這是一個正確的字符,所述letterMatch()方法將字(LOO內同時處理ö的)在對該方法的單個調用中,這將是對第四個字符可能是什麼的放棄。通過放置休息;語句for循環我們確保用戶必須提供正確單詞的每個字符,而不管該正確單詞中有多少個相同的字符。

下面是完整的letterMatch()方法可能是:

public String letterMatch(char guess){ 
    sb = new StringBuffer(unGuessedWord); 
    boolean letterCorrect = false; 
    for (int i = 0; i < correctWord.length(); i++) { 
     if(correctWord.charAt(i) == guess){ 
      sb.setCharAt(i, guess); 
      letterCorrect= true; 
      break; 
     } 
    } 
    if (!letterCorrect) { 
     lives--; 
     if(lives == dead) { 
      System.out.println("YOUR DEAD!"); 
      //end the game code or method call here... 
     } 
    } 
    unGuessedWord = new String(sb); 
    return unGuessedWord; 
} 

作爲一個側面說明,你可能想也想借此上&下字母的大小寫照顧。

+0

謝謝你想幫忙!我試過你的附加代碼,我添加了布爾和if語句來減少生命。它的工作方式是每次減少1點生命,但不幸的是,即使輸入了正確的字母,它也會這樣做。不僅在輸入錯誤的字母時。 – kinKuruna

+0

然後你一定沒有放置:letterCorrect = true;放入for循環中包含的if-then語句中。 – DevilsHnd

+0

無論是否提供給letterMatch()方法的字符都不符合if-then條件。 – DevilsHnd

1

JavaFX提供了observable properties and collections以及相關聯的綁定API,用於管理在JavaFX UI中呈現的數據。所以,儘管你可以使用你有的代碼來使你的遊戲工作,但更習慣的方法是使用這些類來創建代表遊戲狀態的「模型」類。

所以,你可能會認爲寫這樣的一類:

public class HangmanGameState { 

    private final StringProperty word = new SimpleStringProperty(); 

    public StringProperty wordProperty() { 
     return word ; 
    } 

    public final String getWord() { 
     return wordProperty().get(); 
    } 

    public final void setWord(String word) { 
     wordProperty().set(word); 
    } 

    private final ObservableList<Character> guesses = FXCollections.observableArrayList(); 

    public ObservableList<Character> getGuesses() { 
     return guesses ; 
    } 


    // this value determined by wordProperty() and guesses, 
    // so we make it "read only": 
    private final ReadOnlyIntegerWrapper wrongGuesses = new ReadOnlyIntegerWrapper(); 

    public final ReadOnlyIntegerProperty wrongGuessesProperty() { 
     return wrongGuesses.getReadOnlyProperty(); 
    } 

    public final int getWrongGuesses() { 
     return wrongGuessesProperty().get(); 
    } 

    public HangmanGameState() { 

     // bind wrong guesses to other object state: 
     wrongGuesses.bind(Bindings.createIntegerBinding(() -> 
      (int) guesses.stream() 
       .map(c -> c.toString()) 
       .filter(word.get::contains) 
       .count(), 
      guesses, word); 

    } 

    public void restartGame(String newWord) { 
     guesses.clear(); 
     word.set(newWord); 
    } 
} 

(作爲「讀者演習」,你可以創建這勢必wordguesses一個ReadOnlyBooleanWrapper wordGuessed

現在你的UI你這樣做:

HangmanGameState game = new HangmanGameState(); 
Label wordLabel = new Label(); 

wordLabel.textProperty().bind(Bindings.createStringBinding(() -> { 
    StringBuilder text = new StringBuilder(); 
    for (char c : game.getWord().toCharArray()) { 
     if (game.getGuesses().contains(new Character(c))) { 
      text.append(c) ; 
     } else { 
      text.append('%'); 
     } 
    } 
    return text.toString(); 
}, game.wordProperty(), game.getGuesses()); 

TextField guessField = new TextField(); 
guessField.setOnAction(e -> { 
    if (guessField.getText().length > 0) { 
     game.getGuesses().add(guessField.getText().charAt(0)); 
    } 
}); 



IntegerProperty livesRemaining = new SimpleIntegerProperty(); 
final int totalLives = 6 ; 
livesRemaining.bind(games.wrongGuessesProperty().multiply(-1).add(totalLives)); 

Label livesRemainingLabel = new Label(); 
livesRemainingLabel.textProperty().bind(livesRemaining.asString("Lives Remaining: %d")); 
livesRemaining.addListener((obs, oldValue, newValue) -. { 
    if (newValue.intValue() <= 0) { 
     // show "You lose, play again?" alert... 
    } 
}); 

剛鍵入的,所以有可能是拼寫錯誤等,但它應該給你的如何的想法旨在用JavaFX構建。

+0

正如我在問題開始時寫到的,我對編程和Java很陌生,所以我覺得你的代碼對於我來說太高級了,但我一定會試用它! 但讓我們想象我們用我不那麼好的FX課來解決它。你會怎麼做呢?我的「guessField.setOnAction」中的if-else會以某種方式檢查字母是對還是錯? 我道歉,如果我看起來很愚蠢,不理解,我只是想學習。 – kinKuruna

+0

當然,其他答案已經給你了嗎? –

+0

這個想法的完整例子[here](https://gist.github.com/james-d/7a188f0ce19c5febf3a3);您可以複製,粘貼和播放代碼,以便了解它的工作原理。 –