2016-07-16 2 views
-2

저는 간단한 퀴즈 앱을 만들고 있는데 항상 다른 질문을하고 싶습니다. 그것은 귀하의 질문에서 명확하지 않다이전에 사용 된 것과 다른 난수 생성하기 C#

using UnityEngine; 
using UnityEngine.UI; 
using UnityEngine.SceneManagement; 
using System.Collections.Generic; 
using System.Linq; 

public class test : MonoBehaviour { 

public Text question; 
public Text answerA; 
public Text answerB; 
public Text answerC; 
public Text answerD; 
public Text answersInfo; 

public int themeid; 

public string[] questions; //store all questions 
public string[] choicesA; //store all choices A 
public string[] choicesB; //store all choices B 
public string[] choicesC; //store all choices C 
public string[] choicesD; //store all choices D 

public string[] right;  //store all right choices 

private int questionid; 
private int id; 
private bool checkRandom = true; 

private float totalRight; 
private float totalQuestions; 
private float average; 
private int finalNote; 

List<int> idUsed = new List<int>(); 

void Start() 
{ 
    id = Random.Range(0, 4); 
    questionid = 0; 
    totalQuestions = 5; 
    question.text = questions[id]; 
    answerA.text = choicesA[id]; 
    answerB.text = choicesB[id]; 
    answerC.text = choicesC[id]; 
    answerD.text = choicesD[id]; 

    idUsed.Add(id); 

    answersInfo.text = "Answering question " + (questionid + 1).ToString() +  " out of " + totalQuestions.ToString(); 
} 

public void response(string choice) 
{ 
    switch (choice) 
    { 
     case "A": 
      if (choicesA[id] == right[id]) 
      { 
       totalRight += 1; 

      } 
      break; 
     case "B": 
      if (choicesB[id] == right[id]) 
      { 
       totalRight += 1; 

      } 
      break; 
     case "C": 
      if (choicesC[id] == right[id]) 
      { 

       totalRight += 1; 
      } 
      break; 
     case "D": 
      if (choicesD[id] == right[id]) 
      { 

       totalRight += 1; 
      } 
      break; 
    } 

    nextQuestion(); 
} 

void nextQuestion() 
{ 
    questionid += 1; 
    if (questionid <= (totalQuestions - 1)) 
    {   
     totalQuestions = 5; 
     id = Random.Range(0, 4); 

     while(checkRandom) 
     { 
      if (idUsed.Contains(id)) 
      { 
       id = Random.Range(0, 4); 
      } 
      else 
      { 
       idUsed.Add(id); 
       checkRandom = false; 
      } 
     } 

     question.text = questions[id]; 
     answerA.text = choicesA[id]; 
     answerB.text = choicesB[id]; 
     answerC.text = choicesC[id]; 
     answerD.text = choicesD[id]; 

     answersInfo.text = "Answering question " + (questionid + 1).ToString() + " out of " + totalQuestions.ToString(); 

    } 
    else 
    { 
     average = 10 * (totalRight/totalQuestions); 
     finalNote = Mathf.RoundToInt(average); 

     if (finalNote > PlayerPrefs.GetInt("finalNote" + themeid.ToString())) 
     { 
      PlayerPrefs.SetInt("finalNote" + themeid.ToString(), finalNote); 
      PlayerPrefs.SetInt("totalRight" + themeid.ToString(), (int)totalRight); 
     } 

     PlayerPrefs.SetInt("finalTempNote" + themeid.ToString(), finalNote); 
     PlayerPrefs.SetInt("totalRight" + themeid.ToString(), (int)totalRight); 

     SceneManager.LoadScene("FinalNote"); 
    } 
} 
+2

"하지만 작동하지 않는 것 같습니다." Visual Studio에서 디버깅 해 보셨습니까? 어떤 행동이 "효과가없는 것"입니까? – PhillipH

+0

@PhillipH 나는 가지고있다. 그러나 나는 퀴즈에서 질문을하기 위해 그것을 사용하지 않는다. 나는 스스로를 반복하지 않는다. –

답변

0

무엇을 '하지 않는 것 같습니다 여기 내 코드는, 임의의 숫자에 대한 부분은 "nextQuestion()"에 있지만 제대로 작동 나던 오류는 콘솔에 나타나지 않았다 의미 "를 의미합니다. 정확히이 무엇인지에 대한보다 구체적인 설명을 제공하고 그것이 원하는 결과와 얼마나 다른지 정확하게 설명하는 것이 좋습니다.

이 우려 프로그램이 퀴즈 동안 질문을 반복 결코 당신이 기대하는 수 있습니다 날 것으로 보인다,하지만 코드를보고 말했다 당신은 때때로는 두 번 이상 같은 질문을 더 얻을 않는다 .

문제의 정확한 설명 인 경우 가장 큰 원인은 checkRandom 플래그를 true으로 다시 설정하지 않았기 때문입니다. 따라서 질문을 성공적으로 선택하면 코드는 이후에 선택한 질문에 대해 아직 확인하지 않습니다.

이 문제를 해결하는 한 가지 방법은 새로운 질문 (예 : nextQuestion() 방법)을 선택하기 바로 전에 checkRandom에서 true으로 설정하는 것입니다. 그러나 정말로, 당신은 깃발이 전혀 필요 없어야합니다. 루프의 실제 조건으로 Contains() 조건을 넣을 수 있습니다.

if (questionid <= (totalQuestions - 1)) 
{   
    totalQuestions = 5; 
    id = Random.Range(0, 4); 

    while(idUsed.Contains(id)) 
    { 
     id = Random.Range(0, 4); 
    } 
    idUsed.Add(id); 

    question.text = questions[id]; 
    answerA.text = choicesA[id]; 
    answerB.text = choicesB[id]; 
    answerC.text = choicesC[id]; 
    answerD.text = choicesD[id]; 

    answersInfo.text = "Answering question " + (questionid + 1).ToString() + " out of " + totalQuestions.ToString(); 

} 

주 : 예를 들어

