2013-11-25 4 views
1

я запутался о том, как получить эту программу, чтобы сделать несколько определенных вещей и вопрос для дальнейшего использования для себя:случайных чисел и несколько кнопок с #

Вопрос: Вы можете сделать, если заявления с кнопками например : если (button1 щелкают) сделать это еще если (button2 щелкают) сделать

цель моей программы, чтобы помочь изучить основные целочисленные математики и четыре секции являются сложение, вычитание, умножение, и MOD , У меня есть четыре кнопки для каждой из этих тем, а пятая кнопка для отправки ответа на вопрос, у меня есть 3 текстовых поля, первый из которых является вопросом, который представлен, второй - ответом пользователей, в-третьих, является ли ответ был правильный или нет

То, что я в настоящее время установил:

 private void button1_Click(object sender, EventArgs e) 
    { 
     Random random1 = new Random(); 
     int randomNumber1 = random1.Next(6, 11); 
     Random random2 = new Random(); 
     int randomNumber2 = random2.Next(1, 6); 
     textBox1.Text = "What is " + randomNumber1 + " + " + randomNumber2 + " ?"; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     Random random1 = new Random(); 
     int randomNumber1 = random1.Next(6, 11); 
     Random random2 = new Random(); 
     int randomNumber2 = random2.Next(1, 6); 
     textBox1.Text = "What is " + randomNumber1 + " - " + randomNumber2 + " ?"; 
    } 

    private void button3_Click(object sender, EventArgs e) 
    { 
     Random random1 = new Random(); 
     int randomNumber1 = random1.Next(6, 11); 
     Random random2 = new Random(); 
     int randomNumber2 = random2.Next(1, 6); 
     textBox1.Text = "What is " + randomNumber1 + " * " + randomNumber2 + " ?"; 
    } 

    private void button4_Click(object sender, EventArgs e) 
    { 
     Random random1 = new Random(); 
     int randomNumber1 = random1.Next(6, 11); 
     Random random2 = new Random(); 
     int randomNumber2 = random2.Next(1, 6); 
     textBox1.Text = "What is " + randomNumber1 + " % " + randomNumber2 + " ?"; 
    } 

    private void button5_Click(object sender, EventArgs e) 
    { 
     Random random1 = new Random(); 
     int randomNumber1 = random1.Next(6, 11); 
     Random random2 = new Random(); 
     int randomNumber2 = random2.Next(1, 6); 




     if (Convert.ToInt16(textBox2.Text) == (randomNumber1) + (randomNumber2)) 
      textBox3.Text = "Correct!"; 
     else if (Convert.ToInt16(textBox2.Text) == (randomNumber1) - (randomNumber2)) 
      textBox3.Text = "Correct!"; 
     else if (Convert.ToInt16(textBox2.Text) == (randomNumber1) * (randomNumber2)) 
      textBox3.Text = "Correct!"; 
     else if (Convert.ToInt16(textBox2.Text) == (randomNumber1) % (randomNumber2)) 
      textBox3.Text = "Correct!"; 
     else 
      textBox3.Text = "Incorrect!"; 



    } 
} 

}

и то, что я ищу, чтобы сделать это, если кнопка 1 нажата добавить, кнопка 2 вычитания, кнопка 3 вы умножаете, кнопку 4 вы мод, а затем в зависимости от того, какой из них был нажат, нажмите кнопку «Отправить», и он скажет вам, есть ли у вас t он правильно ответил или нет. То, что у меня сейчас есть, делает это, но если ответ будет отвечать на один из четырех типов ответов, он покажет его как правильное.

т.е.: вопрос 8 + 3 и вы поставите 5, он будет говорить правильно, потому что 8 - 3 5

+1

' вопрос 8 + 3' -> Я думал, что если пользователь ввел '5', он сказал бы« Неправильно! », потому что ответ должен быть« 11 »? –

+0

Он должен сказать, что это неправильно, но поскольку мой оператор if ошибочен, но я не знаю, как его исправить, он должен сказать неправильно, но поскольку оператор if включает в себя, если его ответ 8 - 3, который равен 5, он скажет правильно – user3029872

+0

