2016-09-28 11 views
-2

imは再帰関数を使用している間、hangmanについてコンソールアプリケーションを作成しようとしています。私はそれがループなしで起こる方法を理解していない。私は再帰せずにそれをやったが正常に動作しますが、私は再帰的なメソッドに変更する必要があります、次のコードは私の非再帰的なコードです。Hangman recursive c#

static void Main(string[] args) 
    { 

     string HiddenWord = "csharp"; 

     //--make a dash array 
     char[] dashes = new char[HiddenWord.Length]; 

     for (int i = 0; i < dashes.Length; i++) 
     { 
      dashes[i] = '_'; 
     } 

     // --type dashes equal to array length 
     for (int i = 0; i < dashes.Length; i++) 
     { 
      Console.Write(dashes[i] + " "); 
     } 


     Console.WriteLine(); 

     int count = 0; 
     //--ask the user to guess 
     do 
     { 
      Console.WriteLine("Enter a letter"); 
      char letter = char.Parse(Console.ReadLine()); 

      for (int i = 0; i < HiddenWord.Length; i++) 
      { 
       //replace dash with letter 
       if (HiddenWord[i] == letter) 
       { 
        count++; //update the count to check when to exit 
        dashes[i] = letter; //if correct letter put dash instead of letter 

        //display again dash with letters instead 
        for (int j = 0; j < dashes.Length; j++) 
        { 
         Console.Write(dashes[j] + " "); 
        } 
       } 
      } 

      Console.WriteLine(); 
     } while (count < dashes.Length); 

     Console.ReadLine(); 
    } 
+8

なぜそれが再帰的であるべきで、あなたが再帰的にするためにどの部分たいです?ループは十分ではありませんか?何故なの? –

+0

'しかし、私はそれを再帰的なメソッドに変更する必要があります誰が言う? –

+0

おそらくエクササイズシートはこう言っています.... –

答えて

1

あなたはこれが必要ですか?

class Program 
{ 
    static string HiddenWord = ""; 
    static char[] dashes; 

    static void Main(string[] args) 
    { 
     HiddenWord = "csharp"; 
     dashes = new char[HiddenWord.Length]; 


     for (int i = 0; i < dashes.Length; i++) 
     { 
      dashes[i] = '_'; 
     } 

     // --type dashes equal to array length 
     for (int i = 0; i < dashes.Length; i++) 
     { 
      Console.Write(dashes[i] + " "); 
     } 


     Console.WriteLine(); 

     int count = 0; 
     //--ask the user to guess 
     askUserToGuess(count); 


     Console.ReadLine(); 
    } 

    private static void askUserToGuess(int count) 
    { 
     Console.WriteLine("Enter a letter"); 
     char letter = char.Parse(Console.ReadLine()); 

     for (int i = 0; i < HiddenWord.Length; i++) 
     { 
      //replace dash with letter 
      if ((HiddenWord[i] == letter) && (dashes[i] != letter)) 
      { 
       count++; //update the count to check when to exit 
       dashes[i] = letter; //if correct letter put dash instead of letter 

       //display again dash with letters instead 
       for (int j = 0; j < dashes.Length; j++) 
       { 
        Console.Write(dashes[j] + " "); 
       } 
      } 
     } 
     if (count < dashes.Length) askUserToGuess(count); 
    } 
} 

近く(HiddenWord [i]を==文字)私は別の制御(ダッシュ[I]!=文字)を追加しましたので、あなたは5times([]のチェックダッシュwithouth) "R" 文字ヒットした場合あなたが条件を必要とする再帰的な方法を停止するには

class Program 
{ 
    static string HiddenWord = ""; 
    static char[] dashes; 

    static void Main(string[] args) 
    { 
     int count = 0; 
     HiddenWord = "csharp"; 
     dashes = new char[HiddenWord.Length]; 

     recursiveSetDashes(0); 
     recursiveWriteDashes(0); 
     Console.WriteLine(); 

     askUserToGuess(count); 
     Console.ReadLine(); 
    } 

    private static void recursiveWriteDashes(int v) 
    { 
     Console.Write(dashes[v] + " "); 
     v++; if (v < dashes.Length) recursiveWriteDashes(v); 
    } 

