Unity實現答題系統的示例代碼

一、作品展示

1、菜單界面

(註:由於特殊原因,原圖無法展示,請諒解)

2、答題界面

(註:由於特殊原因,原圖無法展示,請諒解)

3、學習模式界面

(註:由於特殊原因,原圖無法展示,請諒解)

二、代碼展示

1、菜單頁面

三個場景跳轉按鈕

學習黨史按鈕 

using UnityEngine.SceneManagement;
using UnityEngine;
 
public class EnterStudy : MonoBehaviour
{
    public void EnterStudy_()
    {
        SceneManager.LoadScene("學習界面");
    }
}

答題測試按鈕

using UnityEngine.SceneManagement;
using UnityEngine;
 
public class EnterTest : MonoBehaviour
{
    public void EnterTest_()
    {
        SceneManager.LoadScene("example");
    }
}

退出系統按鈕

using UnityEngine;
 
public class ExitSystem : MonoBehaviour
{
    public void Quit()
    {
        Application.Quit();
    }
}

2、退出按鈕

using UnityEngine;
 
public class ExitSystem : MonoBehaviour
{
    public void Quit()
    {
        Application.Quit();
    }
}

3、學習界面代碼

代碼

using UnityEngine;
using UnityEngine.UI;
using System.IO;
using System.Text;
using System.Collections.Generic;
 
public class TXT_OPRATION : MonoBehaviour
{
    //public TextAsset textTxt;
    //讀取文檔
    string[][] ArrayX;//題目數據
    string[] lineArray;//讀取到題目數據
 
    public Text stuText;
    string[] items = new string[7]{"題號:", "題目:", "A:", "B:", "C:", "D:", "答案:" };
 
    void Start()
    {
        LoadTxt();
        //Debug.Log(textTxt.text);
    }
 
    private void LoadTxt()
    {
        string UnityPath1 = Application.dataPath + "/StreamingAssets/題目5.txt";
        string[] allLineText = File.ReadAllLines(UnityPath1);
        for (int i = 0; i < allLineText.Length; i++)
        {
            Debug.Log(allLineText.Length);
        }
        ArrayX = new string[allLineText.Length][];
        //把csv中的數據儲存在二維數組中  
        for (int i = 0; i < allLineText.Length; i++)
        {
            ArrayX[i] = allLineText[i].Split(':');
        }
        //查看保存的題目數據
        int k = 0;
        string texts = "";
        for (int i = 0; i < ArrayX.Length; i++)
        {
            //texts += "題號:";
            for (int j = 0; j < ArrayX[i].Length; j++)
            {
                //Debug.Log(ArrayX[i][j]);
                texts += items[k];
                texts += ArrayX[i][j];
                texts += '\n';
                k++;
                if (k == 7)
                {
                    k = 0;
                }
            }
        }
 
        stuText.text = texts;
 
    }
}

4、答題界面代碼

返回開始菜單按鈕

using UnityEngine.SceneManagement;
using UnityEngine;
 
public class returnMenu : MonoBehaviour
{
    public void ReturnMenu()
    {
        SceneManager.LoadScene("登錄界面");
    }
}

答題處理主代碼

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
using System.Text;
 
public class testAnswer : MonoBehaviour
{ 
    //讀取文檔
    string[][] ArrayX;//題目數據
    string[] lineArray;//讀取到題目數據
    private int topicMax = 0;//最大題數
    private List<bool> isAnserList = new List<bool>();//存放是否答過題的狀態
 
    //加載題目
    public GameObject tipsbtn;//提示按鈕
    public Text tipsText;//提示信息
    public List<Toggle> toggleList;//答題Toggle
    public Text indexText;//當前第幾題
    public Text TM_Text;//當前題目
    public List<Text> DA_TextList;//選項
    private int topicIndex = 0;//第幾題
 
    //按鈕功能及提示信息
    public Button BtnBack;//上一題
    public Button BtnNext;//下一題
    public Button BtnTip;//消息提醒
    public Button BtnJump;//跳轉題目
    public InputField jumpInput;//跳轉題目
    public Text TextAccuracy;//正確率
    private int anserint = 0;//已經答過幾題
    private int isRightNum = 0;//正確題數
 
    void Awake()
    {
        TextCsv();
        LoadAnswer();
    }
 
    void Start()
    {
        toggleList[0].onValueChanged.AddListener((isOn) => AnswerRightRrongJudgment(isOn, 0));
        toggleList[1].onValueChanged.AddListener((isOn) => AnswerRightRrongJudgment(isOn, 1));
        toggleList[2].onValueChanged.AddListener((isOn) => AnswerRightRrongJudgment(isOn, 2));
        toggleList[3].onValueChanged.AddListener((isOn) => AnswerRightRrongJudgment(isOn, 3));
 
        BtnTip.onClick.AddListener(() => Select_Answer(0));
        BtnBack.onClick.AddListener(() => Select_Answer(1));
        BtnNext.onClick.AddListener(() => Select_Answer(2));
        BtnJump.onClick.AddListener(() => Select_Answer(3));
    }
 
 
    /*****************讀取txt數據******************/
    void TextCsv()
    {
        string UnityPath1 = Application.dataPath + "/StreamingAssets/題目5.txt";
        string[] allLineText = File.ReadAllLines(UnityPath1);
        for (int i = 0; i < allLineText.Length; i++)
        {
            Debug.Log(allLineText.Length);
        }
        ArrayX = new string[allLineText.Length][];
        //把csv中的數據儲存在二維數組中  
        for (int i = 0; i < allLineText.Length; i++)
        {
            ArrayX[i] = allLineText[i].Split(':');
        }
        /*
        //查看保存的題目數據
        for (int i = 0; i < ArrayX.Length; i++)
        {
            for (int j = 0; j < ArrayX[i].Length; j++)
            {
                Debug.Log(ArrayX[i][j]);
            }
        }
        */
        //設置題目狀態
        topicMax = allLineText.Length;
        for (int x = 0; x < topicMax; x++)
        {
            isAnserList.Add(false);
        }
    }
 
