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.

Kode lengkap dalam bahasa python

Kode lengkap dalam bahasa java

Series Navigation<< SKB#1 Permainan matematika sederhana dengan satu pembangkit soal

You may also like...

Berikan komentar