Pendamping Bab 20: Proyek: Game, Kalkulator, dan Chatbot. Gunakan nomor contoh dan latihan yang sama dengan buku.

Tujuan Belajar

  • Menggunakan konsep dasar dalam beberapa jenis aplikasi.
  • Menguji aturan dan batas masukan proyek.
  • Mengembangkan satu fitur dengan hasil yang dapat diperiksa.

Persiapan

Empat proyek memakai Python dasar; proyek matriks memerlukan NumPy pada komputer. Pilih satu proyek untuk dikerjakan sampai selesai sebelum mencoba yang lain. Perhitungan tabungan adalah model latihan dengan asumsi sederhana.

Program dengan tombol Coba di IDE dapat dijalankan di browser. Untuk program lokal, unduh sumber, ekstrak ZIP, lalu ikuti README.txt.

Pembahasan

Ikuti pembahasan pada buku, lalu gunakan kegiatan dan materi pendamping berikut untuk memeriksa pemahaman.

Studi Kasus

20-01 – Memeriksa chatbot berbasis aturan

Normalisasi teks membuat aturan mengenali kapital dan spasi yang berbeda. Pesan lain mendapat respons bawaan.

Coba di IDE Unduh Sumber
def jawab(pesan):
    pesan = pesan.strip().lower()
    if pesan == "halo":
        return "Halo! Ada yang bisa saya bantu?"
    if pesan == "selesai":
        return "Sampai jumpa."
    return "Pesan belum dikenali."


for pesan in ["HALO", "  selesai  ", "cuaca"]:
    print(jawab(pesan))

Hasil yang diharapkan:

Halo! Ada yang bisa saya bantu?
Sampai jumpa.
Pesan belum dikenali.

Coba ubah: Tambahkan aturan terima kasih dan satu data uji untuknya.

20-P01 – Game Tebak Angka

Angka dipilih acak. Gunakan petunjuk terlalu kecil atau terlalu besar sampai tebakan benar.

Coba di IDE Unduh Sumber
import random

angka_rahasia = random.randint(1, 100)
percobaan = 0

print("Selamat datang di Game Tebak Angka!")
print("Saya telah memilih sebuah angka antara 1 dan 100.")
print("Coba tebak angka tersebut!")

while True:
    tebakan_str = input("Tebakanmu: ")
    percobaan += 1

    if not tebakan_str.isdecimal():
        print("Oops! Itu bukan angka yang valid. Coba lagi.")
        continue

    tebakan = int(tebakan_str)

    if tebakan < 1 or tebakan > 100:
        print("Angka harus di antara 1 dan 100. Coba lagi.")
        continue

    if tebakan < angka_rahasia:
        print("Terlalu kecil! Coba lagi.")
    elif tebakan > angka_rahasia:
        print("Terlalu besar! Coba lagi.")
    else:
        print(f"Selamat! Kamu menebak angka {angka_rahasia}")
        print(f"dalam {percobaan} percobaan.")
        break

Hasil yang diharapkan:

Angka rahasia dan jumlah percobaan berbeda pada setiap permainan.

20-P02 – Kalkulator Tabungan

Program menghitung banyak setoran bulanan untuk mencapai target dengan saldo awal tertentu.

Coba di IDE Unduh Sumber

Masukan uji, berurutan: '1000', '200', '0'.

def hitung_waktu_tabungan(
    target_tabungan,
    tabungan_per_bulan,
    saldo_awal=0,
):
    # Fungsi ini lebih deskriptif namanya
    # Menambahkan parameter saldo_awal dengan default 0
    if tabungan_per_bulan <= 0:
        return -1

    bulan = 0
    saldo_saat_ini = saldo_awal
    while saldo_saat_ini < target_tabungan:
        saldo_saat_ini += tabungan_per_bulan
        bulan += 1
        # Untuk melihat progres:
        # print(f"Bulan {bulan}: Saldo Rp {saldo_saat_ini}")
    return bulan


print("=== Kalkulator Estimasi Waktu Tabungan ===")

