2012-01-25 18 views
0

クラスプロジェクトでは、Javaでハングマンゲームを作成する必要があります(これはオブジェクト指向プログラミングから始まりますので、これが慣れてきています)、クラスファイルとメインファイルがあります。誰かが、私のJavaメソッドが、私がそれを期待していることをしていない理由を助けてくれますか?

すごくうまくいっていますが、クラスファイル内のメソッドの1つでは、特定の文字をすでに推測しているかどうかをプレイヤーに伝えたいものです。

基本的に、このメソッドは推測された文字を文字配列に追加するためにforループを使用し、プレーヤーが推測するたびにその文字が存在するかどうかをチェックします(存在する場合はループから抜けます)。そうでなければ、インデックス値は0です(これは未書き込みです)、それはそのインデックス値に推測された文字を書き出します。

私はコード内で自明ではないと思う唯一のことは、プレイヤーがまだ推測をしていなければ、最初の値を推測するからです。アレイ。

何か助けていただければ幸いです。誰かが自分のコードなどを改善する方法について意見があれば、私もそれを聞いて嬉しいです。本当にありがとう。 :)

public void makeGuess(char c) { 
    boolean alreadyGuessed = false, anyMatches = false; 
    matches = 0; 
    guesses++; 
    if (guesses == 1) { 
     guessedChars[0] = c; 
    } 
    for (int i = 0; i < guessedChars.length; i++) { //it goes through it and will see that it was already guessed 
     if (guessedChars[i] == c) { 
      alreadyGuessed = true; 
      break; 
     } 
     else if (guessedChars[i] != c && guessedChars[i] == 0) { 
      guessedChars[i] = c; 
     } 
    } 

    if (alreadyGuessed == false) { 
     for (int i = 0; i < word.length; i++) { 
      if (word[i] == c) { 
       anyMatches = true; 
       matches++; 
       disguisedWord[i] = c; 
      } 
     } 
    }  
    if (anyMatches == true) { 
     System.out.println("You guessed correctly!"); 
     System.out.println("There were " + matches + " matches."); 
    } 
    else if (alreadyGuessed == true) { 
     System.out.println("You already guessed this letter, derp."); 
    } 
    else { 
     System.out.println("Sorry, that character is not in the word to be guessed."); 
     wrongGuesses++; 
    } 
//  for (int i = 0; i < guessedChars.length; i++) { 
//   System.out.print(guessedChars[i] + " "); 
//  }  
    } 

mainメソッド:推測カーディナル文字に対応するブール値またはchar配列(いずれかを使用することで推測を追跡する

import java.util.Scanner; 
class HangmanDemo { 
    public static void main(String[] args) { 
     //Object initialization 
     Scanner keyboard = new Scanner(System.in); 
     Hangman word = new Hangman("jordan"); 

     //Variable declaration 
     char letterGuess; 
     int limit; 

     //Interact with user 
     System.out.print("What would you like the limit of guesses to be: "); 
     limit = keyboard.nextInt(); 

     //BEGIN ZE GAME 
     while (word.isFound() == false && word.getWrongGuessCount() <= limit) { 
      System.out.println(); 
      System.out.print("Letter guess: "); 
      letterGuess = keyboard.next().charAt(0); 
      word.makeGuess(letterGuess); 
      System.out.println(word.getDisguisedWord()); 
     } 
     if (word.getGuessCount() == limit) { 
      System.out.println("\nSorry, too many guesses."); 
     } 
     else { 
      System.out.println("\nCongratulations! You succesfully solved the word!"); 
     } 
    } 
} 
+0

あなたの問題は何ですか?あなたはそれに近づくために何をしましたか? – Nicolas78

+1

#homeworkのような匂いがします。それのためのタグがあります。そして、私はポストのタイトルを変更する衝動を感じるが、理由は@ Nicolas78に言及している理由を考え出すのは難しい。 – Romain

+0

私が提案する最初のことは、あなたのmakeGuessメソッドをいくつかのメソッドに分割することである。別々の 'hasMadeGuess'メソッドと' makeNewGuess'メソッドを記述してみてください。私はこれがあなたが持っているものを簡単に改善し、あなたが見ている間違った振る舞いを整理するのに役立つと思います。 – Peter

答えて

2

ので、これをチェックアウト:

初めてあなたは、メソッドを呼び出して、alreadyGuessedととanyMatchesの両方が偽のままになります...それは明らかに良いではありません。

2番目:OOPは手続き型Pではありません。より具体的には、メソッドはあなたが行うのと同じくらい多くのことをするはずです。 10行以上の計画を立てるには、それを行う方法がたくさんあるはずです。それはあなたがそれをすばやく乗り越えることができない言語構造でいっぱいです。あなたのコードを分割します...より少ないローカル変数、より多くのメソッド。

希望に役立ちます。

+1

私はこれを断っただけでなく、これは非常に賢明なことです。私は非常にそれをお勧めします。 – SpartanDonut

+0

さて、私は間違いなくこのOOPのことを把握したいので、その部分を書き直します。一つの大きなものではなく、より良い、より小さな方法を実装する方法は何でしょうか? –

+0

はい。私の良い練習のアドバイス: "if"文の内側に "for"ループを先読みするたびに、bam -newメソッド。 –

0

一つの方法; = 0、Bを= 1など)。

0

私が見ている主な問題は、あなたのループロジックです。

guessedChars [0]は追加された最初のエントリと等しく、文字が推測されたかどうかを確認する前に最初のエントリを追加するため、これは常に最初になります。

if (guessedChars[i] == c) { 
     alreadyGuessed = true; 
     break; 
    } 

また、guessedChars []がどのように定義されているかは教えてください。どのようにこれを行ったかによって、ループはguessedChars.lengthから引き出され、割り当てられていない値が0であると仮定すると、全体的に問題が生じるかもしれません。私が気づく大きな事は、その手紙はまだ推測されていないと判断した。 guessedChars [i]の後の他のすべての要素も、その推測された文字に設定されます。私はおそらく別のタイプのループを使用することをお勧めします。

bool searchingForLetter = true; 
do 
{ 
    //.... Your Logic 
    //.... searchingForLetter = false when you have either found the letter 
    //.... or placed the letter in the array 
    //.... or reached the end of the array 
} while(searchingForLetter) 
0

一つの可能​​な解決策は、すべての文字が数値で表されているので、charの整数値を使用することです。 ANSI標準では、 'A'の番号65から 'Z'の90までの共通文字を知ることは有益です。 97から122まで小文字があります。

ブール値の配列25が必要です。値はすべて1文字です。

boolean[] guessedChars = new boolean[25]; 
    char[] test = "HELLO".toCharArray(); 

    for (char element : test) { 
     System.out.println(element); 
     System.out.println((int) element); 
     if (guessedChars[element - 65] == false) { 
      guessedChars[element - 65] = true; 
     } else { 
      System.out.println("You already guessed this letter, derp."); 
     } 
    } 

「こんにちは」例の文字列を使用すると、要素の整数値から66を減算する必要があり、アレイ内の正しい位置を取得するには、されています。ここでの機能性を実証するためのいくつかのコードです。値が65の 'A'はguessedChars [0]に格納されます。チェックする前に、toUpperCase()の方法で文字列を大文字に変更することができるので、ハングマンゲームの小文字にも簡単に拡張できます。

関連する問題