2017-05-17 14:11:01 +02:00
using System.Collections.Generic ;
using System.Linq ;
using System.Text.RegularExpressions ;
using UnityEngine ;
using UnityEngine.UI ;
public class QuizController : MonoBehaviour {
public GameObject [ ] answers ;
public Text counterText ;
public Text scoreText ;
public Text questionText ;
public Button btnNextQuestion ;
2017-05-17 15:40:49 +02:00
private float counterValue ;
2017-05-17 14:11:01 +02:00
2017-05-17 15:40:49 +02:00
private const int numberOfAnswers = 4 ;
2017-05-17 14:11:01 +02:00
2017-05-17 15:40:49 +02:00
private const int scoreCorrectAnswer = 10 ;
private const int scoreIncorrectAnswer = - 15 ;
private const int scoreTimedOut = 0 ;
private const int counterInitialValue = 10 ;
2017-05-18 22:10:17 +03:00
private const int counterDisplayAnswersInitialValue = 3 ;
private float counterDisplayAnswersValue ;
private bool counterDisplayAnswersStarted = false ;
2017-05-17 14:11:01 +02:00
private int scoreValue = 0 ;
private int questionIdx = 0 ;
private List < int > selectedAnswers ;
List < Question > questions = new List < Question > ( ) {
2017-05-18 22:10:17 +03:00
new Question ( "1. Neki od ovih prozora imaju 2-3 puta manje toplotnih gubitaka za razliku od drugih, koji su to?" , new int [ ] { 1 , 4 } ) ,
new Question ( "2. Na jedan od načina možete uštedjeti i do 10 litara vode po osobi dnevno, uz koji predmet?" , new int [ ] { 3 , 4 } ) ,
2017-05-19 19:46:08 +03:00
new Question ( "3. Korištenjem jednog od sljedećih predmeta, u svjetlost se pretvara svega 5% uložene energije, dok se ostatak pretvara u toplotu, koji je to?" , new int [ ] { 1 } ) ,
new Question ( "4. Neki od navedenih predmeta uključeni u utičnicu, iako nisu u u funkciji, i dalje se znatno griju i troše električnu energiju." , new int [ ] { 3 } ) ,
new Question ( "5. Šta možemo ugraditi na radijatore da nam pomogne smanjiti troškove grijanja za 7-15%?" , new int [ ] { 1 , 3 } ) ,
new Question ( "6. Ako je vani temperatura 33oC, koja je optimalna temperatura u kući? " , new int [ ] { 4 } ) ,
new Question ( "7. Kakvim načinom pranja posuđa, i uz koji uređaj od navedenih, trošimo 60% manje električne energije i do 85% manje vode?" , new int [ ] { 2 , 3 } ) ,
new Question ( "8. Koji uređaj u «stand by» načinu rada troši i do 24% energije u odnosu na potrošnju energije kada je upaljen?" , new int [ ] { 4 } ) ,
new Question ( "9. Jednom godišnje stručna osoba treba provjeriti prohodnost čega? Loša prohodnost doprinosi većoj potrošnji energije za grijanje." , new int [ ] { 1 } ) ,
new Question ( "10. Uvijek odaberite program s najnižom temperaturom vode koji još uvijek obezbjeđuje dobar kvalitet pranja, za šta od navedenog? " , new int [ ] { 1 , 4 } ) ,
2017-05-18 22:10:17 +03:00
} ;
public GameObject objController ;
2017-05-17 14:11:01 +02:00
// Use this for initialization
void Start ( ) {
selectedAnswers = new List < int > ( ) ;
2017-05-17 15:40:49 +02:00
counterValue = counterInitialValue ;
2017-05-17 14:11:01 +02:00
UpdateScene ( ) ;
UpdateCounter ( ) ;
UpdateScore ( ) ;
btnNextQuestion . GetComponent < Button > ( ) . onClick . AddListener ( LoadNextQuestion ) ;
}
2017-05-18 22:10:17 +03:00
2017-05-17 14:11:01 +02:00
// Update is called once per frame
void Update ( )
{
if ( counterValue > 0 )
{
2017-05-19 19:46:08 +03:00
if ( ! counterDisplayAnswersStarted )
{
counterValue - = Time . deltaTime ;
UpdateCounter ( ) ;
}
2017-05-17 14:11:01 +02:00
}
2017-05-17 15:40:49 +02:00
else
{
LoadNextQuestion ( ) ;
}
2017-05-18 22:10:17 +03:00
if ( counterDisplayAnswersValue > 0 & & counterDisplayAnswersStarted )
counterDisplayAnswersValue - = Time . deltaTime ;
else
{
UpdateScene ( ) ;
counterDisplayAnswersStarted = false ;
}
2017-05-17 14:11:01 +02:00
if ( Input . GetMouseButtonDown ( 0 ) )
{
Ray ray = Camera . main . ScreenPointToRay ( Input . mousePosition ) ;
RaycastHit hit ;
if ( Physics . Raycast ( ray , out hit , 100 ) )
{
2017-05-19 19:46:08 +03:00
if ( counterDisplayAnswersStarted )
return ;
2017-05-17 14:11:01 +02:00
Debug . Log ( hit . transform . gameObject . name ) ;
2017-05-17 15:40:49 +02:00
int answerIdx = GetAnswerIdx ( hit . transform . gameObject . name ) - numberOfAnswers * questionIdx ;
2017-05-17 14:11:01 +02:00
if ( ! selectedAnswers . Contains ( answerIdx ) )
selectedAnswers . Add ( answerIdx ) ;
2017-05-18 22:10:17 +03:00
else
selectedAnswers . Remove ( answerIdx ) ;
2017-05-17 14:11:01 +02:00
}
}
}
void LoadNextQuestion ( )
{
2017-05-17 15:40:49 +02:00
scoreValue + = GetScore ( ) ;
UpdateScore ( ) ;
2017-05-17 14:11:01 +02:00
selectedAnswers . Clear ( ) ;
2017-05-18 22:10:17 +03:00
counterDisplayAnswersValue = counterDisplayAnswersInitialValue ;
counterDisplayAnswersStarted = true ;
2017-05-19 19:46:08 +03:00
counterValue = counterInitialValue ;
2017-05-18 22:10:17 +03:00
ShowAnswers ( ) ;
2017-05-19 19:46:08 +03:00
questionIdx = ( questionIdx + 1 ) % questions . Count ;
2017-05-17 14:11:01 +02:00
}
private void UpdateScore ( )
{
2017-05-18 10:29:14 +02:00
scoreText . text = scoreValue . ToString ( ) ;
2017-05-17 14:11:01 +02:00
}
private void UpdateCounter ( )
{
2017-05-18 10:29:14 +02:00
counterText . text = counterValue . ToString ( "f0" ) ;
2017-05-17 14:11:01 +02:00
}
2017-05-18 22:10:17 +03:00
private void ShowAnswers ( )
{
for ( int i = numberOfAnswers * questionIdx ; i < numberOfAnswers * ( questionIdx + 1 ) ; i + + )
{
MarkAnswer ( questions [ questionIdx ] . getCorrectAnswers ( ) . Contains ( i - questionIdx * numberOfAnswers + 1 ) , i ) ;
}
}
private void MarkAnswer ( bool isCorrect , int idx )
{
answers [ idx ] . GetComponent < ObjectController > ( ) . imageCorrect . enabled = isCorrect ;
answers [ idx ] . GetComponent < ObjectController > ( ) . imageIncorrect . enabled = ! isCorrect ;
}
// Update scene with new question + answers
2017-05-17 14:11:01 +02:00
private void UpdateScene ( )
{
2017-05-18 22:10:17 +03:00
RemoveMarks ( ) ;
2017-05-17 14:11:01 +02:00
// Set new question
questionText . text = questions [ questionIdx ] . getQuestionText ( ) ;
// Set right answers
for ( int i = 0 ; i < answers . Length ; i + + )
{
2017-05-17 15:40:49 +02:00
if ( i > = numberOfAnswers * questionIdx & & i < numberOfAnswers * ( questionIdx + 1 ) )
2017-05-17 14:11:01 +02:00
{
answers [ i ] . SetActive ( true ) ;
}
else
answers [ i ] . SetActive ( false ) ;
}
}
2017-05-18 22:10:17 +03:00
private void RemoveMarks ( )
{
foreach ( GameObject answer in answers )
{
answer . GetComponent < ObjectController > ( ) . imageCorrect . enabled = false ;
answer . GetComponent < ObjectController > ( ) . imageIncorrect . enabled = false ;
}
}
2017-05-19 19:46:08 +03:00
/// <summary>
/// Returns answer index (X) from answer's name (AnswerX)
/// </summary>
/// <param name="gameObjName"></param>
/// <returns></returns>
2017-05-17 14:11:01 +02:00
private int GetAnswerIdx ( string gameObjName )
{
string resultString = Regex . Match ( gameObjName , @"\d+" ) . Value ;
return System . Int32 . Parse ( resultString ) ;
}
2017-05-19 19:46:08 +03:00
/// <summary>
/// Returns score for a particular question
/// </summary>
/// <returns></returns>
2017-05-17 15:40:49 +02:00
private int GetScore ( ) {
// Didn't try
if ( selectedAnswers . Count = = 0 )
return scoreTimedOut ;
// Correct answer
2017-05-19 19:46:08 +03:00
if ( IsAnswerCorrect ( selectedAnswers , questions [ questionIdx ] . getCorrectAnswers ( ) ) )
2017-05-17 15:40:49 +02:00
return scoreCorrectAnswer ;
else
return scoreIncorrectAnswer ;
2017-05-17 14:11:01 +02:00
}
2017-05-19 19:46:08 +03:00
/// <summary>
/// Compares selected answers with correct answers
/// </summary>
/// <param name="selectedAnswers">List of selected answers</param>
/// <param name="correctAnswers">Array of correct answers</param>
/// <returns></returns>
private bool IsAnswerCorrect ( List < int > selectedAnswers , int [ ] correctAnswers )
{
HashSet < int > correctAnswersSet = new HashSet < int > ( new List < int > ( correctAnswers ) ) ;
return correctAnswersSet . SetEquals ( selectedAnswers ) ;
}
2017-05-17 14:11:01 +02:00
}