クイズアプリ/C#/Unity/問題文をシャッフルしたい
csvからデータを読み込み、csvの配列通りに問題が出題されるようになっています。
これを重複しないランダムで表示したく、調べたらたくさん出てきたのですが、一通りやってみてもできなかったので質問させていただきます。
現在のスクリプトでは何もエラーは起こっていませんが、シャッフルされず配列通り出題されています。
##やりたいこと
csvの配列を丸ごとシャッフルさせたい。
→初めは問題文だけをシャッフルするようにしましたが、答えの選択肢までシャッフルされることを懸念して、csvの横列をランダムにしたい
##やったこと
"C# 配列 シャッフル"で検索し、画像のように試しました。試した内容はかなりあるのですが、どれも記述の仕方に間違いがありできていないようです。!
/Users/mugisama/Desktop/スクリーンショット 2021-11-19 13.00.57.png
/Users/mugisama/Desktop/スクリーンショット 2021-11-19 16.26.41.png
/Users/mugisama/Desktop/スクリーンショット 2021-11-24 16.19.32.png
/Users/mugisama/Desktop/スクリーンショット 2021-11-25 10.09.39.png
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5using UnityEngine.SceneManagement; 6using System.Linq; 7using System; 8 9public class CSVScript : MonoBehaviour 10{ 11 public TextAsset CSV; 12 public Text value3, value4, value5; 13 public static int nowIndex = 1; 14 public static string CorrectAnswerText; 15 16 17 //CSVから分解した問題クラスを代入する配列 18 public Question[] questions = new Question[150]; 19 20 public static string QuestionText { get; private set; } 21 22 23 // Start is called before the first frame update 24 void Start() 25 { 26 27 //CSVを各行で区切る 28 string[] csv = CSV.text.Split('\n'); 29 Debug.Log(csv.Length); 30 31 //全ての行の数だけループする(1行目から開始) 32 for (int i = 1; i < csv.Length; i++) 33 { 34 //各行の要素を,で区切る 35 string[] values = csv[i].Split(','); 36 37 //0番目:カテゴリ 38 string category = values[0]; 39 40 //1番目:レベル 41 int level = 0; 42 if (values[1] == "初級") 43 { 44 level = 1; 45 } 46 else if (values[1] == "中級") 47 { 48 level = 2; 49 } 50 else if (values[1] == "上級") 51 { 52 level = 3; 53 } 54 55 //2番目:問題文 56 string questionText = values[2]; 57 58 //3~5番目:選択肢 配列でまとめる 59 //values[3]A values[4]B values[5] 60 string[] answers = { values[3], values[4], values[5] }; 61 62 63 //6番目:正解の配列番号 Aが0、Bが1、Cが2 64 int answerIndex = 0; 65 if (values[6] == "A") 66 { 67 answerIndex = 0; 68 } 69 else if (values[6] == "B") 70 { 71 answerIndex = 1; 72 } 73 else 74 { 75 answerIndex = 2; 76 } 77 78 79 80 //7番目:解説 81 string comment = values[7]; 82 83 Question q = new Question(category, level, questionText, answers, answerIndex, comment); 84 85 //作成したquestionクラスを配列に入れる 86 questions[i] = q; 87 88 } 89 90 //ここでシャッフル 91 System.Random rng = new System.Random(); 92 int n = csv.Length; 93 while (n > 1) 94 { 95 n--; 96 int k = rng.Next(n + 1); 97 string tmp = csv[k]; 98 csv[k] = csv[n]; 99 csv[n] = tmp; 100 } 101 102 questions[nowIndex].ShowLog(); 103 104 GetComponentInChildren<Text>().text = questions[nowIndex].question; 105 value3.text = questions[nowIndex].answers[0]; 106 value4.text = questions[nowIndex].answers[1]; 107 value5.text = questions[nowIndex].answers[2]; 108 } 109 110 111 public void OnClickAnswerButton(int answerIndex) 112 { 113 CorrectAnswerText = questions[nowIndex].GetCorrectAnswerText(); 114 115 if (questions[nowIndex].answerIndex == answerIndex) 116 { 117 SceneManager.LoadScene("correct"); 118 } 119 else 120 { 121 SceneManager.LoadScene("incorrect"); 122 } 123 124 } 125 126 127 // Update is called once per frame 128 void Update() 129 { 130 131 } 132} 133
回答1件
あなたの回答
tips
プレビュー