如何调整答案的位置

时间:2019-02-02 18:59:47

标签: c#

因此,我目前正在尝试创建问答游戏,以帮助我在School进行修订。它显示一个问题,您需要选择哪个按钮正确回答该问题才能获得“分数”。目前,答案始终在最左边的按钮上,我无法找到一种方法来随机化答案的位置。任何帮助,将不胜感激。 https://i.imgur.com/dtSOzGR.jpg

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        QuestionLbl.Text = GetQuestion();
        Answer1Btn.Text = GetAnswer();
        Answer2Btn.Text = GetFalse1();
        Answer3Btn.Text = GetFalse2();
    }

    public static class Globals
    {
        public static int QNum = GetRandomNumber();
        public static int FalseNum1 = GetRandomNumber();
        public static int FalseNum2 = GetRandomNumber();
    }

    private void Answer1Btn_Click(object sender, EventArgs e)
    {

    }


    private static readonly Random getrandom = new Random();


    public static int GetRandomNumber()
    {
        lock (getrandom) // synchronize
        {
            return getrandom.Next(0, 6);
        }
    }


    public static string GetQuestion()
    {
        string[] Questions = {
            "What Is The Formula For Speed?",
            "What Is The Formula For Energy Transfered?",
            "What Is The Formula For Efficiency?",
            "What Is The Formula For Work Done?",
            "What Is The Formula For Gravitational Potential Energy?",
            "What Is The Formula For Elastic Potential Energy?",
            "What Is The Formula For Kinetic Energy"
        };

        string QText = Questions[Globals.QNum];
        return (QText);
    }


    public static string GetAnswer()
    {
        string[] Answers = {
            "Distance / Time",
            "Power * Time",
            "(useful power output ÷ actual power input) × 100 %",
            "Force * Distance",
            "mass × gravitational field strength × height",
            "1/2 × spring constant × extension2",
            "1/2 × mass × speed2"

        };

        string AnswerTxt = Answers[Globals.QNum];
        return (AnswerTxt);
    }
    public static string GetFalse1()
    {
        string[] Answers = {
            "Distance / Time",
            "Power * Time",
            "(useful power output ÷ actual power input) × 100 %",
            "Force * Distance",
            "mass × gravitational field strength × height",
            "1/2 × spring constant × extension2",
            "1/2 × mass × speed2"

        };
        int FalseNum;
        if (Globals.FalseNum1 == Globals.QNum)
        {
            FalseNum = GetRandomNumber();
        }
        else
        {
            FalseNum = Globals.FalseNum1;
        }
        string FalseAnswer = Answers[FalseNum];
        return (FalseAnswer);
    }

    public static string GetFalse2()
    {
        string[] Answers = {
            "Distance / Time",
            "Power * Time",
            "(useful power output ÷ actual power input) × 100 %",
            "Force * Distance",
            "mass × gravitational field strength × height",
            "1/2 × spring constant × extension2",
            "1/2 × mass × speed2"

        };


        Validation1:
        if (Globals.FalseNum2 == Globals.QNum)
        {
            Globals.FalseNum2 = GetRandomNumber();
            goto Validation1;
        }
        else
        { }

        Validation2:
        if (Globals.FalseNum2 == Globals.FalseNum1)
        {
            Globals.FalseNum2 = GetRandomNumber();
            goto Validation2;
        }
        else
        { }

        string FalseAnswer = Answers[Globals.FalseNum2];
        return (FalseAnswer);
    }
}

3 个答案:

答案 0 :(得分:1)

如果您有按钮的引用列表,则可以随机整理该列表,然后按顺序使用列表中的引用。

因此,您需要某种方式对列表进行混排。幸运的是,我们可以找到一个快速搜索和基础上,比如说代码,一个合适的方法Randomize a List。第1步:在您的项目中添加一个新类;将其命名为“ ListShuffle”(或任何您想要的名称)。步骤2:使用此代码在它:

using System;
using System.Collections.Generic;

namespace WindowsFormsApp1
{
    static class ListShuffle
    {
        private static Random rand = new Random();

        public static void Shuffle<T>(this IList<T> list)
        {
            int n = list.Count - 1;
            while (n > 1)
            {
                int k = rand.Next(n);
                T value = list[k];
                list[k] = list[n];
                list[n] = value;
                n--;
            }
        }

    }
}

然后,在你Form1.cs中,取出在相关答案按钮和使用构造函数的代码:

private void Form1_Load(object sender, EventArgs e)
{
    var buttons = new List<Button> { Answer1Btn, Answer2Btn, Answer3Btn };
    buttons.Shuffle();
    buttons[0].Text = "A";
    buttons[1].Text = "B";
    buttons[2].Text = "C";
}

和看到字母ABC各自的形式被加载时随机分配的。

确认适用于此之后,将其调整为:

buttons[0].Text = GetAnswer();
buttons[1].Text = GetFalse1();
buttons[2].Text = GetFalse2();

(我猜测它会与你正在检查的答案的方式工作。)

答案 1 :(得分:0)

一种选择是创建答案控件的集合,创建第二个随机数,然后使用该随机数获取答案控件在集合中的索引。

在设置其他应答控制值之后,您可以使用switch语句。这是一些伪代码,可以大致了解我的意思。

var answerControls = new List<Control>{answer1Btn, answer2Btn, answer3Btn};
var answerIndex = 0;
var answerRandom = new Random();
private void setAnswer(){
  answerIndex = answerRandom.Next(0, 2);
  var correctAnswer = answerControls.ElementAt(answerIndex);
  correctAnswer.Text = //get correct answer
  switch(answerIndex){
     case 0:
      answer2Btn.Text = //get false answer
      answer3Btn.Text = //get false answer
     break;
     ....
  }
}

答案 2 :(得分:-1)

我认为这将是更好的,使用一个数据库。例如,您可以使用A表查询问题。在此表中,必须有一个名为QuestionID,QuestionText,Answer1,Answer2,Answer3,CorrectAnswer的列。所以,当你调用“GetQuestion()”获得表,写正确答案为随机排buttonLeft(名称并不重要:d),ANSWER2到buttonMiddle,ANSWER3到butonRight。另外,得到“CorrectAnswer”栏正确答案,并声明一个变量来保存它。最后,当用户点击按钮,呼叫“CheckAnswer(字符答案)”给定参数。例如:

给出的方法名称与您的方法名称不同。

char CorrAnswer = GetCorrectAnswer(int QuestionID);
public bool CheckAnswer(char answer){
  if(answer.Equals(CorrAnswer)){
    return true;
  }
  else
    return false;
}

public void GetQuestion(){

}

public void ButtonClickForAnswer1(*some arguments here :D *){
  CheckAnswer('A')
}
public void ButtonClickForAnswer2(*some arguments here :D *){
  CheckAnswer('B')
}
public void ButtonClickForAnswer3(*some arguments here :D *){
  CheckAnswer('C')
}

顺便说一句,使用Entity Framework Code-First创建数据库很容易。

喔,也使用开关情况来处理返回的变量从CheckAnswer('A/B/C');如果它是真实的,加载新问题。否则,执行MessageBox.Show("Wrong Answer!")