前提・実現したいこと
下記のサイトを参考にクイズを作っています
https://moneytyping.com/archives/405
下のコードで作ってみましたがシャッフルはされますが
問題が重複してしまいます
問題がシャッフルされても重複しないようにしたいです
よろしくお願いいたします
該当のソースコード
C#
1using UnityEngine; 2using System.Collections; 3using UnityEngine.UI;//UI オブジェクトを扱う時は必須 4using System.Collections.Generic; 5using System.IO; 6using System.Linq; 7using Random = UnityEngine.Random; 8 9 10public class Question : MonoBehaviour { 11 12 public string[] questions = { 13 "問題", 14 "問題", 15 "問題", 16 "", 17 18 }; 19 public int num; 20 public string nQJ; 21 public static string answer; 22 23 24 25 //アタッチしたオブジェクトが呼ばれた時に実行される。 26 void Start () { 27 num = Random.Range(0,questions.Length); 28 nQJ = questions[num]; 29 QuestionLabelSet (); 30 AnswerLabelSet(); 31 } 32 33 private void QuestionLabelSet(){ 34 35 //特定の名前のオブジェクトを検索してアクセス 36 Text qLabel = GameObject.Find("Quiz/QuestionField").GetComponentInChildren<Text> (); 37 //データをセットすることで、既存情報を上書きできる 38 qLabel.text = nQJ; 39 } 40 private void AnswerLabelSet(){ 41 //回答文面の作成 42 string[][] array = new string[questions.Length][]; 43 //正解の選択肢は必ず一番前に持ってきます。 44 //下のアンサーで使います。 45 array[0] = new string[4]{"選択肢","選択肢","選択肢","選択肢"}; 46 array[1] = new string[4]{"選択肢","選択肢","選択肢","選択肢"}; 47 array[2] = new string[4]{"選択肢","選択肢","選択肢","選択肢"}; 48 49 50 answer = array[num][0]; 51 array[num].Shuffle(); 52 53 54 //ボタンが4つあるのでそれぞれ代入 55 for (int i=1; i<=4 ; i++){ 56 57 Text ansLabel = GameObject.Find("Quiz/AnsButton" + i).GetComponentInChildren<Text> (); 58 ansLabel.text = array[num][i-1]; 59 } 60 } 61 public static string get() 62 { 63 return answer; 64 } 65 66} 67 68 69public static class Extensions //拡張メソッド用 static クラス(名前は任意) 70{ 71 //配列の要素をシャッフルする (Fisher-Yates shuffle) 72 public static void Shuffle<T>(this T[] arr) 73 { 74 for (int i = arr.Length - 1; i > 0; i--) 75 { 76 int j = Random.Range(0, i + 1); //[0]~[i] 77 T tmp = arr[i]; //swap 78 arr[i] = arr[j]; 79 arr[j] = tmp; 80 } 81 } 82}
試したこと
「シャッフル、重複」などで検索し
https://kan-kikuchi.hatenablog.com/entry/ListExtension
を参考に下記のコードも試してみました
====================
/// <summary>
/// 重複しないように追加
/// </summary>
public static void AddToNotDuplicate<T>(this List<T> list, T t){
if(list.Contains(t)){
return;
}
list.Add (t);
}
/// <summary>
/// 重複を無くす
/// </summary>
public static void RemoveDuplicate<T>(this List<T> list){
List<T> newList = new List<T>();
foreach (T item in list) { newList.AddToNotDuplicate(item); } list = newList;
}
====================
こちらの質問の
https://teratail.com/questions/92257
も試してみましたがうまくいきませんでした
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/26 05:51
2021/02/26 05:55
2021/02/26 08:20
2021/02/26 08:23
2021/03/02 08:11