Tutorial: Menambahkan timer ke aplikasi WinForms kuis matematika
Dalam rangkaian empat tutorial ini, Anda akan membangun kuis matematika. Kuis berisi empat masalah matematika acak yang coba dijawab oleh peserta kuis dalam waktu tertentu.
Kuis menggunakan kontrol Timer. Kode di balik kontrol ini melacak waktu yang berlalu dan memeriksa jawaban peserta kuis.
Di tutorial ketiga ini, Anda akan mempelajari cara:
- Menambahkan kontrol Timer.
- Menambahkan penanganan aktivitas untuk timer.
- Menuilis kode untuk memeriksa jawaban pengguna, menampilkan pesan, dan mengisi jawaban yang benar.
Prasyarat
Tutorial ini di-build pada tutorial sebelumnya, dimulai dengan Membuat aplikasi WinForms kuis matematika. Jika Anda belum menyelesaikan tutorial tersebut, lakukan terlebih dahulu.
Tambahkan timer hitung mundur
Untuk melacak waktu selama kuis, Anda menggunakan komponen timer. Anda juga memerlukan variabel untuk menyimpan jumlah waktu yang tersisa.
Tambahkan variabel bilangan bulat yang dinamai timeLeft dengan cara yang sama seperti Anda mendeklarasikan variabel dalam tutorial sebelumnya. Letakkan deklarasi timeLeft tepat setelah deklarasi lainnya. Kode Anda akan terlihat seperti ini sampel berikut.
public partial class Form1 : Form { // Create a Random object called randomizer // to generate random numbers. Random randomizer = new Random(); // These integer variables store the numbers // for the addition problem. int addend1; int addend2; // These integer variables store the numbers // for the subtraction problem. int minuend; int subtrahend; // These integer variables store the numbers // for the multiplication problem. int multiplicand; int multiplier; // These integer variables store the numbers // for the division problem. int dividend; int divisor; // This integer variable keeps track of the // remaining time. int timeLeft;
Penting
Gunakan kontrol bahasa pemrogram di kanan atas halaman ini untuk melihat cuplikan kode C# atau cuplikan kode Visual Basic.
Di Perancang Formulir Windows, pindahkan Timer kontrol dari kategori KomponenKotak Alat ke formulir Anda. Kontrol muncul di area abu-abu di bagian bawah jendela desain.
Pada formulir, pilih ikon timer1 yang baru saja Anda tambahkan, dan atur properti Interval-nya ke 1000. Karena interval ini dalam milidetik, nilai 1000 menyebabkan timer menaikkan Tick peristiwa setiap detik.
Periksa jawabannya
Karena timer menaikkan peristiwa Tick setiap detik, masuk akal untuk memeriksa waktu yang berlalu dalam penanganan aktivitas Tick. Ini juga praktis untuk memeriksa jawaban dalam penanganan aktivitas tersebut. Jika waktu telah habis, atau jika jawabannya benar, kuis akan berakhir.
Sebelum Anda menulis penanganan aktivitas tersebut, tambahkan metode yang dipanggil CheckTheAnswer()
untuk menentukan apakah jawaban atas masalah matematika sudah benar. Metode ini harus sejalan dengan metode lain, seperti StartTheQuiz()
. Kode Anda akan terlihat seperti ini sampel berikut.
/// <summary>
/// Check the answers to see if the user got everything right.
/// </summary>
/// <returns>True if the answer's correct, false otherwise.</returns>
private bool CheckTheAnswer()
{
if ((addend1 + addend2 == sum.Value)
&& (minuend - subtrahend == difference.Value)
&& (multiplicand * multiplier == product.Value)
&& (dividend / divisor == quotient.Value))
return true;
else
return false;
}
Metode ini menentukan jawaban atas masalah matematika dan membandingkan hasilnya dengan nilai dalam kontrol NumericUpDown. Dalam kode ini:
Versi Visual Basic menggunakan kata kunci
Function
alih-alih kata kunciSub
biasanya karena metode ini menampilkan nilai.Anda tidak dapat dengan mudah memasukkan tanda perkalian (×) dan tanda pembagian (÷) dengan menggunakan keyboard, sehingga C# dan Visual Basic menerima tanda bintang (*) untuk perkalian dan tanda garis miring (/) untuk pembagian.
Di C#,
&&
adalah operatorlogical and
. Dalam Visual Basic, operator yang setara adalahAndAlso
. Anda menggunakan operatorlogical and
untuk memeriksa apakah lebih dari satu kondisi benar. Dalam hal ini, jika nilai semuanya benar, metode menampilkan nilaitrue
. Jika tidak, metode menampilkan nilaifalse
.Pernyataan
if
menggunakan properti Nilai dari kontrol NumericUpDown untuk mengakses nilai kontrol saat ini. Di bagian berikutnya, gunakan properti yang sama untuk menampilkan jawaban yang benar di setiap kontrol.
Tambahkan penanganan aktivitas untuk timer
Sekarang setelah Anda memiliki cara untuk memeriksa jawabannya, Anda dapat menulis kode untuk penanganan aktivitas Tick. Kode ini berjalan setiap detik, setelah timer menaikkan peristiwa Tick. Penanganan aktivitas ini memeriksa jawaban peserta kuis dengan memanggil CheckTheAnswer()
. Ini juga memeriksa berapa banyak waktu yang telah berlalu dalam kuis.
Pada formulir, klik dua kali kontrol Timer, atau pilih lalu pilih Enter. Tindakan ini menambahkan penanganan aktivitas Tick ke timer. Editor kode muncul dan menampilkan metode penanganan Tick.
Tambahkan pernyataan berikut ke metode penanganan aktivitas baru.
private void timer1_Tick(object sender, EventArgs e) { if (CheckTheAnswer()) { // If CheckTheAnswer() returns true, then the user // got the answer right. Stop the timer // and show a MessageBox. timer1.Stop(); MessageBox.Show("You got all the answers right!", "Congratulations!"); startButton.Enabled = true; } else if (timeLeft > 0) { // If CheckTheAnswer() returns false, keep counting // down. Decrease the time left by one second and // display the new time left by updating the // Time Left label. timeLeft = timeLeft - 1; timeLabel.Text = timeLeft + " seconds"; } else { // If the user ran out of time, stop the timer, show // a MessageBox, and fill in the answers. timer1.Stop(); timeLabel.Text = "Time's up!"; MessageBox.Show("You didn't finish in time.", "Sorry!"); sum.Value = addend1 + addend2; difference.Value = minuend - subtrahend; product.Value = multiplicand * multiplier; quotient.Value = dividend / divisor; startButton.Enabled = true; } }
Setiap detik dari kuis, metode ini berjalan. Kode pertama-tama memeriksa nilai yang ditampilkan CheckTheAnswer()
.
Jika semua jawaban benar, nilai tersebut adalah
true
, dan kuis berakhir:- Timer berhenti.
- Pesan selamat muncul.
- Properti Diaktifkan dari kontrol startButton diatur ke
true
sehingga peserta kuis dapat memulai kuis lain.
Jika
CheckTheAnswer()
menampilkanfalse
, kode akan memeriksa nilai timeLeft:- Jika variabel ini lebih besar dari 0, timer mengurangi 1 dari timeLeft. Ini juga memperbarui properti Teks dari kontrol timeLabel untuk menunjukkan peserta kuis berapa detik yang tersisa.
- Jika tidak ada waktu yang tersisa, timer akan berhenti dan mengubah teks timeLabel menjadi Waktu habis! Kotak pesan mengumumkan bahwa kuis telah berakhir, dan jawabannya terungkap. Tombol mulai menjadi tersedia lagi.
Memulai timer
Untuk memulai timer saat kuis dimulai, tambahkan tiga baris ke akhir metode StartTheQuiz()
, seperti yang ditunjukkan oleh sampel berikut.
/// <summary>
/// Start the quiz by filling in all of the problem
/// values and starting the timer.
/// </summary>
public void StartTheQuiz()
{
// Fill in the addition problem.
// Generate two random numbers to add.
// Store the values in the variables 'addend1' and 'addend2'.
addend1 = randomizer.Next(51);
addend2 = randomizer.Next(51);
// Convert the two randomly generated numbers
// into strings so that they can be displayed
// in the label controls.
plusLeftLabel.Text = addend1.ToString();
plusRightLabel.Text = addend2.ToString();
// 'sum' is the name of the NumericUpDown control.
// This step makes sure its value is zero before
// adding any values to it.
sum.Value = 0;
// Fill in the subtraction problem.
minuend = randomizer.Next(1, 101);
subtrahend = randomizer.Next(1, minuend);
minusLeftLabel.Text = minuend.ToString();
minusRightLabel.Text = subtrahend.ToString();
difference.Value = 0;
// Fill in the multiplication problem.
multiplicand = randomizer.Next(2, 11);
multiplier = randomizer.Next(2, 11);
timesLeftLabel.Text = multiplicand.ToString();
timesRightLabel.Text = multiplier.ToString();
product.Value = 0;
// Fill in the division problem.
divisor = randomizer.Next(2, 11);
int temporaryQuotient = randomizer.Next(2, 11);
dividend = divisor * temporaryQuotient;
dividedLeftLabel.Text = dividend.ToString();
dividedRightLabel.Text = divisor.ToString();
quotient.Value = 0;
// Start the timer.
timeLeft = 30;
timeLabel.Text = "30 seconds";
timer1.Start();
}
Saat kuis Anda dimulai, kode ini mengatur variabel timeLeft ke 30 dan properti Teks kontrol timeLabel menjadi 30 detik. Kemudian metode Start() dari kontrol Timer memulai hitung mundur.
Jalankan aplikasi Anda
Simpan program Anda dan jalankan.
Pilih Mulai kuis. Timer mulai menghitung mundur. Ketika waktu habis, kuis berakhir, dan jawabannya muncul.
Mulai kuis lain, dan berikan jawaban yang benar untuk masalah matematika. Saat Anda menjawab dengan benar dalam batas waktu, kotak pesan terbuka, tombol mulai tersedia, dan timer berhenti.
Langkah berikutnya
Lanjutkan ke tutorial berikutnya untuk mempelajari cara menyesuaikan kuis matematika.