2016-10-03 15 views
0

次の質問は、「10のうち10」にランダムであれば、その後始まる質問は「10のうち4」である私は、10個の質問を得たので、ゲームが開始すると、例えば、ゲームは終了する。私が欲しいのは、ランダムに10点の質問です:ユニティ3Dクイズゲームランダム質問

private int idMode; 
public Text question; 
public Text answerA; 
public Text answerB; 
public Text answerC; 
public Text answerD; 
public Text infoAnswer; 
public Text stat; 
public string[] questions;   
public string[] alternativeA; 
public string[] alternativeB; 
public string[] alternativeC; 
public string[] alternativeD; 
public string[] correct; 
private int idQuestion; 
private float points; 
private float fact; 
private float average; 
private int results; 

void Start() { 
    idMode = PlayerPrefs.GetInt ("idMode"); 
    idQuestion = 0; 
    fact = questions.Length; 
    question.text = questions [idQuestion]; 
    answerA.text = alternativeA [idQuestion]; 
    answerB.text = alternativeB [idQuestion]; 
    answerC.text = alternativeC [idQuestion]; 
    answerD.text = alternativeD [idQuestion]; 
    infoAnswer.text = (idQuestion + 1).ToString() + " of " + fact.ToString() + ""; 
} 
public void answer(string alternative) 
{ 
    if (alternative == "A") { 

     if (alternativeA [idQuestion] == correct [idQuestion]) { 

      points += 1; 

     } else { 

     } 
    } 
    if (alternative == "B") { 

     if (alternativeB [idQuestion] == correct [idQuestion]) { 

      points += 1; 
     } else { 
    } 

} 
    if (alternative == "C") { 
     if (alternativeC [idQuestion] == correct [idQuestion]) { 
      points += 1; 
     } else { 
    } 
} 

    if (alternative == "D") { 
     if (alternativeD [idQuestion] == correct [idQuestion]) { 
      points += 1; 
     } else { 
    } 
} 
    nextQuestion(); 
} 
void nextQuestion() 
{ 
    idQuestion += Random.Range(0,10); 
    if(idQuestion <= (fact-1)) 
    { 
     question.text = questions [idQuestion]; 
     answerA.text = alternativeA [idQuestion]; 
     answerB.text = alternativeB [idQuestion]; 
     answerC.text = alternativeC [idQuestion]; 
     answerD.text = alternativeD [idQuestion]; 
     stat.text = " Correct: " + points.ToString() + ""; 
     infoAnswer.text = (idQuestion + 1).ToString() + " of " + fact.ToString() + ""; 
    } 
    else 
    { 
     average = 10 * (points/fact); 
     results = Mathf.RoundToInt (average); 
     if (results > PlayerPrefs.GetInt ("results" + idMode.ToString())) { 
      PlayerPrefs.SetInt ("results" + idMode.ToString(), results); 
      PlayerPrefs.SetInt ("points" + idMode.ToString(), (int)points); 
     } 
     PlayerPrefs.SetInt ("resultsTemp" + idMode.ToString(), results); 
     PlayerPrefs.SetInt ("pointsTemp" + idMode.ToString(), (int)points); 
     Application.LoadLevel("results"); 
    } 
} 
} 

答えて

2
あなたがそれを行うたら、代わりに6

のアレイを1つ持っているので、質問し、可能な解答を表すクラスを作成し、あなたのデータ構造を変更し

あなたが質問をする前にshuffle the list新しいランダム化された順序でリストを通過するだけです。その後

[Serializeable] 
public class Question 
{ 
    public string Text; 
    public string A; 
    public string B; 
    public string C; 
    public string D; 
    public string CorrectChoice; //Holds "A", "B", "C", or "D" 
} 

public static class RandomExtensions 
{ 
    public static void Shuffle<T> (this T[] array) 
    { 
     int n = array.Length; 
     while (n > 1) 
     { 
      int k = Random.Range(0, n--); 
      T temp = array[n]; 
      array[n] = array[k]; 
      array[k] = temp; 
     } 
    } 
} 

あなたが本当にこれは私がマッピング配列の作成についてのコメントで述べた他のオプションは、あなたのデータ構造を変更しない場合は

private int idMode; 
public Text question; 
public Text answerA; 
public Text answerB; 
public Text answerC; 
public Text answerD; 
public Text infoAnswer; 
public Text stat; 
public Question[] questions; 
private int idQuestion; 
private float points; 
private float fact; 
private float average; 
private int results; 

