如何洗牌答案的位置

问题描述 投票:1回答:3

所以我目前正在试图创建一个问答游戏,以帮助我在学校的修订。它显示一个问题,你需要选择哪个按钮正确地回答这个问题,以获得“点”。目前,答案总是在最左边的按钮,我不能想出一个办法来随机化答案的位置。任何帮助,将不胜感激。 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);
    }
}
c#
3个回答
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();

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


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;
     ....
  }
}

-1
投票

我认为这将是更好的,使用一个数据库。例如,你可以有一个提问表。在这个表中必须有一个名为QuestionID,QuestionText,正确答案为,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')
}

顺便说一句,很容易与实体框架代码优先创建数据库。

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

© www.soinside.com 2019 - 2024. All rights reserved.