try:
    target_str = input("Masukkan target tabungan kamu (Rp): ")
    # Validasi input target
    if not target_str.isdecimal() or int(target_str) <= 0:
        print("Target tabungan harus angka positif.")
        exit()
    target = int(target_str)

    prompt = "Masukkan jumlah yang bisa kamu tabung per bulan (Rp): "
    per_bulan_str = input(prompt)
    # Validasi input tabungan per bulan
    if not per_bulan_str.isdecimal() or int(per_bulan_str) <= 0:
        print("Tabungan per bulan harus angka positif.")
        exit()
    per_bulan = int(per_bulan_str)

    prompt = "Masukkan saldo awal kamu (Rp, kosongkan jika 0): "
    saldo_awal_str = input(prompt)
    saldo_awal = 0
    if saldo_awal_str.isdecimal() and int(saldo_awal_str) > 0:
        saldo_awal = int(saldo_awal_str)
    elif saldo_awal_str and not saldo_awal_str.isdecimal():
        print("Saldo awal tidak valid, dianggap 0.")

except ValueError:
    print("Input tidak valid. Harap masukkan angka.")
    exit()

if saldo_awal >= target:
    print("Selamat! Kamu sudah mencapai target tabungan.")
else:
    estimasi_bulan = hitung_waktu_tabungan(
        target,
        per_bulan,
        saldo_awal,
    )

    if estimasi_bulan == -1:
        print("Dengan tabungan per bulan Rp 0 atau kurang,")
        print("target tidak akan pernah tercapai.")
    elif estimasi_bulan == 0:
        print("Kamu sudah mencapai target tabungan!")
    else:
        tahun = estimasi_bulan // 12
        sisa_bulan = estimasi_bulan % 12
        if tahun > 0:
            print(f"Dengan menabung Rp {per_bulan} per bulan,")
            print(f"Kamu akan mencapai target Rp {target}")
            print(f"sekitar {tahun} tahun {sisa_bulan} bulan.")
        else:
            print(f"Dengan menabung Rp {per_bulan} per bulan,")
            print(f"Kamu akan mencapai target Rp {target}")
            print(f"dalam waktu sekitar {estimasi_bulan} bulan.")

Hasil yang diharapkan:

=== Kalkulator Estimasi Waktu Tabungan ===
Masukkan target tabungan kamu (Rp): Masukkan jumlah yang bisa kamu tabung per bulan (Rp): Masukkan saldo awal kamu (Rp, kosongkan jika 0): Dengan menabung Rp 200 per bulan,
Kamu akan mencapai target Rp 1000
dalam waktu sekitar 5 bulan.

20-P03 – Simulasi Bunga Majemuk

Model latihan menghitung bunga nominal tahunan dibagi 12 setelah setoran awal bulan. Ini bukan proyeksi produk keuangan.

Coba di IDE Unduh Sumber

Masukan uji, berurutan: '1000', '100', '12', '1'.

def simulasi_pertumbuhan_tabungan(
    saldo_awal,
    setoran_per_bulan,
    bunga_tahunan_persen,
    durasi_tahun,
):
    saldo = float(saldo_awal)
    setoran_bulanan = float(setoran_per_bulan)
    # Model latihan: bunga nominal tahunan dibagi 12.
    # Setoran masuk pada awal bulan, sebelum bunga dihitung.
    # Model ini tidak menghitung pajak, biaya, atau inflasi.

    print(f"Simulasi untuk {durasi_tahun*12} bulan:")
    print("-" * 30)
    header = "Bulan Ke- | Setoran Bulan Ini | "
    header += "Bunga Bulan Ini | Saldo Akhir Bulan"
    print(header)
    print("-" * 70)

    bunga_bulanan_decimal = bunga_tahunan_persen / 100 / 12

    for bulan_ke in range(1, durasi_tahun * 12 + 1):
        saldo += setoran_bulanan
        bunga_didapat = saldo * bunga_bulanan_decimal
        saldo += bunga_didapat

        row = f"{bulan_ke:<10} | Rp {setoran_bulanan:<15,.2f} | "
        row += f"Rp {bunga_didapat:<15,.2f} | "
        row += f"Rp {saldo:<18,.2f}"
        print(row)

    print("-" * 70)
    return saldo


print("=== Simulasi Pertumbuhan Tabungan dengan Bunga Majemuk ===")