void Start() { 
    idMode = PlayerPrefs.GetInt ("idMode"); 
    idQuestion = 0; 
    fact = questions.Length; 
    questions.Shuffle(); 
    question.text = questions[idQuestion].Text; 
    answerA.text = questions[idQuestion].A; 
    answerB.text = questions[idQuestion].B; 
    answerC.text = questions[idQuestion].C; 
    answerD.text = questions[idQuestion].D; 
    infoAnswer.text = (idQuestion + 1).ToString() + " of " + fact.ToString() + ""; 
} 
public void answer(string alternative) 
{ 
    if (alternative == questions[idQuestion].CorrectChoice) 
    { 
     points += 1; 
    } 

    nextQuestion(); 
} 
void nextQuestion() 
{ 
    idQuestion += Random.Range(0,10); 
    if(idQuestion <= (fact-1)) 
    { 
     question.text = questions[idQuestion].Text; 
     answerA.text = questions[idQuestion].A; 
     answerB.text = questions[idQuestion].B; 
     answerC.text = questions[idQuestion].C; 
     answerD.text = questions[idQuestion].D; 
     stat.text = " Correct: " + points.ToString() + ""; 
     infoAnswer.text = (idQuestion + 1).ToString() + " of " + fact.ToString() + ""; 
    } 
    else 
    { 
     average = 10 * (points/fact); 
     results = Mathf.RoundToInt (average); 
     if (results > PlayerPrefs.GetInt ("results" + idMode.ToString())) { 
      PlayerPrefs.SetInt ("results" + idMode.ToString(), results); 
      PlayerPrefs.SetInt ("points" + idMode.ToString(), (int)points); 
     } 
     PlayerPrefs.SetInt ("resultsTemp" + idMode.ToString(), results); 
     PlayerPrefs.SetInt ("pointsTemp" + idMode.ToString(), (int)points); 
     Application.LoadLevel("results"); 
    } 
} 

にコードを変更します。

private int idMode; 
public Text question; 
public Text answerA; 
public Text answerB; 
public Text answerC; 
public Text answerD; 
public Text infoAnswer; 
public Text stat; 
public string[] questions;   
public string[] alternativeA; 
public string[] alternativeB; 
public string[] alternativeC; 
public string[] alternativeD; 
public string[] correct; 
private int idQuestion; 
private float points; 
private float fact; 
private float average; 
private int results; 
private int[] questionMapper; 

void Start() { 
    idMode = PlayerPrefs.GetInt ("idMode"); 
    idQuestion = 0; 
    fact = questions.Length; 
    questionMapper = new int[questions.Count]; 
    for(int i = 0; i < questionMapper.Count; i++) 
    { 
     questionMapper[i] = i; 
    } 
    questionMapper.Shuffle(); 
    question.text = questions [questionMapper[idQuestion]]; 
    answerA.text = alternativeA [questionMapper[idQuestion]]; 
    answerB.text = alternativeB [questionMapper[idQuestion]]; 
    answerC.text = alternativeC [questionMapper[idQuestion]]; 
    answerD.text = alternativeD [questionMapper[idQuestion]]; 
    infoAnswer.text = (idQuestion + 1).ToString() + " of " + fact.ToString() + ""; 
} 

//... 

void nextQuestion() 
{ 
    idQuestion += Random.Range(0,10); 
    if(idQuestion <= (fact-1)) 
    { 
     question.text = questions [questionMapper[idQuestion]]; 
     answerA.text = alternativeA [questionMapper[idQuestion]]; 
     answerB.text = alternativeB [questionMapper[idQuestion]]; 
     answerC.text = alternativeC [questionMapper[idQuestion]]; 
     answerD.text = alternativeD [questionMapper[idQuestion]]; 
     stat.text = " Correct: " + points.ToString() + ""; 
     infoAnswer.text = (idQuestion + 1).ToString() + " of " + fact.ToString() + ""; 
    } 
    else 
    { 
     average = 10 * (points/fact); 
     results = Mathf.RoundToInt (average); 
     if (results > PlayerPrefs.GetInt ("results" + idMode.ToString())) { 
      PlayerPrefs.SetInt ("results" + idMode.ToString(), results); 
      PlayerPrefs.SetInt ("points" + idMode.ToString(), (int)points); 
     } 
     PlayerPrefs.SetInt ("resultsTemp" + idMode.ToString(), results); 
     PlayerPrefs.SetInt ("pointsTemp" + idMode.ToString(), (int)points); 
     Application.LoadLevel("results"); 
    } 
} 
+0

本当に私のデータ構造を変更する必要がありますか?他の方法はありませんか? – Magillanica

+1

他の方法もありますが、データ構造を変更するのが最も簡単な方法です。別のオプションは、 'questionMapper'と呼ばれる' int'の配列を0から数えてシャッフルすることです。次に、あなたは 'questions [questionMapper [idQuestion]]'のようなことをします。 –

+0

新しいデータ構造を試してみてください。まだテキストをエディタに置くことができます。また私の最新のアップデートを見て、私は 'Question'クラスのメンバーに' public'を置くのを忘れました。 –

関連する問題