2015-04-24 2 views
0

Привет, ребята, мне нужна помощь, создающая счетчик для ввода пользователем, исходя из того, сколько времени они входят в предположение, чтобы угадать случайное число от 1 до 100. До сих пор это то, что у меня есть только вывод 1 рассчитывается и не учитывает следующий вход. Не могли бы вы рассказать мне, что я делаю неправильно?Создание счетчика для ввода пользователем C#

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace GuessingGameGUI 
{ 
    public partial class frmGuess : Form 
    { 
     public frmGuess() 
    { 
     InitializeComponent(); 
    } 

    private void frmGuess_Load(object sender, EventArgs e) 
    { 
     lblCount.Visible = true; 
     lblHowMuch.Visible = true; 

    } 

    private void btnReset_Click(object sender, EventArgs e) 
    { 
     txtGuess.Text = ""; 
     lblCount.Text = ""; 
     lblHowMuch.Text = ""; 
     this.BackColor = System.Drawing.Color.Empty; 
     txtGuess.Focus(); 
    } 

    private void btnCheck_Click(object sender, EventArgs e) 
    { 
     Random r = new Random(); 
     int target = r.Next(0, 101); 

     int userGuess = int.Parse(txtGuess.Text); 

     int guessCount = 0; 

      if (userGuess == target) 
      { 
       guessCount++; 
       this.BackColor = System.Drawing.Color.DarkOliveGreen; 
       lblHowMuch.Text = "You guess the right number " + "it took you: " + guessCount.ToString() + " guesses"; 

      } 
      else if (userGuess < target) 
      { 
       guessCount++; 
       this.BackColor = System.Drawing.Color.Yellow; 

      } 
      else if (userGuess > target) 
      { 
       guessCount++; 
       this.BackColor = System.Drawing.Color.Red; 

      } 

     lblCount.Text = "You made: " + guessCount.ToString() + " Guesses"; 

     } 
    } 
} 

ответ

1

Проблема с вашим кодом заключается в том, что вы устанавливаете счетчик ожиданий на ноль при каждом нажатии btnCheck. Вам нужно убедиться, что он сбрасывается только один раз за сеанс угадывания.

Это означает, что вам нужно переместить guessCount как переменную уровня класса и убедиться, что вы только сбросили его при первом запуске формы и всякий раз, когда нажата кнопка btnReset.

Вот как я бы реорганизовать код для достижения этой цели:

public partial class frmGuess : Form 
{ 
    public frmGuess() 
    { 
     InitializeComponent(); 
    } 

    private void frmGuess_Load(object sender, EventArgs e) 
    { 
     lblCount.Visible = true; 
     lblHowMuch.Visible = true; 
     ResetData(); 
    } 

    private void btnReset_Click(object sender, EventArgs e) 
    { 
     ResetData(); 
    } 

    private Random r = new Random(); 
    private int guessCount; 
    private int target; 

    private void ResetData() 
    { 
     guessCount = 0; 
     target = r.Next(0, 101); 
     txtGuess.Text = ""; 
     lblCount.Text = ""; 
     lblHowMuch.Text = ""; 
     this.BackColor = System.Drawing.Color.Empty; 
     txtGuess.Focus(); 
    } 

    private void btnCheck_Click(object sender, EventArgs e) 
    { 
     int userGuess = int.Parse(txtGuess.Text); 
     guessCount++; 

     if (userGuess == target) 
     { 
      this.BackColor = System.Drawing.Color.DarkOliveGreen; 
      lblHowMuch.Text = String.Format(
       "You guessed the right number it took you {0} guesses", 
       guessCount); 
     } 
     else 
     { 
      this.BackColor = userGuess < target 
       ? System.Drawing.Color.Yellow 
       : System.Drawing.Color.Red; 
     } 

     lblCount.Text = String.Format(
      "You made {0} Guesses", 
      guessCount); 
    } 
} 

Вы также заметите, что вы сброс target каждый раз, когда btnCheck был нажат. Это тоже необходимо было переместить в переменную уровня класса.

Это также хорошая привычка к тому, чтобы делать экземпляры Random переменной уровня класса, так как есть обстоятельства, при которых вы можете получить менее случайные числа, если вы этого не сделаете.

Вы заметите, что я переместил весь код сброса в новый метод ResetData, который можно вызвать как при загрузке формы, так и при нажатии btnReset.

+0

Ничего себе, спасибо, что это помогает, и теперь это работает. –

1

Это не может быть так очевидно. Почему вы устанавливаете int guessCount = 0 в btnCheck_Click? Почему вы не держите глобальный счетчик?

+0

Я вижу, что вы говорите, но как мне сохранить глобальный счетчик? –

+0

Множество вариантов. Вы можете хранить оценки пользователей во внешнем файле или базе данных. Вы можете сохранить его в памяти в форме, которая запускает frmGuess. Зависит от ваших требований. – murtazat

+0

Это не ответ на вопрос. Это больше похоже на комментарий. Пожалуйста, отредактируйте это, чтобы сделать ответ или удалить его. – Enigmativity

0

Чтобы сделать его глобальным, вынимают int guessCount = 0; из функции btnCheck_Click и поместить его в верхней части, где он появляется, как:

namespace GuessingGameGUI 
{ 

    public partial class frmGuess : Form 
    { 

    int guessCount = 0; 

Таким образом guessCount не будет постоянно сбрасывается в ноль, а затем увеличивается на единицу каждый раз, когда вы нажимаете кнопку btnCheck.

+0

Вы не можете иметь переменные в пространствах имен, только внутри классов. – Enigmativity

+0

woops, поставьте его неправильно. Я повторно отредактировал и разместил его под публичным частичным классом. Хороший улов! – SteveFerg

Смежные вопросы