try:
    input_saldo_awal = input("Masukkan saldo awal kamu (Rp): ")
    valid = input_saldo_awal.replace(".", "", 1).isdecimal()
    if not valid or float(input_saldo_awal) < 0:
        print("Saldo awal harus angka non-negatif.")
        exit()
    saldo_awal_val = float(input_saldo_awal)

    prompt = "Masukkan setoran rutin per bulan "
    prompt += "(Rp, 0 jika tidak ada): "
    input_setoran_bulanan = input(prompt)
    valid = input_setoran_bulanan.replace(".", "", 1).isdecimal()
    if not valid or float(input_setoran_bulanan) < 0:
        print("Setoran bulanan harus angka non-negatif.")
        exit()
    setoran_bulanan_val = float(input_setoran_bulanan)

    prompt = "Masukkan bunga nominal tahunan simulasi (%): "
    input_bunga_tahunan = input(prompt)
    valid = input_bunga_tahunan.replace(".", "", 1).isdecimal()
    if not valid or float(input_bunga_tahunan) < 0:
        print("Bunga tahunan harus angka non-negatif.")
        exit()
    bunga_tahunan_val = float(input_bunga_tahunan)

    input_durasi_tahun = input("Masukkan durasi menabung (tahun): ")
    durasi_tidak_valid = (
        not input_durasi_tahun.isdecimal()
        or int(input_durasi_tahun) <= 0
    )
    if durasi_tidak_valid:
        print("Durasi tahun harus angka bulat positif.")
        exit()
    durasi_tahun_val = int(input_durasi_tahun)

except ValueError:
    print("Input tidak valid.")
    print("Pastikan semua masukan adalah angka yang sesuai.")
    exit()

print("\nMenghitung...")
saldo_akhir_simulasi = simulasi_pertumbuhan_tabungan(
    saldo_awal_val,
    setoran_bulanan_val,
    bunga_tahunan_val,
    durasi_tahun_val,
)

print(f"\nSetelah {durasi_tahun_val} tahun,")
print(f"dengan setoran Rp {setoran_bulanan_val:,.2f} per bulan")
print(f"dan bunga {bunga_tahunan_val}% per tahun,")
print(f"Perkiraan total saldo kamu: Rp {saldo_akhir_simulasi:,.2f}")

Hasil yang diharapkan:

=== Simulasi Pertumbuhan Tabungan dengan Bunga Majemuk ===
Masukkan saldo awal kamu (Rp): Masukkan setoran rutin per bulan (Rp, 0 jika tidak ada): Masukkan bunga nominal tahunan simulasi (%): Masukkan durasi menabung (tahun): 
Menghitung...
Simulasi untuk 12 bulan:
------------------------------
Bulan Ke- | Setoran Bulan Ini | Bunga Bulan Ini | Saldo Akhir Bulan
----------------------------------------------------------------------
1          | Rp 100.00          | Rp 11.00           | Rp 1,111.00          
2          | Rp 100.00          | Rp 12.11           | Rp 1,223.11          
3          | Rp 100.00          | Rp 13.23           | Rp 1,336.34          
4          | Rp 100.00          | Rp 14.36           | Rp 1,450.70          
5          | Rp 100.00          | Rp 15.51           | Rp 1,566.21          
6          | Rp 100.00          | Rp 16.66           | Rp 1,682.87          
7          | Rp 100.00          | Rp 17.83           | Rp 1,800.70          
8          | Rp 100.00          | Rp 19.01           | Rp 1,919.71          
9          | Rp 100.00          | Rp 20.20           | Rp 2,039.91          
10         | Rp 100.00          | Rp 21.40           | Rp 2,161.31          
11         | Rp 100.00          | Rp 22.61           | Rp 2,283.92          
12         | Rp 100.00          | Rp 23.84           | Rp 2,407.76          
----------------------------------------------------------------------

Setelah 1 tahun,
dengan setoran Rp 100.00 per bulan
dan bunga 12.0% per tahun,
Perkiraan total saldo kamu: Rp 2,407.76

20-P04 – Mini Chatbot

Chatbot memakai aturan pencocokan teks, lalu berhenti ketika kamu mengetik keluar.

Coba di IDE Unduh Sumber

Masukan uji, berurutan: 'halo', 'nama kamu siapa', 'cuaca', 'keluar'.