  • 나는 위의 코드에서 totalQuestions 필드를 설정 할 이유가 표시되지 않습니다.
  • IMHO if (questionid < totalQuestions)if (questionid <= (totalQuestions - 1))보다 그 조건을 표현하는 더 좋은 방법입니다. 이 값이 정말 정수 나에게 보인다 때
  • 당신은 당신이 float로 선언 한 totalQuestions 포함 필드의 번호를 가지고, 즉 변수는 int 대신 float해야한다.
  • 코드 복사/붙여 넣기 습관에 빠져 있어야합니다. answersInfo.text 속성 값을 설정하는 위치와 같은 코드 요소는 해당 용도로 호출 할 수있는 도우미 메서드로 캡슐화해야합니다.
  • 상대적으로 짧은 ID 값 목록의 경우 idUsed 모음의 경우 List<int>이 좋습니다. 하지만 신속하고 효율적인 실험 결과를 원하는 곳에서는 HashSet<T> 클래스 (예 : HashSet<int>)를 유의해야합니다. 이 목록은 전체 데이터 구조를 검색해야하지만 해시 세트는 컬렉션에서 둘 이상의 위치를 ​​확인하지 않고도 즉시 포함을 결정할 수 있습니다.
  • 마지막으로, 무작위 질문 ID 값을 선택하는 데 사용하는 루프가 제대로 작동해야하지만, 그 방법은 상당히 서툴고 비효율적입니다. 더 나은 접근 방식은 ID 값이 shuffle an array이고 그 다음 순서대로 셔플 된 배열에서 ID를 선택하는 것입니다.


위의 질문을 해결하지 않는 경우, 안정적으로 자세한 그 코드가 무엇을 설명하고 당신이 대신하고 싶은와 함께 문제를 재현 좋은 Minimal, Complete, and Verifiable code example을 제공하십시오.

+0

정말 고마워요! 당신은 아마 말할 수 있듯이, 나는 이것에 대해 아주 새롭고, 경험에 의존 할 수 없기 때문에 깨끗한 슬레이트로 논리적으로 보이는 코드를 작성하는 경향이 있습니다. - 제 자신의 불만을 유감스럽게 생각합니다. 코드는 이제 각 루프마다 다른 숫자를 생성 할 수 있지만 마지막 질문에 대해 "nextQuestion()"을 실행하면 단일화가 멈 춥니 다. while 루프가 무한 루프를 시작했기 때문에 코드가 의심 스럽지만 그 방법이나 방법이 보이지 않습니다. 나는 고칠 수있다 –

+0

좋은 [mcve]가 없다면, 나는 당신의 문제가 무엇인지 확실히 말할 수 없다. 그러나 당신의 추측은있을 것 같습니다. 'totalQuestions'를 '5'로 설정했지만 네 가지 가능성 (0, 1, 2, 3)만으로 질문 ID 값을 선택합니다. 따라서'questionid' 변수의 값이 '4'가 될 때까지 이미 네 가지 값을 선택했습니다. 더 큰 범위의 임의 번호를 허용하거나 적은 수의 질문을 선택해야합니다. –

관련 문제