✊✋✌️ Project Python: Batu Gunting Kertas
Game klasik seru melawan komputer, dibuat dengan Python.
๐ฏ Tujuan Pembelajaran
Project singkat ini dirancang untuk pemula yang ingin memahami konsep dasar pemrograman dengan praktik langsung — membuat permainan interaktif sederhana. Sambil membuat game, kamu akan belajar cara menerima input dari pengguna, menggunakan logika percabangan (if/else), memanfaatkan modul standar Python (random), serta menyusun alur program yang bersih dan mudah dimengerti.
- Menggunakan modul
randomuntuk membuat keputusan komputer. - Mengaplikasikan struktur kontrol seperti
if-elsedan operator logika. - Melatih cara membaca, menulis, dan menguji kode — skill penting untuk pembelajaran lanjutan.
- Mempelajari pendekatan pengembangan bertahap: dari versi terminal sederhana hingga GUI atau multiplayer.
๐ Mengapa Mulai dari Game Sederhana?
Permainan seperti Batu Gunting Kertas ideal sebagai project pembelajaran karena aturannya sederhana, alur logika jelas, dan variasinya banyak. Dengan hanya empat elemen utama — input, proses perbandingan, output, dan pengulangan — seorang pemula bisa mempraktekkan dasar-dasar programming dan langsung melihat hasilnya.
tkinter, membuat scoreboard, atau mempelajari bagaimana menyimpan hasil permainan menggunakan file.
๐ Sejarah Singkat & Konsep Permainan
Batu-Gunting-Kertas (rock-paper-scissors) adalah permainan tangan tradisional yang populer di berbagai budaya. Secara logika permainan, terdapat tiga pilihan yang saling berimbang: batu mengalahkan gunting, gunting mengalahkan kertas, dan kertas mengalahkan batu. Permainan ini juga sering dipakai sebagai metode sederhana untuk mengambil keputusan secara acak atau adil (misalnya untuk menentukan giliran).
Dalam pengkodean, permainan ini memberikan contoh yang bagus tentang bagaimana menyusun aturan (rules) dalam kode — yaitu bagaimana setiap pasangan pilihan memiliki hasil tertentu (menang, kalah, atau seri).
๐ป Kode Program (Versi Terminal Sederhana)
Berikut adalah versi kode yang ringkas namun lengkap untuk dijalankan di terminal (command line). Kode ini dibuat agar mudah dibaca dan diikuti oleh pemula.
import random
choices = ["batu", "gunting", "kertas"]
print("✊✋✌️ Selamat datang di game Batu Gunting Kertas!\n")
user = input("Pilih (batu/gunting/kertas): ").strip().lower()
computer = random.choice(choices)
print(f"\nKamu memilih: {user}")
print(f"Komputer memilih: {computer}\n")
if user == computer:
print("๐ค Seri!")
elif (user == "batu" and computer == "gunting") or \
(user == "gunting" and computer == "kertas") or \
(user == "kertas" and computer == "batu"):
print("๐ Kamu Menang!")
else:
print("๐ข Kamu Kalah!")
๐ Penjelasan Baris per Baris
Agar jelas, mari kita bahas fungsi dan tujuan setiap bagian kode:
import random— Mengambil modulrandomdari pustaka standar Python. Kita menggunakan ini untuk memilih pilihan komputer secara acak.choices = ["batu", "gunting", "kertas"]— Daftar opsi yang valid. Menyimpan opsi di sebuah list memudahkan pemanggilan dan validasi.- Menerima input dari pengguna:
input("Pilih (batu/gunting/kertas): ").strip().lower(). Metodestrip()menghapus spasi berlebih, sedangkanlower()menyamakan huruf menjadi kecil sehingga input tidak sensitif huruf besar/kecil. computer = random.choice(choices)— Komputer memilih salah satu dari listchoicessecara acak.- Membandingkan hasil: Blok
if-elif-elsemembandingkan pilihan user dan komputer lalu mencetak hasilnya.
⚠️ Validasi Input & Penanganan Kesalahan
Pada kode di atas, bila pengguna mengetik sesuatu yang bukan batu, gunting, atau kertas, program tetap menjalankan perbandingan dan hasilnya mungkin akan menampilkan "Kamu Kalah!" walaupun lebih baik kita beri pesan validasi. Berikut versi yang menambahkan validasi sederhana:
import random
choices = ["batu", "gunting", "kertas"]
print("✊✋✌️ Selamat datang di game Batu Gunting Kertas!\n")
user = input("Pilih (batu/gunting/kertas): ").strip().lower()
if user not in choices:
print("Input tidak valid. Harap ketik: batu, gunting, atau kertas.")
else:
computer = random.choice(choices)
print(f"\nKamu memilih: {user}")
print(f"Komputer memilih: {computer}\n")
if user == computer:
print("๐ค Seri!")
elif (user == "batu" and computer == "gunting") or \
(user == "gunting" and computer == "kertas") or \
(user == "kertas" and computer == "batu"):
print("๐ Kamu Menang!")
else:
print("๐ข Kamu Kalah!")
๐งญ Alur Program yang Lebih Interaktif (Loop & Skor)
Versi selanjutnya menambahkan loop sehingga pemain bisa bermain berkali-kali dan kita dapat menyimpan skor. Ini latihan bagus untuk memahami pengulangan (while) dan variabel akumulator (penjumlah skor).
import random
choices = ["batu", "gunting", "kertas"]
score_user = 0
score_computer = 0
rounds = 0
print("✊✋✌️ Game Batu Gunting Kertas - Best of N")
n = int(input("Main sampai berapa ronde? (misal 3 untuk best of 3): "))
while rounds < n:
user = input("Pilih (batu/gunting/kertas): ").strip().lower()
if user not in choices:
print("Input tidak valid, coba lagi.")
continue
computer = random.choice(choices)
print(f"Kamu: {user} | Komputer: {computer}")
if user == computer:
print("Seri!")
elif (user == "batu" and computer == "gunting") or \
(user == "gunting" and computer == "kertas") or \
(user == "kertas" and computer == "batu"):
print("Kamu mendapatkan 1 poin!")
score_user += 1
else:
print("Komputer mendapatkan 1 poin!")
score_computer += 1
rounds += 1
print(f"Skor sekarang — Kamu: {score_user} | Komputer: {score_computer}\n")
if score_user > score_computer:
print("๐ Kamu Juara!")
elif score_user < score_computer:
print("๐ Komputer Juara!")
else:
print("๐ค Seri keseluruhan!")
๐งฐ Tips Debugging & Kesalahan Umum
Berikut beberapa pola masalah yang sering ditemui pemula dan cara mengatasinya:
- Typo pada input: Pastikan
userdibandingkan dengan string yang benar. Selalu gunakanstrip()danlower()untuk normalisasi. - IndexError / NameError: Variabel belum didefinisikan. Selalu inisialisasi variabel sebelum digunakan.
- Loop tak berakhir: Jika menggunakan
while, pastikan kondisi berhenti (counter atau flag) diperbarui setiap iterasi. - Perbandingan logika salah: Ketika menulis kombinasi
elif, gunakan operator logika dengan benar dan kelompokan kondisi memakai tanda kurung bila perlu.
๐ Pengembangan Lanjutan (Ide dan Contoh)
1. Menambahkan Sistem Skor Lebih Rinci
Buatlah riwayat permainan yang menyimpan setiap ronde, waktu main, dan pilihan. Data ini bisa disimpan di file teks (CSV) sehingga bisa dianalisis kemudian, misalnya untuk melihat pilihan paling sering dipilih pemain.
2. GUI Menggunakan tkinter
Untuk membuat program lebih ramah pengguna, kamu bisa membuat antarmuka grafis. Berikut contoh kerangka dasar GUI sederhana untuk game ini:
import random
import tkinter as tk
from tkinter import messagebox
choices = ["batu", "gunting", "kertas"]
def play(user_choice):
comp = random.choice(choices)
# logika menentukan pemenang (sama seperti versi terminal)
# lalu update label hasil dan skor
root = tk.Tk()
root.title("Batu Gunting Kertas")
# contoh tombol
btn_batu = tk.Button(root, text="✊ Batu", command=lambda: play("batu"))
btn_gunting = tk.Button(root, text="✌️ Gunting", command=lambda: play("gunting"))
btn_kertas = tk.Button(root, text="✋ Kertas", command=lambda: play("kertas"))
btn_batu.pack()
btn_gunting.pack()
btn_kertas.pack()
root.mainloop()
Versi GUI memungkinkan penggunaan ikon, suara, dan animasi sederhana sehingga permainan terasa lebih hidup. Untuk menampilkan ikon lebih menarik, gunakan gambar PNG dan widget PhotoImage.
3. Mode Multiplayer (Lokal)
Untuk latihan logika, buat mode dua pemain di satu keyboard (giliran pertama tekan, lalu giliran kedua). Atau untuk pengalaman lebih kompleks, buat server kecil dengan socket sehingga dua pemain di komputer berbeda bisa bermain bersama.
4. Menambahkan Komponen AI Lebih Pintar
Meskipun pilihan komputer acak sudah cukup, kamu bisa membuat lawan yang 'belajar' pola pengguna. Contoh sederhana: catat pilihan pemain selama 20 ronde terakhir, lalu perkirakan pilihan yang paling sering dipilih dan pilih counter yang tepat. Ini dapat dijadikan pengantar machine learning sederhana.
๐ Studi Kasus: Dari Terminal ke Aplikasi Kelas
Bayangkan kamu adalah guru yang ingin membuat tugas praktikum: minta siswa membuat versi terminal terlebih dahulu, lalu tingkatkan menjadi GUI, dan terakhir presentasikan fitur tambahan seperti scoreboard yang tersimpan di file. Penilaian dapat didasarkan pada fungsi (kode berjalan sesuai deskripsi), kerapihan kode (PEP8), dan dokumentasi (penjelasan singkat tiap fungsi).
๐งฉ Rincian Pengembangan: Checklist Fitur
- Validasi input — Pastikan program menolak input tidak valid.
- Skor & Ronde — Implementasikan penghitung ronde dan skor.
- Sistem simpan — Ekspor hasil ke CSV atau JSON.
- GUI dasar — Tombol, label hasil, dan tampilan skor.
- Animasi/Feedback — Tambahkan delay singkat untuk efek dramatis.
- Mode AI — Adaptasi pola pengguna untuk membuat lawan lebih menantang.
๐ก Contoh Implementasi: Menyimpan Hasil ke File (CSV)
Menyimpan data permainan berguna untuk pengajaran atau analisis. Contoh singkat:
import csv
from datetime import datetime
def save_result(user, computer, result):
with open('hasil_game.csv', mode='a', newline='') as file:
writer = csv.writer(file)
writer.writerow([datetime.now().isoformat(), user, computer, result])
Setiap baris di file CSV berisi timestamp, pilihan pemain, pilihan komputer, dan hasil (Menang/Kalah/Seri). Data ini bisa dibuka di Excel atau Google Sheets untuk analisis sederhana.
๐ฌ Variasi Permainan & Eksperimen
Agar siswa memahami bagaimana aturan berpengaruh terhadap logika, coba beberapa variasi:
- Rock-Paper-Scissors-Lizard-Spock — Versi 5 pilihan yang dibuat populer oleh acara TV. Menambah kompleksitas logika perbandingan.
- Best of N — Main sampai satu pemain mencapai N kemenangan.
- Score Decay — Skor bertambah dan berkurang untuk memperkenalkan konsep negatif/positif weighting.
๐ง Pembelajaran dari Project Ini
Lewat project sederhana ini, beberapa kompetensi penting dapat dilatih:
- Logika pemrograman dasar (percabangan, pengulangan, struktur data sederhana).
- Handling input & validasi — keterampilan penting saat berinteraksi dengan user.
- Prinsip desain program: memecah masalah menjadi fungsi, dokumentasi, dan penamaan variabel yang jelas.
- Data persistence — teknik menyimpan data sederhana (file CSV/JSON).
๐งพ Praktik Baik Penulisan Kode (Coding Style)
Untuk membuat kode yang mudah dipelajari dan dirawat:
- Gunakan nama variabel yang jelas:
score_user,score_computer. - Pisahkan logika menjadi fungsi kecil (single responsibility principle).
- Tambahkan komentar singkat untuk bagian yang tidak trivially jelas.
- Ikuti pedoman PEP8 untuk Python agar format konsisten.
๐ Contoh Refaktor: Fungsi untuk Menentukan Pemenang
Alih-alih menulis kondisi panjang dalam if-elif di setiap ronde, buat fungsi khusus:
def determine_winner(user, computer):
if user == computer:
return "seri"
wins = {
"batu": "gunting",
"gunting": "kertas",
"kertas": "batu"
}
if wins[user] == computer:
return "user"
else:
return "computer"
Fungsi ini membuat kode utama lebih bersih dan memudahkan pengetesan unit (unit testing).
๐งช Testing & Validasi
Sertakan beberapa tes sederhana untuk memastikan fungsi berjalan semestinya. Contoh pengujian manual:
- determine_winner("batu","gunting") → "user"
- determine_winner("kertas","gunting") → "computer"
- determine_winner("gunting","gunting") → "seri"
๐ Materi Tambahan untuk Guru / Pengajar
Jika kamu seorang pengajar, berikut saran alur pembelajaran dalam 1-2 pertemuan:
- Pertemuan 1: Pengenalan Python & latihan membuat versi terminal sederhana.
- Pertemuan 2: Menambahkan loop, skor, validasi input, dan menyimpan hasil ke file.
- Pertemuan 3 (opsional): GUI dengan
tkinteratau implementasi multiplayer sederhana.
๐ Contoh Lengkap: Program Terminal yang Lebih 'Siap Pakai'
Berikut contoh program yang menyatukan banyak fitur di atas (validasi, skor, loop, penyimpanan) menjadi satu file yang mudah dimodifikasi.
import random
import csv
from datetime import datetime
choices = ["batu", "gunting", "kertas"]
def determine_winner(user, computer):
if user == computer:
return "seri"
wins = {"batu": "gunting", "gunting": "kertas", "kertas": "batu"}
return "user" if wins[user] == computer else "computer"
def save_result(user, computer, result):
with open('hasil_game.csv', mode='a', newline='') as f:
writer = csv.writer(f)
writer.writerow([datetime.now().isoformat(), user, computer, result])
def main():
score_user = 0
score_computer = 0
print("Selamat datang! Ketik 'keluar' untuk mengakhiri permainan.")
while True:
user = input("Pilih (batu/gunting/kertas): ").strip().lower()
if user == 'keluar':
break
if user not in choices:
print("Input tidak valid.")
continue
computer = random.choice(choices)
result = determine_winner(user, computer)
if result == "user":
print("Kamu menang!")
score_user += 1
elif result == "computer":
print("Komputer menang!")
score_computer += 1
else:
print("Seri!")
save_result(user, computer, result)
print(f"Skor — Kamu: {score_user} | Komputer: {score_computer}")
print("Terima kasih sudah bermain!")
if __name__ == '__main__':
main()
๐ Ide Proyek Lanjutan untuk Portofolio
Setelah menyelesaikan versi dasar, pertimbangkan proyek lanjutan ini sebagai portfolio:
- Aplikasi GUI yang menyertakan animasi (dengan
tkinteratauPyQt). - Versi web menggunakan
FlaskatauDjango— tombol untuk memilih, logika server, dan scoreboard global (sederhana). - Implementasi AI sederhana: model Markov atau frekuensi pilihan lawan untuk memprediksi dan meng-counter.
๐ฏ Manfaat bagi Pembelajar & Relevansi Dunia Kerja
Mempelajari project sederhana seperti ini memberikan fondasi untuk problem solving. Perusahaan menghargai kemampuan untuk berpikir algoritmis, menulis kode bersih, serta kemampuan debugging. Selain itu, keterampilan menyusun dokumentasi, menulis README, dan mengemas proyek ke GitHub adalah praktik profesional yang sangat dihargai.
✅ Ringkasan & Kesimpulan
Project Batu Gunting Kertas adalah titik awal yang praktis dan menyenangkan untuk belajar pemrograman. Mulai dari versi terminal sederhana hingga GUI, setiap langkah menambah lapisan pemahaman: dari dasar sintaks hingga desain perangkat lunak sederhana. Terus eksperimen, buat variasi, dan dokumentasikan setiap langkah — itu cara terbaik untuk memperdalam pemahaman.
๐ Saran Penutup untuk Pembaca
Jika kamu baru mengenal Python, jalankan kode di atas, ubah sedikit demi sedikit, dan catat hasilnya. Baca juga dokumentasi resmi Python saat menemukan fungsi atau modul baru. Yang paling penting: konsistensi latihan. Dari program kecil seperti ini, kemampuanmu akan tumbuh cepat.
No comments:
Post a Comment