def chatbot_sederhana():
    print("Chatbot: Halo! Aku PythonBot, teman bicaramu.")
    print("Chatbot: Ketik 'keluar' untuk mengakhiri percakapan.")
    print("Chatbot: Kamu bisa tanya namaku atau kabarku.")

    while True:
        pesan = input("Kamu  : ").lower().strip()

        if not pesan:
            print("Chatbot: Ada yang bisa kubantu?")
            continue

        if pesan == "keluar":
            print("Chatbot: Senang berbincang. Sampai jumpa!")
            break
        elif (
            "nama kamu siapa" in pesan
            or "siapa namamu" in pesan
            or ("nama" in pesan and "siapa" in pesan)
        ):
            print("Chatbot: Namaku PythonBot!")
        elif "kabar" in pesan or "apa kabar" in pesan:
            resp = "Chatbot: Aku baik-baik saja, terima kasih "
            resp += "sudah bertanya! Bagaimana denganmu?"
            print(resp)
        elif (
            "aku baik" in pesan
            or "saya baik" in pesan
            or "baik juga" in pesan
        ):
            print("Chatbot: Syukurlah kalau begitu!")
        elif "halo" in pesan or "hai" in pesan or "hei" in pesan:
            print("Chatbot: Halo juga! Ada yang bisa kubantu?")
        elif (
            "apa yang bisa kamu lakukan" in pesan
            or "kamu bisa apa" in pesan
        ):
            resp = "Chatbot: Aku bisa menjawab pertanyaan sederhana "
            resp += "seperti namaku atau kabarku. "
            resp += "Aku masih belajar banyak!"
            print(resp)
        elif "terima kasih" in pesan:
            print("Chatbot: Sama-sama! Senang bisa membantu.")
        else:
            resp = "Chatbot: Maaf, aku belum mengerti maksudmu. "
            resp += "Mungkin kamu bisa coba pertanyaan lain?"
            print(resp)


if __name__ == "__main__":
    chatbot_sederhana()

Hasil yang diharapkan:

Chatbot: Halo! Aku PythonBot, teman bicaramu.
Chatbot: Ketik 'keluar' untuk mengakhiri percakapan.
Chatbot: Kamu bisa tanya namaku atau kabarku.
Kamu  : Chatbot: Halo juga! Ada yang bisa kubantu?
Kamu  : Chatbot: Namaku PythonBot!
Kamu  : Chatbot: Maaf, aku belum mengerti maksudmu. Mungkin kamu bisa coba pertanyaan lain?
Kamu  : Chatbot: Senang berbincang. Sampai jumpa!

20-P05 – Operasi Matriks NumPy

Aktifkan venv, instal numpy, lalu jalankan matriks.py. Bandingkan perkalian elemen dengan perkalian matriks.

Unduh Sumber
import numpy as np

print("=== Operasi Matriks Sederhana ===")

# Membuat matriks (array 2D) menggunakan numpy
A = np.array([[1, 2], [3, 4]])

B = np.array([[5, 6], [7, 8]])

print("Matriks A:")
print(A)
print("\nMatriks B:")  # Tambahkan newline untuk keterbacaan
print(B)

# Penjumlahan matriks (element-wise)
print("\nPenjumlahan Matriks (A + B):")
print(A + B)

# Perkalian matriks (dot product)
print("\nPerkalian Matriks (A x B):")
print(np.dot(A, B))

# Operasi lain yang mungkin:
# Transpose matriks
print("\nTranspose Matriks A:")
print(A.T)

# Perkalian dengan skalar
print("\nMatriks A dikali 2:")
print(A * 2)

Hasil yang diharapkan:

=== Operasi Matriks Sederhana ===
Matriks A:
[[1 2]
 [3 4]]

Matriks B:
[[5 6]
 [7 8]]

Penjumlahan Matriks (A + B):
[[ 6  8]
 [10 12]]

Perkalian Matriks (A x B):
[[19 22]
 [43 50]]

Transpose Matriks A:
[[1 3]
 [2 4]]

Matriks A dikali 2:
[[2 4]
 [6 8]]

Rangkuman

Proyek berangkat dari tujuan, aturan, dan data uji. Periksa alur berhasil maupun gagal. Pecah pengembangan menjadi fitur kecil dan tentukan hasil yang diharapkan sebelum mengubah code.

Cek Pemahaman