    /*****************加載題目******************/
    void LoadAnswer()
    {
        for (int i = 0; i < toggleList.Count; i++)
        {
            toggleList[i].isOn = false;
        }
        for (int i = 0; i < toggleList.Count; i++)
        {
            toggleList[i].interactable = true;
        }
 
        tipsbtn.SetActive(false);
        tipsText.text = "";
 
        indexText.text = "第" + (topicIndex + 1) + "題:";//第幾題
        TM_Text.text = ArrayX[topicIndex][1];//題目
        int idx = ArrayX[topicIndex].Length - 3;//有幾個選項
        for (int x = 0; x < idx; x++)
        {
            DA_TextList[x].text = ArrayX[topicIndex][x + 2];//選項
        }
    }
 
    /*****************按鈕功能******************/
    void Select_Answer(int index)
    {
        switch (index)
        {
            case 0://提示
                int idx = ArrayX[topicIndex].Length - 1;
                int n = int.Parse(ArrayX[topicIndex][idx]);
                string nM = "";
                switch (n)
                {
                    case 1:
                        nM = "A";
                        break;
                    case 2:
                        nM = "B";
                        break;
                    case 3:
                        nM = "C";
                        break;
                    case 4:
                        nM = "D";
                        break;
                }
                tipsText.text = "<color=#FFAB08FF>" + "正確答案是:" + nM + "</color>";
                break;
            case 1://上一題
                if (topicIndex > 0)
                {
                    topicIndex--;
                    LoadAnswer();
                }
                else
                {
                    tipsText.text = "<color=#27FF02FF>" + "前面已經沒有題目瞭!" + "</color>";
                }
                break;
            case 2://下一題
                if (topicIndex < topicMax - 1)
                {
                    topicIndex++;
                    LoadAnswer();
                }
                else
                {
                    tipsText.text = "<color=#27FF02FF>" + "哎呀!已經是最後一題瞭。" + "</color>";
                }
                break;
            case 3://跳轉
                int x = int.Parse(jumpInput.text) - 1;
                if (x >= 0 && x < topicMax)
                {
                    topicIndex = x;
                    jumpInput.text = "";
                    LoadAnswer();
                }
                else
                {
                    tipsText.text = "<color=#27FF02FF>" + "不在范圍內!" + "</color>";
                }
                break;
        }
    }
 
    /*****************題目對錯判斷******************/
    void AnswerRightRrongJudgment(bool check, int index)
    {
        if (check)
        {
            //判斷題目對錯
            bool isRight;
            int idx = ArrayX[topicIndex].Length - 1;
            int n = int.Parse(ArrayX[topicIndex][idx]) - 1;
            if (n == index)
            {
                tipsText.text = "<color=#27FF02FF>" + "恭喜你,答對瞭!" + "</color>";
                isRight = true;
                tipsbtn.SetActive(true);
            }
            else
            {
                tipsText.text = "<color=#FF0020FF>" + "對不起,答錯瞭!" + "</color>";
                isRight = false;
                tipsbtn.SetActive(true);
            }
 
            //正確率計算
            if (isAnserList[topicIndex])
            {
                tipsText.text = "<color=#FF0020FF>" + "這道題已答過!" + "</color>";
            }
            else
            {
                anserint++;
                if (isRight)
                {
                    isRightNum++;
                }
                isAnserList[topicIndex] = true;
                TextAccuracy.text = "正確率:" + ((float)isRightNum / anserint * 100).ToString("f2") + "%";
            }
 
            //禁用掉選項
            for (int i = 0; i < toggleList.Count; i++)
            {
                toggleList[i].interactable = false;
            }
        }
    }
}

三、相應資源

1、txt文件格式

題號:題目:A選項:B選項:C選項:D選項:答案的序號
題號:題目:A選項:B選項:C選項:D選項:答案的序號
題號:題目:A選項:B選項:C選項:D選項:答案的序號
題號:題目:A選項:B選項:C選項:D選項:答案的序號
題號:題目:A選項:B選項:C選項:D選項:答案的序號
……
(註:最後一題的末尾不加回車,所有冒號都是英文格式)

2、如何修改題目內容

這是本系統的一大亮點,也是Unity開發的一個神奇的特性。往往我們做的程序想要修改信息都要連接雲服務器、數據庫什麼的,很少有能在本地直接修改的,並且修改完內置文件之後往往都會使程序崩潰,本系統使用的數據修改方法是將題目寫在外部文檔,使程序能夠動態讀取和修改題目信息。這種方式支持的文檔格式可以是txt、xml、json,本系統用的是最簡便的txt文本。

這是因為我們在Unity中新建一個StreamingAssets文件夾,這個文件夾中的內容可以在應用發佈時原封不動地打包進去(不會被加密和壓縮),一般用來存放二進制文件。

有瞭這個文件夾,我們就可以在打包完之後也可以進行文件中的修改(隻限制於StreamingAssets文件夾)從而實現增刪題目的功能。

唯一的限制就是添加修改題目要滿足固定格式,不然讀取會出現錯誤。

(按此路徑找到題目文件)

E:\xx學習系統5.0plus\xx學習與答題系統_Data\StreamingAssets

以上就是Unity實現答題系統的示例代碼的詳細內容,更多關於Unity答題系統的資料請關註LevelAH其它相關文章!

推薦閱讀: