资源demo下载:
若看过代码还是一知半解,或者你就是不想打代码,那就去下载demo吧,连接奉上(support:Unity3D 2017.2.0f3):下载地址

前言:
在做中国某科大的一个生物仿真实验时,校方要求随机题库,让学生做选择题,完成巩固知识。
因考虑到项目量较小,采取了文本加载的方式实现答题功能,未采取数据库的形式。

功能说明:
可随机抽选固定数量的题目,且不重复。


设置了两种题库加载方式,resources内部加载,和streamingAssets外部加载。
可上一题下一题,题目跳转。
题目回答错误时有提示按钮,点击可看正确答案。


记录每一题的已选选项,回看时若正确则提示正确,回看时若错误则提示正确选项。

计算正确率。

代码注释写的比较详细,就不一一讲解了,有问题请留言。
上代码:

/************************************************************FileName: AnswerQuestion.csAuthor:Guido Kuo       Version :1.0        Date: 2019-01-18Description:Support Unity 2017.2
************************************************************/using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;namespace Assets.Scripts
{public class AnswerQuestion : MonoBehaviour{[Header("是否随机")]public bool IsRandom;[Header("抽取题目的数量")][Range(1, 20)]public int TopicCount;/// <summary>/// 题库每行的数据/// </summary>private string[] _perLineData;/// <summary>/// 创建二维不规则数组,因选项可能3个或4个,所以创建不规则数组/// </summary>private string[][] _questionsArray;/// <summary>/// 记录题目是否已经回答/// </summary>private readonly List<bool> IsAnswer = new List<bool>();/// <summary>/// 记录选择过的序号/// </summary>private readonly List<int> SelectAnswerIndex = new List<int>();/// <summary>/// 记录选择的是否正确/// </summary>private readonly List<bool> SelectIsRight = new List<bool>();/// <summary>/// 选择键/// </summary>public List<Toggle> SelecToggles;/// <summary>/// 选项/// </summary>public List<Text> SelecAnswer;/// <summary>/// 上一题按钮/// </summary>private Button _beforeTopicBtn;/// <summary>/// 下一题按钮/// </summary>private Button _nextTopicBtn;/// <summary>/// 错误提示按钮/// </summary>private Button _tipsBtn;/// <summary>/// 正确答案提示/// </summary>private Text _tipCorrectText;/// <summary>/// 题目序号/// </summary>private Text _quesIndexText;/// <summary>/// 题目内容/// </summary>private Text _quesContent;/// <summary>/// 正确率显示/// </summary>private Text _accuracyText;/// <summary>/// 第几题/// </summary>private int _quesIndex = 0;/// <summary>/// 题目总数量/// </summary>private int _quesCount;/// <summary>/// 回答正确的数量/// </summary>private int _rightCount;/// <summary>/// 已经大回答的题目数量/// </summary>private int _answeredCount;void Awake(){_beforeTopicBtn = GameObject.Find("Canvas/BgPanel/Buttons/BeforeTopic").GetComponent<Button>();_nextTopicBtn = GameObject.Find("Canvas/BgPanel/Buttons/NextTopic").GetComponent<Button>();_tipsBtn = GameObject.Find("Canvas/BgPanel/Buttons/TipsButton").GetComponent<Button>();_tipCorrectText = GameObject.Find("Canvas/BgPanel/TipCorrectText").GetComponent<Text>();_quesIndexText = GameObject.Find("Canvas/BgPanel/QuesIndexText").GetComponent<Text>();_quesContent = GameObject.Find("Canvas/BgPanel/QuesContent").GetComponent<Text>();_accuracyText = GameObject.Find("Canvas/BgPanel/AccuracyText").GetComponent<Text>();for (int i = 0; i < 4; i++){SelecToggles.Add(GameObject.Find("Canvas/BgPanel/SelecToggles").transform.GetChild(i).GetComponent<Toggle>());SelecAnswer.Add(SelecToggles[i].transform.GetChild(1).GetComponent<Text>());}_beforeTopicBtn.gameObject.SetActive(false);if (TopicCount==1)_nextTopicBtn.gameObject.SetActive(false);}void Start(){//CsvReadQuestions();StreamingReadQuestions();_beforeTopicBtn.onClick.AddListener(BeforeTopic);_nextTopicBtn.onClick.AddListener(NextTopic);_tipsBtn.onClick.AddListener(CorrectTip);for (int i = 0; i < 4; i++){int count = i;SelecToggles[i].onValueChanged.AddListener(delegate (bool isOn){if (isOn)JudgeSelect(count);});}}/// <summary>/// 选择判断/// </summary>/// <param name="selectIndex">第几个选项</param>void JudgeSelect(int selectIndex){bool isRight = false;int selectCount = 0;for (int i = 0; i < 4; i++){if (i == selectIndex){SelecToggles[i].isOn = true;int index = _questionsArray[_quesIndex].Length - 1;//该二位数组的长度,减1获得最后一位的序号int correctIndex = int.Parse(_questionsArray[_quesIndex][index]) - 1;//ArrayX[topicIndex][idx]获取到最后一位的正确答案标识,答案序号是0123,所以减1if (i == correctIndex){if (!IsAnswer[_quesIndex])_tipCorrectText.text = "<color=green>恭喜你,回答正确!请继续答题。</color>";isRight = true;}else{if (!IsAnswer[_quesIndex])_tipCorrectText.text = "<color=red>对不起,回答错误!请重新选择或查看提示。</color>";_tipsBtn.gameObject.SetActive(true);}selectCount = i;}elseSelecToggles[i].isOn = false;//单选题}if (IsAnswer[_quesIndex]){Debug.Log("已经回答");}else{_answeredCount++;if (isRight)_rightCount++;IsAnswer[_quesIndex] = true;SelectAnswerIndex.Add(selectCount + 1);SelectIsRight.Add(isRight);_accuracyText.text = "正确率:" + ((float)_rightCount / _answeredCount * 100).ToString("f2") + "%";}}/// <summary>///  csv读取Resources内的题库/// </summary>void CsvReadQuestions(){//csv二进制读取文件TextAsset questions = Resources.Load<TextAsset>("面试题库");SaveTopicToArray(questions);}void SaveTopicToArray(TextAsset questions){//读取题库中每行的数据_perLineData = questions.text.Split("\r"[0]);Read(IsRandom);_quesCount = _questionsArray.Length - 1;for (int i = 0; i <= _quesCount; i++)IsAnswer.Add(false);//根据题目数量添加记录值TopicSet();}/// <summary>/// 外部加载读取题库/// </summary>void StreamingReadQuestions(){//数据流读取文件string questions = File.ReadAllText(Application.streamingAssetsPath + "/面试题库.txt");SaveTopicToArray(questions);}void SaveTopicToArray(string questions){//读取题库中每行的数据_perLineData = questions.Split("\r"[0]);Read(IsRandom);_quesCount = _questionsArray.Length - 1;for (int i = 0; i <= _quesCount; i++)IsAnswer.Add(false);//根据题目数量添加记录值TopicSet();}/// <summary>/// 添加、判断数据/// </summary>/// <param name="isRandom"></param>void Read(bool isRandom){if (isRandom){//确定二位数组的个数_questionsArray = new string[TopicCount][];List<int> saveRand = new List<int>();int randomNum;int num = 0;//把数据存储到二维数组中while (saveRand.Count<TopicCount){randomNum = Random.Range(0, _perLineData.Length);if (!saveRand.Contains(randomNum))//不重复的随机添加题目{saveRand.Add(randomNum);_questionsArray[num] = _perLineData[randomNum].Split("*"[0]);//题库中,用中文中的*分隔。num++;}elsecontinue;}}else{//确定二维数组的个数_questionsArray = new string[_perLineData.Length][];//把数据存储到二维数组中for (int i = 0; i < _perLineData.Length; i++)_questionsArray[i] = _perLineData[i].Split("*"[0]);//题库中,用中文中的*分隔。}}/// <summary>/// 题目设置/// </summary>void TopicSet(){_tipsBtn.gameObject.SetActive(false);//初始隐藏提示按钮,错误时显示_tipCorrectText.text = "";for (int i = 0; i < 4; i++)SelecToggles[i].isOn = false;//开始时所有的选择默认为未选_quesIndexText.text = "第" + (_quesIndex + 1) + "题:";_quesContent.text = _questionsArray[_quesIndex][1];//题目内容  序号0是题目的序号。int selectCount = _questionsArray[_quesIndex].Length - 3;//有多少选项  减去3个分别是:序号、题目、正确答案标识for (int i = 0; i < selectCount; i++){SelecToggles[i].gameObject.SetActive(true);SelecAnswer[i].text = _questionsArray[_quesIndex][i + 2];//设置题目的选项。从第三位开始}if (selectCount < SelecToggles.Count)//判断选项是否有4个,如果没有则隐藏多余的{for (int i = selectCount; i < SelecToggles.Count; i++)SelecToggles[i].gameObject.SetActive(false);}}/// <summary>/// 提示正确答案/// </summary>void CorrectTip(){_tipCorrectText.text = "正确答案是:<color=green>" + JudgeCorrectAnswer() + "</color>";}/// <summary>/// 正确答案的选项/// </summary>/// <returns></returns>string JudgeCorrectAnswer(){int index = _questionsArray[_quesIndex].Length - 1;//该二位数组的长度,减1获得最后一位的序号int correctIndex = int.Parse(_questionsArray[_quesIndex][index]);//ArrayX[topicIndex][idx]获取到最后一位的正确答案标识string correctNum = "";switch (correctIndex){case 1:correctNum = "A";break;case 2:correctNum = "B";break;case 3:correctNum = "C";break;case 4:correctNum = "D";break;}return correctNum;}/// <summary>/// 上一题/// </summary>void BeforeTopic(){if (_quesIndex > 0){_quesIndex--;TopicSet();if (IsAnswer[_quesIndex])//已经答过题{if (SelectIsRight[_quesIndex])//并且回答正确{_tipCorrectText.text = "<color=green>本题已经回答过,且回答正确,请继续答题。</color>";SelecToggles[SelectAnswerIndex[_quesIndex] - 1].isOn = true;}else{SelecToggles[SelectAnswerIndex[_quesIndex] - 1].isOn = true;_tipCorrectText.text = "本题已经回答过,<color=red>回答错误</color>,正确答案为:<color=green>" + JudgeCorrectAnswer() + "</color>";}}if (_quesIndex != _quesCount)_nextTopicBtn.gameObject.SetActive(true);if (_quesIndex==0)_beforeTopicBtn.gameObject.SetActive(false);}}/// <summary>/// 下一题/// </summary>void NextTopic(){if (_quesIndex < _quesCount){if (_quesIndex==0){_quesIndex++;TopicSet();if (IsAnswer[_quesIndex])//已经答过题{if (SelectIsRight[_quesIndex])//并且回答正确{_tipCorrectText.text = "<color=green>本题已经回答过,且回答正确,请继续答题。</color>";SelecToggles[SelectAnswerIndex[_quesIndex - 1]].isOn = true;}else{SelecToggles[SelectAnswerIndex[_quesIndex] - 1].isOn = true;_tipCorrectText.text = "本题已经回答过,<color=red>回答错误</color>,正确答案为:<color=green>" + JudgeCorrectAnswer() + "</color>";}}}else{if (IsAnswer[_quesIndex])//已经答过题{if (SelectIsRight[_quesIndex])//并且回答正确{_tipCorrectText.text = "<color=green>本题已经回答过,且回答正确,请继续答题。</color>";SelecToggles[SelectAnswerIndex[_quesIndex - 1]].isOn = true;}else{SelecToggles[SelectAnswerIndex[_quesIndex] - 1].isOn = true;_tipCorrectText.text = "本题已经回答过,<color=red>回答错误</color>,正确答案为:<color=green>" + JudgeCorrectAnswer() + "</color>";}}_quesIndex++;TopicSet();}if (_quesIndex == _quesCount)_nextTopicBtn.gameObject.SetActive(false);if (_quesIndex != 0)_beforeTopicBtn.gameObject.SetActive(true);}}}
}

Unity实现轻量化答题软件,随机题库,非SQL数据库加载形式相关推荐

  1. sql server 2008 r2卸载重装_免费下载:Intouch软件、Windows操作系统、SQL数据库,VB6.0、C#...

    为大家整理了常用的Windows操作系统和安装软件,基本上都是经过我们项目测试OK的版本,以后项目调试就齐全了,不用再"东奔西走","小鹿乱撞"了.整理不易,若 ...

  2. 【Unity使用UGUI实现王者荣耀UI界面(二)】加载页面-静音按钮和页面完善

    效果展示 文章目录 [Unity使用UGUI实现王者荣耀UI界面(二)]加载页面-静音按钮和页面完善 1. 打开项目 2. Toggle实现打开关闭音效的功能 2.1 Toggle组件演示 2.2 使 ...

  3. 【Unity使用UGUI实现王者荣耀UI界面(一)】加载页面(进度条)

    文章目录 [Unity使用UGUI实现王者荣耀UI界面(一)]加载页面(进度条) 1. 素材准备 2. 界面分析 3. 打开Unity Hub创建项目 4. 开始搭建UI 1. 准备工作 2. 背景图 ...

  4. cad模型轻量化_CAD软件发展简史

    二十世纪六十年代,交互式图形处理技术的出现和计算机图形学的发展,为CAD技术的诞生与发展奠定了基础.七十年代,开始出现工程绘图系统,CADAM系统成为鼻祖. 而1982年,AutoCAD系统的推出,无 ...

  5. vba调用mysql随机出题软件_题库需要随机进行出题

    Function 随机试题()    '产生随机数代码,40个随机数字从1-100中取 '1.声明变量 Dim dx As Integer            '随机单选题数值 Dim dxjh A ...

  6. python 题库自动答题,自动匹配题库_如何用python写一个从题库自动匹配的答题脚本_淘题吧...

    A. web数据库题目:根据用户输入的用户名和密码于数据库中的记录是否匹配制作一个用户登录模块 http://blog.csdn.net/love_leve/article/details/43226 ...

  7. 软件设计师题库2019年

    2019独角兽企业重金招聘Python工程师标准>>> 之前考软件设计师,发现很少有题库,就动手写了一个,不支持32位,第一次打开需要右键管理员运行,可以试用2016年上午和下午题库 ...

  8. 如何实现随机题库生成

    背景描述: 对于每一个不同的用户,从题库里随机抽取题目, 抽取的题目都是该用户未抽取过的,每个用户产生的考卷不相同. 解决方案: 方法一:使用bitSet保存用户历史题集 内存占用分析:百万级用户*万 ...

  9. 免费刷大学粗c语言题库的软件,51CTO题库-可以免费刷题的小程序

    51CTO题库介绍 是14年IT学习网站51CTO旗下的免费刷题小程序,是一款致力于让你快速通过考试.获取证书的免费刷题工具. 微信小程序刷题:让你利用碎片化时间学习,随时随地想刷就刷,时刻为你通过考 ...

最新文章

  1. 安卓中实现两端对齐,中间fill_parent的方法
  2. QString和string类型相互转换
  3. JavaScript事件处理的例子:事件捕捉和冒泡 - event capture and bubble
  4. 计算机部件动漫,因一个片段肝了整部番,电脑配件上榜,它满屏“虎狼之词”...
  5. python 小说爬虫_从零开始写Python爬虫 --- 1.7 爬虫实践: 排行榜小说批量下载
  6. java抛出异常thorw和throws的用法
  7. struts validator 基本知识 之 【出现错误信息的条数】。
  8. Oct.31, 2011-减肥第一天
  9. python关闭word_python自动化办公:玩转word之样式秘笈
  10. 计算机考研作息时间表,2016考研人:牛人的考研作息时间表
  11. c语言一元多项式求和
  12. 3D旋转相册(附源码+素材)
  13. CF106C Buns动态规划解决多重背包
  14. Android辅助功能之自动安装apk
  15. Activity的生命周期和启动模式
  16. C#窗体程序随电脑分辨率自动调整大小
  17. 转载:微软内部职位分类和待遇
  18. 设置MyEclipse的编辑器和控制台为护眼色
  19. EventBus的基本使用
  20. Windows下暗黑风格设置

热门文章

  1. 从0开始搭建Web自动化测试框架
  2. Springboot 序列化空对象报错解决办法
  3. 你必须知道的 10 个元宇宙最佳案例
  4. 调皮的程序员:Linux之父雕刻在Linux内核中的故事
  5. 3、频域无芯片RFID标签原理
  6. 软件开发委托(个人)协议模版
  7. QT以文本流形式读写文件操作
  8. 计算机进入桌面黑屏怎么办,老司机教你电脑进入系统后黑屏怎么办
  9. 想做刷爆TikTok的短视频?这8种特效一定要用到
  10. 一年一度的食品饮料新消费盛会,FBNB2022首届新食力大会5月开幕