    private static void recursiveSetDashes(int i) 
    { 
     dashes[i] = '_'; 
     i++; if (i < dashes.Length) recursiveSetDashes(i);    
    } 

    private static void askUserToGuess(int count) 
    { 
     Console.WriteLine("Enter a letter"); 
     char letter = char.Parse(Console.ReadLine()); 

     recursiveReplaceDashes(0,letter,ref count); 

     if (count < dashes.Length) askUserToGuess(count); 
    } 

    private static void recursiveReplaceDashes(int v, char letter, ref int count) 
    { 
     if ((HiddenWord[v] == letter) && (dashes[v] != letter)) 
     { 
      count++; dashes[v] = letter; 

      recursiveWriteDashes(0); 
     } 
     v++; if (v < dashes.Length) recursiveReplaceDashes(v, letter, ref count); 
    } 
} 
+0

編集していただきありがとうございます。私はここで再帰をどのように使用したかを見ていますが、私はcouldnt見つける可能性があります。それは可能だと思いますか? @GMazzacua – taysonn

+0

あなたはすべてのためにすべてを削除しますか?異なる再帰関数を使用することもできます(ただし、良い解決策ではありません)。 – GMazzacua

+0

@Rifai再帰はforループとwhileループなしで動作しますが、 'string'と' char [] 'をループするか、' Linq'メソッドを使う必要があります。しかし、必ずしも再帰的ではありません。決定的なポイントは、最後に再帰呼び出しです! –

0

:プログラムはとにかく

EDITを停止します。あなたのケースでは、あなたはすでにそれを使用します。

} while (count < dashes.Length); 

あなたが最初にまたは最後のいずれかで、あなたのメソッド内

EDITそれを構築する必要があります(私は前の編集に見て、古い例を削除しますとにかくコードが必要な場合)

C#の美しさは、時には本当に直感的です。再帰を中断する条件は、次のように定式化することができます。の場合はのダッシュが残っています。同じ名前のメソッドが存在し、変数countが廃止されました。このようにして、ユーザーが同じ文字をあまりにも頻繁に入力すると、再帰を誤って止めるのを避けることができます。ここにあなたのコードのわずかに短いバージョンです:ここでは

public static char[] recursive2(string HiddenWord, char[] dashes) 
{ 
    // do only if the are Any dashes in the array 
    if (dashes.Any(x=>x == '_')) 
    {     
     Console.WriteLine("Enter a letter"); 
     char letter = char.Parse(Console.ReadLine()); 

     for (int i = 0; i < HiddenWord.Length; i++) 
     { 
      //replace dash with letter 
      //if correct letter put dash instead of letter ELSE put old character 
      dashes[i] = HiddenWord[i] == letter ? letter : dashes[i]; 
     } 

     //display again dash with letters instead 
     Console.Write(String.Join(" ", dashes) + Environment.NewLine); 

     // here happens the recursion! call the same method with the newly 
     // changed parameters 
     return recursive2(HiddenWord, dashes); 
    } 
    else 
    { 
     return "\nCongratulations!".ToCharArray(); 
    } 
} 

は、あなたがゲームを準備し、メソッドを呼び出すことができる方法です。

static void Main(string[] args) 
{ 
    string HiddenWord = "csharp"; 

    //--make a dash array 
    char[] dashes = new String('_',HiddenWord.Length).ToCharArray(); 

    //display dash separated by spaces 
    Console.Write(String.Join(" ", dashes) + Environment.NewLine); 

    // Call the recursive method and when it breaks write "Congratulation" to the console 
    Console.WriteLine(String.Join("", recursive2(HiddenWord, dashes))); 

    Console.ReadLine(); 
} 
+0

私はそれがまだクラスで上級ではないし、私の先生はおそらく私に失敗するので、それは良いですが、高度なもので少し複雑、私はそれが簡単に必要:)。 – taysonn

+0

hehe私はそう思っていましたが、私たちは学ぶためにここにいるので、私はあなたにこのコードを与えると思いました。あなたの宿題はあなたの責任です。 ;-)他のコードは歴史の前の編集で見つけることができます。ちょうど私のポストの下に "編集xx分前"をクリックしてください –

+0

okありがとうman @Mong Zhu – taysonn