Lima pertanyaan ini sama dengan pertanyaan di buku. Periksa jawaban di kuis untuk melihat skor dan pembahasan.

  1. Langkah awal yang membantu saat membuat proyek adalah …
  2. Game tebak angka perlu mempunyai …
  3. Chatbot berbasis aturan memilih jawaban dari …
  4. Sebelum memakai NumPy, apa yang perlu diperiksa?
  5. Mengapa asumsi simulasi tabungan harus dinyatakan?
Kerjakan Kuis

Latihan Mandiri

Latihan 20-L01 – Batas tebakan

Dasar. Dengan angka rahasia 7 dan tebakan [2, 5, 7], tampilkan Belum tepat untuk tebakan salah dan Benar saat cocok, lalu berhenti.

Kerjakan di IDE Unduh Latihan

Hasil yang diharapkan:

Belum tepat
Belum tepat
Benar
Lihat Petunjuk

Letakkan break pada cabang tebakan benar.

Lihat Solusi
rahasia = 7
tebakan = [2, 5, 7]
for angka in tebakan:
    if angka == rahasia:
        print("Benar")
        break
    print("Belum tepat")

Data uji tetap membuat aturan permainan mudah diperiksa.

Coba Solusi di IDEUnduh Solusi

Latihan 20-L02 – Target tabungan

Penerapan. Mulai dengan saldo 0. Tambahkan 10000 setiap putaran sampai minimal 35000. Cetak jumlah putaran dan saldo akhir.

Kerjakan di IDE Unduh Latihan

Hasil yang diharapkan:

4
40000
Lihat Petunjuk

Periksa kondisi sebelum setiap setoran.

Lihat Solusi
saldo = 0
putaran = 0
while saldo < 35000:
    saldo += 10000
    putaran += 1
print(putaran)
print(saldo)

Target dapat terlampaui ketika setoran tidak membagi target dengan tepat.

Coba Solusi di IDEUnduh Solusi

Latihan 20-L03 – Jawaban bawaan chatbot

Pengembangan. Buat fungsi jawab(pesan) dengan sapaan halo dan terima kasih. Untuk pesan lain, kembalikan "Saya belum memahami pesan itu." Uji halo dan cuaca.

Kerjakan di IDE Unduh Latihan

Hasil yang diharapkan:

Halo!
Saya belum memahami pesan itu.
Lihat Petunjuk

Gunakan get dengan nilai bawaan.

Lihat Solusi
def jawab(pesan):
    respons = {"halo": "Halo!", "terima kasih": "Sama-sama."}
    return respons.get(
        pesan.strip().lower(), "Saya belum memahami pesan itu."
    )


print(jawab("halo"))
print(jawab("cuaca"))

Jawaban bawaan menjelaskan batas aturan chatbot.

Coba Solusi di IDEUnduh Solusi

Pengembangan

Pengembangan 1. Game Tebak Angka

  1. Batasi Jumlah Percobaan: Berikan pemain jumlah percobaan maksimal (misalnya, 7 kali). Jika gagal menebak dalam batas tersebut, tampilkan pesan “Game Over” dan angka rahasianya.
  2. Level Kesulitan: Biarkan pemain memilih level kesulitan (mudah, sedang, sulit). Setiap level akan mengubah rentang angka yang harus ditebak (misalnya, mudah: 1-50, sedang: 1-100, sulit: 1-500).
  3. Simpan Skor Tertinggi: Jika pemain berhasil, simpan jumlah percobaannya. Jika dia bermain lagi dan mendapatkan skor lebih baik (percobaan lebih sedikit), perbarui skor tertinggi tersebut. (Ini mungkin memerlukan penyimpanan ke file untuk persistensi antar sesi game).

Pengembangan 2. Kalkulator Tabungan

  1. Target Tanggal: Alih-alih menghitung berapa lama, minta pengguna memasukkan target tanggal (misalnya, 2 tahun dari sekarang) dan hitung berapa yang harus mereka tabung per bulan untuk mencapai target tabungan pada tanggal tersebut.
  2. Penyesuaian Inflasi: Tambahkan input untuk perkiraan tingkat inflasi tahunan. Setiap tahun, kurangi daya beli tabungan atau tingkatkan target tabungan sesuai inflasi.
  3. Tabungan Tidak Tetap: Izinkan pengguna memasukkan jumlah tabungan yang berbeda untuk beberapa bulan pertama (misalnya, karena ada bonus), kemudian jumlah tetap untuk bulan-bulan berikutnya.