Сторона Обратите внимание: ваше использование «Random» полностью случайное. Пожалуйста, проверьте [Генератор случайных чисел, генерирующий только одно случайное число] (http://stackoverflow.com/questions/767999/random-number-generator-only-generating-one-random-number) для правильного использования. –

ответ

0

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

Не уверен, если это ASP.NET или WinForms, но это работает что-то вдоль линий:

btn1.Click += button_Click; 
btn2.Click += button_Click; 
btn3.Click += button_Click; 

private void button_Click(object sender, EventArgs e) 
{ 
    var btn = sender as Button; 
    if (sender != null) { 
     if (btn is btn1) { 
      //do something 
     } 
     else if (btn is btn2) { 
      //do something 
     } 
     //etc 
    } 
} 

Я добавил обработчики событий декларативно, но вы можете сделать это через диалог свойств или в разметка.

0

Вы генерируете случайные (*) номера для создания вопроса и снова для его проверки. Это не имеет никакого смысла, поскольку у вас есть что-то вроде «Что такое 3 + 4», и вы сравниваете результат с 7 + 2 или другим случайным значением.

Вы должны сохранить сгенерированные значения и операцию для проверки в некоторой переменной-члене или даже проще просто сохранить ожидаемый результат.

Random random = new Random(); 
int expectedResult; 
private void button3_Click(object sender, EventArgs e) 
{ 
    int randomNumber1 = random.Next(6, 11); 
    int randomNumber2 = random.Next(1, 6); 
    textBox1.Text = "What is " + randomNumber1 + " * " + randomNumber2 + " ?"; 
    expectedResult = randomNumber1 * randomNumber2; 
} 

private void button5_Click(object sender, EventArgs e) 
{ 
    textBox3.Text = 
    int.Parse(textBox2.Text) == expectedResult ? "Correct!" : "Incorrect!"; 
} 

(*) Обратите внимание, что текущие «случайные» числа не совсем случайным образом из-за кода повторного запуска последовательности при каждом вызове - так пары чисел будут очень тесно связаны между собой. Обратите внимание, что числа, сгенерированные для выражения, скорее всего, будут отличаться от чисел, сгенерированных для проверки. Правильное использование состоит в том, чтобы иметь один единственный объект Random (потенциально один за потолок, но вам не нужно беспокоиться об этом для вашего случая).

+0

-1 Их вопрос не связан с генерацией случайных чисел (хотя я согласен, что там есть место для улучшения). – codemonkeh

+0

@codemonkeh отвечает на вопрос, а также предоставляет более элегантное решение (1+ Alexei) – Damith

+0

@codemonkeh - в то время как проблема OP не связана с тем, что случайные числа генерируются правильно или нет, это частично вызвано тем, что числа, используемые для проблемы и решение является случайным (важная часть состоит в том, что они не связаны друг с другом), можно было бы просто жестко закодировать, чтобы быть другим с тем же результатом). –

0

Я предполагаю, что вы используете приложение Windows здесь (а не в Интернете). В этом случае, почему бы вам просто не иметь переменную уровня класса для хранения последней операции (вычесть, добавить и т. Д.) И включить проверку этой переменной в условии if.

например:

public enum Operations 
{ 
    Add, 
    Subtract 
} 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Random random1 = new Random(); 
     int randomNumber1 = random1.Next(6, 11); 
     Random random2 = new Random(); 
     int randomNumber2 = random2.Next(1, 6); 
     var currentOperation = Operations.Add 
     textBox1.Text = "What is " + randomNumber1 + " + " + randomNumber2 + " ?"; 
    } 

if (Convert.ToInt16(textBox2.Text) == (randomNumber1) + (randomNumber2) && currentOperation == Operations.Add) 
      textBox3.Text = "Correct!"; 
2

Вы можете попробовать следующий код вместо этого, вы код имеет довольно много вещей, избыточных и механизм проверки, чтобы определить, если пользователь отвечает правильно это совершенно неправильно:

public enum Operation { 
    Add, 
    Subtract, 
    Divide, 
    Multiply, 
    Modulo 
} 
Random rand = new Random(); 
private decimal GenerateQuestion(Operation o){ 
    int a = rand.Next(6, 11); 
    int b = rand.Next(1, 6); 
    decimal result = 0; 
    string os = ""; 
    switch(o){ 
    case Operation.Add:   
     result = a + b; 
     os = "+"; 
     break; 
    case Operation.Subtract: 
     result = a - b; 
     os = "-"; 
     break; 
    case Operation.Multiply: 
     result = a * b; 
     os = "*"; 
     break; 
    case Operation.Divide: 
     result = (decimal)a/b; 
     os = "/"; 
     break; 
    case Operation.Modulo: 
     result = a % b; 
     os = "%"; 
     break; 
    } 
    textBox1.Text = string.Format("What is {0} {1} {2}?", a,os,b); 
    return result; 
} 
decimal result;  
private void button1_Click(object sender, EventArgs e) 
{ 
    result = GenerateQuestion(Operation.Add); 
} 
private void button2_Click(object sender, EventArgs e){ 
    result = GenerateQuestion(Operation.Subtract); 
} 
private void button3_Click(object sender, EventArgs e){ 
    result = GenerateQuestion(Operation.Multiply); 
} 
private void button4_Click(object sender, EventArgs e){ 
    result = GenerateQuestion(Operation.Modulo); 
} 
private void button5_Click(object sender, EventArgs e){ 
    decimal v; 
    if(decimal.TryParse(textBox2.Text, out v)){ 
    textBox3.Text = (v == result) ? "Correct!" : "Incorrect!"; 
    }else { 
    textBox3.Clear(); 
    MessageBox.Show("Enter a number please!"); 
    } 
} 
+1

+1. Приятное прикосновение к «TryParse». Можно использовать 'Dictionary >>', чтобы сделать 'switch' более общим, сгенерировать все обработчики в цикле, чтобы сделать код более холодным. –

+1

@AlexeiLevenkov спасибо, я знаю об использовании 'delegate', но это лучше для новичков, я думаю, даже нам не нужен каждый обработчик событий для каждой кнопки, я хотел бы сохранить его простым для OP. –