2013-11-25 65 views
1

我如何得到这个程序做一些特定的事情,以供将来参考了自己一个问题困惑:随机数和多键c#

问: 你如果能做到的按钮 例如报表:如果(Button1的点击) 做到这一点 否则,如果(BUTTON2点击) 做到这一点

我的计划的目标是帮助学习基本的整数数学和四节的加,减,乘,和MOD 。 我对这些主题中的每一个都有四个按钮,第五个按钮提交问题的答案,我有三个文本框,第一个是提出的问题,第二个是用户答案,第三个是答案正确或不

我目前已经建立了:

 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你mod,然后根据哪一个被点击你点击提交,它会告诉你,你是否得到了t他正确回答与否。我目前有一些这样做,但如果答案是四种问题答案中的任何一种,它就会显示它是正确的。

即:问题是8 + 3,你把5,它会说正确的,因为8 - 3是5

+1

'的问题是8 + 3' - >我想如果用户输入'5',它会说'错!',因为答案应该是'11'? –

+0

它应该说错了,但因为我的if语句有缺陷,但我不知道如何解决它,它应该说错了,但是因为if语句包括如果它的答案是8 - 3它是5,它会说正确的 – user3029872

+0

Side注意:你的“随机”使用是完全随机的。请查看[随机数生成器只生成一个随机数](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+阿列克谢) – Damith

+0

@codemonkeh - 而OP问题是不相关的,如果随机数生成是否正确,它部分是由于数字用于问题并且解决方案是随机的(重要的部分是它们彼此不相关 - 可以简单地硬编码以便与相同的结果不同)。 –

0

我假设你在这里做一个Windows应用程序(而不是Web)。在这种情况下,为什么不简单地有一个类级别的变量来存储最后一个操作(减去,添加等),并在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保持简单。 –