Pengembangan 3. Simulasi Pertumbuhan Tabungan dengan Bunga Majemuk

  1. Pajak Bunga: Tambahkan input untuk persentase pajak atas bunga (misalnya, 20%). Setiap kali bunga didapatkan, hitung pajaknya dan kurangkan dari bunga sebelum ditambahkan ke saldo.
  2. Frekuensi Bunga Berbeda: Izinkan pengguna memilih frekuensi perhitungan bunga (misalnya, bulanan, kuartalan, tahunan) dan sesuaikan logika perhitungannya.
  3. Target Saldo: Alih-alih durasi, minta pengguna memasukkan target saldo. Program kemudian menghitung berapa lama (bulan/tahun) waktu yang dibutuhkan untuk mencapai target tersebut dengan parameter yang diberikan (saldo awal, setoran, bunga).
  4. Grafik Sederhana: Jika kamu sudah belajar atau ingin mencoba library seperti matplotlib (instal dengan pip install matplotlib), coba visualisasikan pertumbuhan saldo dari bulan ke bulan dalam bentuk grafik garis sederhana.

Pengembangan 4. Mini Chatbot Sederhana

  1. Ingat Nama Pengguna: Minta nama pengguna di awal percakapan dan gunakan nama tersebut dalam beberapa respons chatbot.
  2. Respons Lebih Variatif: Untuk pertanyaan yang sama, buat chatbot bisa memberikan beberapa variasi jawaban secara acak agar tidak monoton.
  3. Tambah Pengetahuan: Ajari chatbot untuk merespons lebih banyak topik atau pertanyaan. Kamu bisa membuat kamus (dictionary) Python yang berisi pasangan pertanyaan (atau kata kunci) dan jawaban.
  4. Log Percakapan: Simpan riwayat percakapan ke dalam sebuah file teks.
  5. Pengenalan Pola Sederhana: Alih-alih hanya mencari kata kunci, coba gunakan ekspresi reguler (modul re) untuk mencocokkan pola yang lebih kompleks dalam input pengguna.

Pengembangan 5. Operasi Matriks Sederhana dengan Library numpy

  1. Kalkulator Matriks Interaktif:
    • Minta pengguna memasukkan dimensi dan elemen-elemen untuk dua matriks.
    • Berikan opsi operasi yang bisa dipilih (penjumlahan, pengurangan, perkalian matriks, transpose, determinan, invers jika memungkinkan).
    • Tampilkan hasilnya.
  2. Ukuran Matriks Berbeda: Tangani kasus di mana operasi tertentu tidak dapat dilakukan karena ukuran matriks tidak kompatibel (misalnya, penjumlahan matriks dengan ukuran berbeda, atau perkalian matriks di mana jumlah kolom matriks pertama tidak sama dengan jumlah baris matriks kedua). Berikan pesan error yang jelas.
  3. Operasi Tambahan: Implementasikan operasi matriks lain seperti:
    • Pengurangan matriks.
    • Menghitung determinan matriks (misalnya, menggunakan np.linalg.det()).
    • Menghitung invers matriks (misalnya, menggunakan np.linalg.inv()). Perhatikan bahwa tidak semua matriks memiliki invers.
  4. Sistem Persamaan Linear: Gunakan numpy untuk menyelesaikan sistem persamaan linear sederhana. Misalnya, untuk sistem: x + 2y = 1 3x + 5y = 2 Ini bisa direpresentasikan sebagai Az = C, di mana A adalah matriks koefisien, z adalah vektor variabel, dan C adalah vektor konstanta. Solusinya adalah z = A_inv * C. Kamu bisa menggunakan np.linalg.solve(A, C).

Kamu bisa mengembangkan ini menjadi kalkulator matriks interaktif, atau menggunakannya untuk menyelesaikan sistem persamaan linear.

Referensi dan Materi Pendamping

Langkah Selanjutnya

Bab 21 membahas Penutup dan Langkah Selanjutnya. Sebelum melanjutkan, pastikan kamu dapat menjelaskan tujuan belajar dan menyelesaikan tiga latihan inti bab ini.

Edisi September 2026. Nomor contoh, pertanyaan, dan latihan digunakan bersama pada buku dan halaman ini.

Bab 19 | Bab 21