2017-10-02 12 views
-4

空の推測をするとインデックスが範囲外になりますが、スコアラベルの更新にも問題があります。現在、更新は行われますが、フォームでは実行されません。私はまた、ユーザーがより多くのポイントを得るために有効な文字を入力保つことができないことを確認したいのですが、助けてくださいはちょうどこのように、バックのC#やプロジェクトを学ぶようになった私はC#Hangman with Bugs

namespace Guess_The_Word 
{  
    public partial class Form1 : Form 
    { 
     private int wrongGuesses = 0; 
     private int userGuesses; 
     private int score = 0; 
     private string secretWord = String.Empty; 
     private string[] words; 
     private string currentWord = string.Empty; 
     private string userGuess = string.Empty; 
     private string userInput = string.Empty; 
     private string randomInput = string.Empty; 


     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void guessBtn_Click(object sender, EventArgs e) 
     { 
      string guess = userInputBox.Text.ToString(); 
      char[] randomCharArray = currentWord.ToLowerInvariant().ToCharArray(); 
      char[] userInputArray = guess.ToLowerInvariant().ToCharArray(); 
      //Assume that userInput would never be superior than randomCharArray 
      //And contain only one char 
      for (int i = 0; i < randomCharArray.Length; i++) 
      { 
       if (userInputArray[0].Equals(randomCharArray[i])) // Here is where the error happens 
       { 
        UpdateScore(); 
       } 
      } 
      // Clean userInput in form 
      userInputBox.Text = string.Empty; 

     } 


     private void resetGamebtn_Click(object sender, EventArgs e) 
     { 
      SetUpWords();  
     } 

     private void SetUpWords() 
     { 
      string path = (@"C:\commonwords.txt"); // Save the variable path with the path to the txt file 
      words = File.ReadAllLines(path); 
      int guessIndex = (new Random()).Next(words.Length); 
      currentWord = words[guessIndex]; 
      wordlbl.Text = string.Empty; 
      for (int i = 0; i < currentWord.Length; i++) 
      { 

       wordlbl.Text += "*"; 

      } 
     } 

     private void UpdateScore() 
     { 
      scorelbl.Text = Convert.ToString(score); 
     } 

    } 
} 
+0

は、エラーを修正し、コード –

答えて

0

を学ぶのを助けるあなたがチェックしていることを確認します認識されているかどうかに関わらず、特定のインデックスにアクセスしようとする前に配列の長さ。以下の例は、ロジックに関する過度の不満ですが、前のステートメントを完全に示しています。

if (userInputArray.Length > 0 && userInputArray.Length > i) 
    if (randomCharArray.Length > 0 && randomCharArray.Length > i) 
     if (userInputArray[0].Equals(randomCharArray[i])) 
      UpdateScore(); 

private void UpdateScore() { 
    score++; 
    scorelbl.Text = Convert.ToString(score); 
} 

は私が.NET Fiddleに渡ったと配列を使用しての余分な複雑さのすべてがなくて、基本的な走行を行なったし、私はいくつかのかなり良い結果を返しますよ。以下の例のロジックはかなり基本的なものであり、現在は各文字のうちの1つのみを持つ現在の単語を処理します。 「バナナ」や「リンゴ」などの言葉で複数の文字を扱えるように、ここから拡張する必要があります。 これはあなたのプロジェクトで正しい方向に向かうことを願っています。上の答えで、インデックスにアクセスしようとする前に配列の長さを確認するために必要なことを教えてください。

using System; 
using System.Collections.Generic; 

public class Program 
{ 
    private static int score = 0; 
    private static string currentWord = string.Empty; 
    private static char userGuess = '`'; 
    private static List<char> correctLetters = new List<char>(); 

    public static void Main() 
    { 
     currentWord = "are"; 

     do { 
      Console.WriteLine("Enter a letter: "); 
      userGuess = Console.ReadLine()[0]; 
     } while (TestInput()); 

     Console.WriteLine("The word was: " + currentWord); 
     Console.ReadLine(); 
    } 

    private static bool TestInput() { 
     if (currentWord.ToLowerInvariant().Contains(userGuess.ToString().ToLowerInvariant())) { 
      correctLetters.Add(userGuess); 
      score++; 
      Console.WriteLine("Current Score: " + score); 
     } 

     if (correctLetters.Count == currentWord.Length) 
      return false; 

     return true; 
    } 
} 
+0

ニース一つの良いロジックエラーなしで入れたが、それは悲しげに、私はあなたが増加していないしているのでだろう一日中 –

+0

さて、この時にしてきたスコアを更新しませんスコア、私は私の答えを更新します。 – lxxtacoxxl

+0

ええ、インクリメントしました。申し訳ありませんが、私はコードを紛失してしまいました。何に関わらず、単語の数が同じになります。私はこれまでに問題がなかった、私はPCのクラッシュがあったし、あなたが修正を失った –