SKB#1 Permainan matematika sederhana dengan 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. Dalam permainan user akan diberikan pertanyaan sederhana (perkalian) 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 utama program

Program, baik dalam bahasa pemrograman python maupun java, memiliki bagian-bagian sebagai berikut:

  1. Bagian pembuka: function/method yang dipanggil pertama kali pada bagian utama program. Ia menampilkan pesan pembuka kepada user.
  2. Bagian penutup: function/method yang dipanggil saat user memutuskan untuk berhenti bermain. Ia menampilkan jumlah soal yang dijawab oleh user, termasuk apakah jawaban tersebut benar atau salah.
  3. Bagian konfirmasi: function/method yang menanyakan apakah user akan terus atau berhenti bermain. Ia akan dipanggil setiap user selesai menjawab soal.
  4. Bagian pembangkit pertanyaan: function yang membangkitkan sebuah pertanyaan sederhana untuk dijawab user. Pada contoh kali ini, pertanyaan yang dibangkitkan adalah perkalian dua bilangan bulat. Angka dibangkitkan secara acak menggunakan pembangkit acak (random), dengan rentang kemungkinan nilai acak yang fleksibel sesuai permintaan dari kode yang memanggilnya.
  5. Bagian utama program: Ia akan memanggil bagian pembuka di awal, menyiapkan variabel untuk menyimpan data-data permainan (jumlah soal, jumlah jawaban benar, jumlah jawaban salah). Pada bagian ini, pembangkit soal dan konfirmasi untuk melanjutkan permainan akan dibangkitkan dalam suatu logika perulangan menggunakan while. Jika user kemudian memutuskan untuk menghentikan permainan, perulangan akan terhenti dan program akan memanggil bagian penutup.

Source Code Python

Berikut adalah source code dari permainan tersebut dalam bahasa pemrograman Python. Jika ingin menjalankannya secara langsung, silahkan buka link repl.it ini.

import random

def pembuka():
  print("PERMAINAN DIMULAI!")
  print("Kita akan mulai bermain kuis matematika")
  print("Jawablah soal-soal perkalian berikut ini")

def penutup(tot,benar,salah):
  print("PERMAINAN BERAKHIR!")
  print("Jawaban benar: "+ str(benar))
  print("Jawaban salah: "+ str(salah))
  print("Total soal: "+ str(tot))

def konfirmasi():  
  konfirm = input('tekan ENTER untuk melanjutkan, atau tombol lainnya kemudian ENTER untuk menyudahi permainan ')
  if (konfirm == ''):
    return True
  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 main():
  pembuka()
  lanjut = True
  jum_soal = 0
  jum_benar = 0
  jum_salah = 0
  level = 1
  while lanjut:
    jum_soal = jum_soal + 1      
    benar = tanya_perkalian(level*5)
    if benar:
      print('jawaban BENAR')
      jum_benar = jum_benar + 1
      level = level + 1
    else: 
      jum_salah = jum_salah + 1
      print('jawaban SALAH')            
    lanjut = konfirmasi();              
  penutup(jum_soal,jum_benar,jum_salah);

main()

Catatan:

  1. Pada baris ke-21 dan ke-22 digunakan modul random untuk membangkitkan sebuah bilangan integer secara acak dengan nilai pada rentang 2 dan batas_atas -1.
  2. Blok try .. except pada baris ke-25 s.d ke- 30 dibuat untuk menghindari error/crash akibat user memasukkan input yang tidak bisa dikonversi menjadi integer. Untuk lebih jelasnya, baca artikel mengenai exception handling.

Source code Java

Berikut adalah source code dari permainan tersebut dalam bahasa pemrograman Java. Jika ingin menjalankannya secara langsung, silahkan buka link repl.it ini.

import java.util.Random;
import java.util.Scanner;
import java.util.concurrent.ThreadLocalRandom;

public class Main {
  public static void main(String[] args) {     
    pembuka();
    boolean lanjut = true;
    int jumSoal = 0;
    int jumBenar = 0;
    int jumSalah = 0;
    int level = 1;
    while (lanjut) {
      jumSoal++;      
      boolean benar = tanyaPerkalian(level*5);
      if (benar) {
        System.out.println("jawaban BENAR");
        jumBenar++;
        level++;
      } else {
        jumSalah++;
        System.out.println("jawaban SALAH");
      }      
      lanjut = konfirmasi();      
    }    
    penutup(jumSoal,jumBenar,jumSalah);
  }

  static void pembuka() {
    System.out.println("PERMAINAN DIMULAI!");
    System.out.println("Kita akan mulai bermain kuis matematika");
    System.out.println("Jawablah soal-soal perkalian berikut ini");
  }

  static void penutup(int tot,int benar, int salah) {
    System.out.println("PERMAINAN BERAKHIR!");
    System.out.println("Jawaban benar: "+ benar);
    System.out.println("Jawaban salah: "+ salah);
    System.out.println("Total soal: "+ tot);
  }

  static boolean konfirmasi() {
    System.out.println("tekan ENTER untuk melanjutkan, atau tombol lainnya kemudian ENTER untuk menyudahi permainan");    
    Scanner scanner = new Scanner(System.in);
    String readString = scanner.nextLine();
    while(readString!=null) {
        //System.out.println(readString);
        if (readString.isEmpty()) {
            return true;
        }
        return false;
    }
    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;
  }

}

Catatan:

  1. ThreadLocalRandom digunakan untuk membangkitkan bilangan acak. Contoh di baris 57 ThreadLocalRandom.current().nextInt(2, batasAtas); berfungsi membangkitkan sebuah bilangan bulat (int) yang dipilih secara acak, pada rentang 2 sampai dengan (batasAtas-1).
  2. Blok try — catch pada baris 62 s.d 69 diletakkan untuk menangani bila user ternyata memasukkan nilai yang tidak dapat dikonversi ke dalam tipe data integer, agar program tidak mengalami crash.

Series Navigation<< SKB#0 PengantarSKB#2 Permainan matematika sederhana dengan lebih dari satu pembangkit soal >>

You may also like...

Berikan komentar