SKB#2 Permainan matematika sederhana dengan lebih dari satu pembangkit soal
- SKB#0 Pengantar
- SKB#1 Permainan matematika sederhana dengan satu pembangkit soal
- SKB#2 Permainan matematika sederhana dengan lebih dari satu pembangkit soal
Halaman ini menyajikan source code dan penjelasan untuk sebuah permainan matematika sederhana. Pada permainan ini user akan bermain pada console/command line. Jika pada artikel sebelumnya pertanyaan yang muncul hanya satu jenis (perkalian saja), maka kali ini pertanyaan yang diberikan bervariasi mencakup penjumlahan, pengurangan, perkalian, dan pembagian.
Sama dengan contoh sebelumnya soal akan diberikan secara berulang-ulang dengan tingkat kesulitan yang meningkat hingga user merasa cukup dan memilih berhenti. Selama permainan program akan mencatat jumlah soal yang dijawab oleh user dengan benar maupun salah, hasilnya kemudian disajikan pada akhir permainan.
Struktur program
Struktur program masih mirip dengan contoh sebelumnya. Pada artikel ini akan diberikan penjelasan hanya pada bagian yang baru/berbeda yakni:
1. Pembangkit soal
Pada contoh kali ini, disediakan lebih dari satu jenis pembangkit soal. Pembangkit soal kali ini mencakup pembangkit soal penjumlahan, pengurangan, perkalian, dan pembagian. Agar kode tetap terorganisasi dengan baik, terlihat ringkas, dan mudah dibaca, maka function/method pembangkit soal tidak lagi diletakkan pada tempat yang sama dengan method yang lain.
Pembangkit soal dalam bahasa Python
Dalam kode berbahasa Python, pembangkit soal diletakkan pada file pembangkit_soal.py. Dalam bahasa python, sebuah file berisi kode berbahasa python disebut dengan module. Dalam konteks ini maka pembangkit_soal.py adalah sebuah module. Kode yang ada di dalamnya nantinya dapat digunakan dari tempat lain dengan melakukan import terhadap module tersebut.
Berikut adalah isi dari pembangkit_soal.py. Perhatikan bahwa pada kode tersebut, terdapat empat function masing-masing mewakili satu jenis pembangkit soal baik untuk operasi penjumlahan, pengurangan, perkalian, dan pembagian.
import random def tanya_penjumlahan(batas_atas): bil1 = 0 bil2 = 0 while bil1 == bil2: # agar angka tidak identik/soal lebih cantik bil1 = random.randint(2,batas_atas) bil2 = random.randint(2,batas_atas) kunci = bil1 + bil2 pertanyaan = '{} + {} = '.format(bil1,bil2) try: jawaban = int(input(pertanyaan)) if jawaban == kunci: return True except: None return False def tanya_pengurangan(batas_atas): bil1 = 0 bil2 = 0 while bil1 <= bil2: # agar hasil selalu positif bil1 = random.randint(2,batas_atas) bil2 = random.randint(2,batas_atas) kunci = bil1 - bil2 pertanyaan = '{} - {} = '.format(bil1,bil2) try: jawaban = int(input(pertanyaan)) if jawaban == kunci: return True except: None return False def tanya_perkalian(batas_atas): bil1 = random.randint(2,batas_atas) bil2 = random.randint(2,batas_atas) kunci = bil1 * bil2 pertanyaan = '{} x {} = '.format(bil1,bil2) try: jawaban = int(input(pertanyaan)) if jawaban == kunci: return True except: None return False def tanya_pembagian(batas_atas): bil1 = random.randint(2,batas_atas) bil2 = random.randint(2,batas_atas) hasil_kali = bil1 * bil2 pertanyaan = '{} ÷ {} = '.format(hasil_kali,bil2) try: jawaban = int(input(pertanyaan)) if jawaban == bil1: return True except: None return False
Pembangkit soal dalam bahasa Java
Pada kode berbahasa Java, pembangkit disediakan pada class PembangkitSoal yang ada pada file PembangkitSoal.java. Dalam bahasa Java, kode-kode yang ada pada suatu class tertentu, dapat diakses dari tempat lain selama access modifier-nya mengijinkan untuk hal tersebut. Pada contoh ini, seluruh method pada class tersebut diberikan access modifier public yang artinya dapat diakses dari mana saja. Serupa dengan bahasa python, jika ingin menggunakan kode dari class lain yang berbeda package dari class yang menggunakan, kita harus melakukan import.
Berikut adalah isi dari class PembangkitSoal.py. Perhatikan bahwa pada kode tersebut, terdapat empat static method masing-masing mewakili satu jenis pembangkit soal baik untuk operasi penjumlahan, pengurangan, perkalian, dan pembagian.
import java.util.concurrent.ThreadLocalRandom; import java.util.Scanner; public class PembangkitSoal { static boolean tanyaPenjumlahan(int batasAtas) { int bil1=0,bil2=0; // memastikan bahwa kedua bilangan tidak sama while (bil1==bil2) { bil1 = ThreadLocalRandom.current().nextInt(2, batasAtas); bil2 = ThreadLocalRandom.current().nextInt(2, batasAtas); } int kunci = bil1 + bil2; System.out.println(bil1+" + " +bil2+ " = ?"); Scanner scan = new Scanner(System.in); try { int jawaban = scan.nextInt(); if (jawaban == kunci) { return true; } } catch (Exception x) { } return false; } static boolean tanyaPengurangan(int batasAtas) { int bil1=0,bil2=0; // memastikan hasil pengurangan selalu positif while (bil1 <= bil2) { bil1 = ThreadLocalRandom.current().nextInt(2, batasAtas); bil2 = ThreadLocalRandom.current().nextInt(2, batasAtas); } int kunci = bil1 - bil2; System.out.println(bil1+" - " +bil2+ " = ?"); Scanner scan = new Scanner(System.in); try { int jawaban = scan.nextInt(); if (jawaban == kunci) { return true; } } catch (Exception x) { } return false; } static boolean tanyaPerkalian(int batasAtas) { int bil1 = ThreadLocalRandom.current().nextInt(2, batasAtas); int bil2 = ThreadLocalRandom.current().nextInt(2, batasAtas); int kunci = bil1 * bil2; System.out.println(bil1+" x " +bil2+ " = ?"); Scanner scan = new Scanner(System.in); try { int jawaban = scan.nextInt(); if (jawaban == kunci) { return true; } } catch (Exception x) { } return false; } static boolean tanyaPembagian(int batasAtas) { int bil1 = ThreadLocalRandom.current().nextInt(2, batasAtas); int bil2 = ThreadLocalRandom.current().nextInt(2, batasAtas); int hasilKali = bil1 * bil2; System.out.println(hasilKali+" ÷ " +bil2+ " = ?"); Scanner scan = new Scanner(System.in); try { int jawaban = scan.nextInt(); if (jawaban == bil1) { return true; } } catch (Exception x) { } return false; } }
2. Bagian utama program
Bagian utama program mengalami modifikasi untuk mengkomodasi pemanggilan seluruh pembangkit soal secara bergiliran. Karena terdapat empat jenis pembangkit soal, maka kita dapat memanfaatkan operator modulus. Caranya adalah dengan menggunakan ekspresi sisa pembagian dari jumlah soal dengan nilai empat. Jika sisa pembagiannya 1, maka yang dipanggil adalah pembangkit soal penjumlahan, 2 untuk pengurangan, dan seterusnya. Berikut adalah kode pada function/method main yang dimodifikasi.
Dalam bahasa Python
def main(): pembuka() lanjut = True jum_soal = 0 jum_benar = 0 jum_salah = 0 while lanjut: benar = False; batas_atas = int((jum_soal / 4 + 1 ) * 5); jum_soal = jum_soal + 1 if jum_soal % 4 == 1: benar = pembangkit.tanya_penjumlahan(batas_atas) elif jum_soal % 4 == 2: benar = pembangkit.tanya_pengurangan(batas_atas) elif jum_soal % 4 == 3: benar = pembangkit.tanya_perkalian(batas_atas) else: benar = pembangkit.tanya_pembagian(batas_atas) if benar: print('BENAR',end=' ') jum_benar = jum_benar + 1 else: jum_salah = jum_salah + 1 print('SALAH',end=' ') lanjut = konfirmasi() penutup(jum_soal, jum_benar, jum_salah)
Dalam bahasa Java
public static void main(String[] args) { pembuka(); boolean lanjut = true; int jumSoal = 0; int jumBenar = 0; int jumSalah = 0; while (lanjut) { jumSoal++; boolean benar = false; int batasAtas = (jumSoal / 4 + 1 ) * 5; if (jumSoal % 4 == 1) { benar = PembangkitSoal.tanyaPenjumlahan(batasAtas); } else if (jumSoal % 4 == 2) { benar = PembangkitSoal.tanyaPengurangan(batasAtas); } else if (jumSoal % 4 == 3) { benar = PembangkitSoal.tanyaPerkalian(batasAtas); } else { benar = PembangkitSoal.tanyaPembagian(batasAtas); } if (benar) { System.out.print("BENAR "); jumBenar++; } else { jumSalah++; System.out.print("SALAH "); } lanjut = konfirmasi(); } penutup(jumSoal,jumBenar,jumSalah); }
Kode lengkap
Lihat kode yang utuh dan coba jalankan untuk lebih memahami isinya.