390 lines
10 KiB
C#
390 lines
10 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using TMPro;
|
|
using System.IO; // Tambahan
|
|
|
|
public class Quis : MonoBehaviour
|
|
{
|
|
public TextAsset assetSoal;
|
|
|
|
private string[] soal;
|
|
private string[,] soalBag;
|
|
int indexSoal;
|
|
int maxSoal;
|
|
bool ambilSoal;
|
|
char kunciJ;
|
|
|
|
private int[] soalAcak;
|
|
|
|
public TMP_Text txtSoal, txtOpsiA, txtOpsiB, txtOpsiC, txtOpsiD;
|
|
|
|
bool isHasil;
|
|
private float durasi;
|
|
public float durasiPenilaian;
|
|
|
|
int jwbBenar, jwbSalah;
|
|
float nilai;
|
|
|
|
public GameObject panel;
|
|
public GameObject imgPenilaian, imgHasil;
|
|
public TMP_Text txtHasil;
|
|
public TMP_Text txtPenilaian;
|
|
|
|
public AudioClip suaraBenar;
|
|
public AudioClip suaraSalah;
|
|
private AudioSource audioSource;
|
|
|
|
void Start()
|
|
{
|
|
durasi = durasiPenilaian;
|
|
soal = assetSoal.ToString().Split('#');
|
|
soalBag = new string[soal.Length, 6];
|
|
maxSoal = soal.Length;
|
|
|
|
OlahSoal();
|
|
AcakSoal();
|
|
|
|
ambilSoal = true;
|
|
TampilkanSoal();
|
|
|
|
audioSource = GetComponent<AudioSource>();
|
|
}
|
|
|
|
private void OlahSoal()
|
|
{
|
|
for (int i = 0; i < soal.Length; i++)
|
|
{
|
|
string[] tempSoal = soal[i].Split('+');
|
|
for (int j = 0; j < tempSoal.Length; j++)
|
|
{
|
|
soalBag[i, j] = tempSoal[j];
|
|
}
|
|
}
|
|
}
|
|
|
|
private void AcakSoal()
|
|
{
|
|
soalAcak = new int[maxSoal];
|
|
for (int i = 0; i < maxSoal; i++)
|
|
{
|
|
soalAcak[i] = i;
|
|
}
|
|
|
|
for (int i = 0; i < maxSoal; i++)
|
|
{
|
|
int rnd = Random.Range(i, maxSoal);
|
|
int temp = soalAcak[i];
|
|
soalAcak[i] = soalAcak[rnd];
|
|
soalAcak[rnd] = temp;
|
|
}
|
|
}
|
|
|
|
private void TampilkanSoal()
|
|
{
|
|
if (indexSoal < maxSoal && ambilSoal)
|
|
{
|
|
int currentIndex = soalAcak[indexSoal];
|
|
|
|
txtSoal.text = soalBag[currentIndex, 0];
|
|
txtOpsiA.text = soalBag[currentIndex, 1];
|
|
txtOpsiB.text = soalBag[currentIndex, 2];
|
|
txtOpsiC.text = soalBag[currentIndex, 3];
|
|
txtOpsiD.text = soalBag[currentIndex, 4];
|
|
kunciJ = soalBag[currentIndex, 5][0];
|
|
|
|
ambilSoal = false;
|
|
}
|
|
}
|
|
|
|
public void Opsi(string opsiHuruf)
|
|
{
|
|
CheckJawaban(opsiHuruf[0]);
|
|
|
|
if (indexSoal == maxSoal - 1)
|
|
{
|
|
isHasil = true;
|
|
}
|
|
else
|
|
{
|
|
indexSoal++;
|
|
ambilSoal = true;
|
|
}
|
|
|
|
panel.SetActive(true);
|
|
}
|
|
|
|
private float HitungNilai()
|
|
{
|
|
return nilai = (float)jwbBenar / maxSoal * 100;
|
|
}
|
|
|
|
private void CheckJawaban(char huruf)
|
|
{
|
|
string penilaian;
|
|
if (huruf.Equals(kunciJ))
|
|
{
|
|
penilaian = "Benar";
|
|
jwbBenar++;
|
|
txtPenilaian.color = new Color32(0x00, 0x4a, 0xab, 0xFF); // biru
|
|
|
|
if (audioSource && suaraBenar)
|
|
audioSource.PlayOneShot(suaraBenar);
|
|
}
|
|
else
|
|
{
|
|
penilaian = "Salah";
|
|
jwbSalah++;
|
|
txtPenilaian.color = new Color32(0xbf, 0x06, 0x25, 0xFF); // merah
|
|
|
|
if (audioSource && suaraSalah)
|
|
audioSource.PlayOneShot(suaraSalah);
|
|
}
|
|
|
|
txtPenilaian.text = penilaian;
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
if (panel.activeSelf)
|
|
{
|
|
durasiPenilaian -= Time.deltaTime;
|
|
|
|
if (isHasil)
|
|
{
|
|
imgPenilaian.SetActive(true);
|
|
imgHasil.SetActive(false);
|
|
|
|
if (durasiPenilaian <= 0)
|
|
{
|
|
txtHasil.text = "Nilai: " + HitungNilai() + "\n\n\n\nJumlah Benar: " + jwbBenar + "\n\nJumlah Salah: " + jwbSalah;
|
|
|
|
imgPenilaian.SetActive(false);
|
|
imgHasil.SetActive(true);
|
|
|
|
// Simpan skor ke JSON
|
|
SkorData dataSkor = new SkorData((int)HitungNilai());
|
|
List<SkorData> dataList = new List<SkorData> { dataSkor };
|
|
FileHandler.SaveToJSON(dataList, "skor.json");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
imgPenilaian.SetActive(true);
|
|
imgHasil.SetActive(false);
|
|
|
|
if (durasiPenilaian <= 0)
|
|
{
|
|
panel.SetActive(false);
|
|
durasiPenilaian = durasi;
|
|
TampilkanSoal();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using TMPro;
|
|
|
|
public class Quis : MonoBehaviour
|
|
{
|
|
public TextAsset assetSoal;
|
|
|
|
private string[] soal;
|
|
|
|
private string[,] soalBag;
|
|
|
|
int indexSoal; //menentukan indek soal yg keberapa
|
|
int maxSoal; //jumlah seluruh soal
|
|
bool ambilSoal; //mengambil soal
|
|
char kunciJ; //kunci jawaban
|
|
|
|
private int[] soalAcak; //TAMBAHAN
|
|
|
|
//KOMPONEN UI
|
|
public TMP_Text txtSoal, txtOpsiA, txtOpsiB, txtOpsiC, txtOpsiD;
|
|
|
|
bool isHasil;
|
|
private float durasi;
|
|
public float durasiPenilaian;
|
|
|
|
|
|
//NEW PART 4
|
|
int jwbBenar, jwbSalah;
|
|
float nilai;
|
|
|
|
public GameObject panel;
|
|
public GameObject imgPenilaian, imgHasil;
|
|
public TMP_Text txtHasil;
|
|
|
|
public AudioClip suaraBenar; // [TAMBAHAN] Audio saat jawaban benar=======================================================================================
|
|
public AudioClip suaraSalah; // [TAMBAHAN] Audio saat jawaban salah=======================================================================================
|
|
private AudioSource audioSource; // [TAMBAHAN] Komponen audio=============================================================================================
|
|
|
|
// Start is called once before the first execution of Update after the MonoBehaviour is created
|
|
void Start()
|
|
{
|
|
|
|
durasi = durasiPenilaian;
|
|
soal = assetSoal.ToString().Split('#');
|
|
|
|
soalBag = new string[soal.Length, 6];
|
|
|
|
maxSoal = soal.Length;
|
|
|
|
OlahSoal();
|
|
|
|
AcakSoal(); //TAMBAHAN
|
|
|
|
ambilSoal = true;
|
|
TampilkanSoal(); //agar program saat pertama kali jalan, soal pertama bisa langsung tampil
|
|
|
|
print(soalBag[1,3]);
|
|
|
|
audioSource = GetComponent<AudioSource>(); // [TAMBAHAN]=============================================================================================
|
|
}
|
|
|
|
private void OlahSoal()
|
|
{
|
|
for (int i = 0; i < soal.Length; i++)
|
|
{
|
|
string[] tempSoal = soal[i].Split('+');
|
|
for (int j = 0; j < tempSoal.Length; j++)
|
|
{
|
|
soalBag[i, j] = tempSoal[j];
|
|
continue;
|
|
}
|
|
continue;
|
|
}
|
|
}
|
|
|
|
private void AcakSoal()
|
|
{
|
|
soalAcak = new int[maxSoal];
|
|
for (int i = 0; i < maxSoal; i++)
|
|
{
|
|
soalAcak[i] = i;
|
|
}
|
|
|
|
for (int i = 0; i < maxSoal; i++)
|
|
{
|
|
int rnd = Random.Range(i, maxSoal);
|
|
int temp = soalAcak[i];
|
|
soalAcak[i] = soalAcak[rnd];
|
|
soalAcak[rnd] = temp;
|
|
}
|
|
}
|
|
|
|
private void TampilkanSoal()
|
|
{
|
|
if (indexSoal < maxSoal && ambilSoal)
|
|
{
|
|
int currentIndex = soalAcak[indexSoal];
|
|
|
|
txtSoal.text = soalBag[currentIndex, 0];
|
|
txtOpsiA.text = soalBag[currentIndex, 1];
|
|
txtOpsiB.text = soalBag[currentIndex, 2];
|
|
txtOpsiC.text = soalBag[currentIndex, 3];
|
|
txtOpsiD.text = soalBag[currentIndex, 4];
|
|
kunciJ = soalBag[currentIndex, 5][0];
|
|
|
|
ambilSoal = false;
|
|
}
|
|
}
|
|
|
|
|
|
public void Opsi(string opsiHuruf) //berfungsi saat menekan tombol UI pilihan(opsi ABCD)
|
|
{
|
|
CheckJawaban(opsiHuruf[0]);
|
|
|
|
if (indexSoal ==maxSoal - 1)
|
|
{
|
|
isHasil = true;
|
|
}
|
|
else
|
|
{
|
|
indexSoal++; //supaya index soal berubah ke soal berikutnya
|
|
ambilSoal = true;
|
|
}
|
|
|
|
panel.SetActive(true);
|
|
|
|
}
|
|
|
|
private float HitungNilai()
|
|
{
|
|
return nilai = (float)jwbBenar / maxSoal * 100;
|
|
}
|
|
|
|
public TMP_Text txtPenilaian;
|
|
private void CheckJawaban(char huruf)
|
|
{
|
|
string penilaian;
|
|
if (huruf.Equals(kunciJ))
|
|
{
|
|
penilaian = "Benar";
|
|
jwbBenar++;
|
|
txtPenilaian.color = new Color32(0x00, 0x4a, 0xab, 0xFF); // biru #004aab
|
|
|
|
// === MAIN AUDIO BENAR ======================================================================================================================
|
|
if (audioSource && suaraBenar)
|
|
audioSource.PlayOneShot(suaraBenar); // [TAMBAHAN]
|
|
}
|
|
else
|
|
{
|
|
penilaian = "Salah";
|
|
jwbSalah++;
|
|
txtPenilaian.color = new Color32(0xbf, 0x06, 0x25, 0xFF); // merah #bf0625
|
|
|
|
// === MAIN AUDIO SALAH =======================================================================================================================
|
|
if (audioSource && suaraSalah)
|
|
audioSource.PlayOneShot(suaraSalah); // [TAMBAHAN]
|
|
}
|
|
|
|
txtPenilaian.text = penilaian;
|
|
}
|
|
|
|
// Update is called once per frame
|
|
void Update()
|
|
{
|
|
if (panel.activeSelf)
|
|
{
|
|
durasiPenilaian -= Time.deltaTime;
|
|
|
|
if (isHasil)
|
|
{
|
|
imgPenilaian.SetActive(true);
|
|
imgHasil.SetActive(false);
|
|
|
|
if(durasiPenilaian <= 0)
|
|
{
|
|
txtHasil.text = "Nilai: " + HitungNilai() + "\n\n\n\nJumlah Benar: " + jwbBenar + "\n\nJumlah Salah: " + jwbSalah;
|
|
|
|
imgPenilaian.SetActive(false);
|
|
imgHasil.SetActive(true);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
imgPenilaian.SetActive(true);
|
|
imgHasil.SetActive(false);
|
|
|
|
if (durasiPenilaian <= 0)
|
|
{
|
|
panel.SetActive(false);
|
|
durasiPenilaian = durasi;
|
|
|
|
TampilkanSoal();
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
*/ |