6
Mengambil Keputusan
Bab ini akan mengajarkan Anda alat Scratch yang Anda butuhkan untuk menulis program yang dapat membandingkan nilai, mengevaluasi ekspresi logis, dan mengambil keputusan berdasarkan hasilnya. Kita juga akan membahas beberapa contoh aplikasi yang berguna. Berikut adalah hal-hal yang akan Anda pelajari:
• Teknik pemecahan masalah dasar
• Cara menggunakan blok if dan if/else untuk memilih di antara tindakan alternatif
• Cara membangun ekspresi logis untuk mengevaluasi kondisi yang diberikan
• Alur kontrol dalam pernyataan percabangan
Program yang telah kita tulis sejauh ini mengikuti model eksekusi yang sederhana.
Program dimulai dengan instruksi pertama, mengeksekusinya, melanjutkan ke instruksi berikutnya, dan seterusnya hingga mencapai akhir program. Blok perintah program ini dieksekusi secara berurutan, tanpa melewatkan atau melompat.
Namun, dalam banyak situasi pemrograman, Anda mungkin ingin mengubah alur eksekusi program yang berurutan ini. Jika Anda menulis aplikasi untuk membimbing anak-anak dalam aritmatika dasar, Anda ingin mengeksekusi blok tertentu untuk memberi penghargaan pada jawaban yang benar dan serangkaian blok yang sama sekali berbeda untuk jawaban yang salah (untuk mengungkapkan jawaban yang benar atau menawarkan kesempatan lain, misalnya).
Skrip Anda dapat memutuskan apa yang harus dilakukan selanjutnya dengan membandingkan input siswa dengan jawaban yang benar. Ini adalah dasar dari semua tugas pengambilan keputusan. Dalam bab ini, kita akan menjelajahi perintah pengambilan keputusan yang tersedia di Scratch dan menulis beberapa program yang menggunakan perintah ini untuk menguji input dan melakukan berbagai tindakan.
Pertama, saya akan memperkenalkan Anda pada operator perbandingan Scratch dan menunjukkan bagaimana Anda dapat menggunakannya untuk membandingkan angka, huruf, dan string. Kemudian, saya akan memperkenalkan blok if dan if/else dan menjelaskan peran kuncinya dalam pengambilan keputusan. Anda juga akan mempelajari cara menguji beberapa kondisi menggunakan blok if dan if/else bersarang dan menulis program berbasis menu untuk menjalankan blok-blok ini. Setelah itu, saya akan memperkenalkan operator logika sebagai cara alternatif untuk menguji beberapa kondisi. Di bagian terakhir, kita akan menulis beberapa program menarik berdasarkan semua konsep yang telah Anda pelajari sejauh ini.
Operator Perbandingan
Anda membuat keputusan setiap hari, dan setiap keputusan biasanya mengarah pada tindakan tertentu. Misalnya, Anda mungkin berpikir, “Jika mobil itu kurang dari $2.000, saya akan membelinya.” Kemudian Anda menanyakan harga mobil tersebut dan memutuskan apakah Anda ingin membelinya atau tidak.
Anda juga dapat membuat keputusan di Scratch. Dengan menggunakan operator perbandingan,
Anda dapat membandingkan nilai dua variabel atau ekspresi untuk menentukan apakah satu lebih besar dari, kurang dari, atau sama dengan yang lain. Operator perbandingan juga disebut operator relasional karena menguji hubungan antara dua nilai. Tiga operator relasional yang didukung di Scratch ditunjukkan pada Tabel 6-1.
.png)
Tabel 6-1: Operator Relasional di ScratchBoolean di Dunia Nyata
Kata Boolean digunakan untuk menghormati George Boole, seorang matematikawan Inggris abad ke-19 yang menciptakan sistem logika berdasarkan hanya dua nilai: 1 dan 0 (atau Benar dan Salah). Aljabar Boolean akhirnya menjadi dasar ilmu komputer modern.
Dalam kehidupan nyata, kita menggunakan ekspresi Boolean sepanjang waktu untuk membuat keputusan. Komputer juga menggunakannya untuk menentukan cabang program mana yang harus diikuti. Lengan robot dapat diprogram untuk memeriksa bagian-bagian yang bergerak pada jalur perakitan dan memindahkan setiap bagian ke Bin 1 jika goodQuality = benar, atau Bin 2 jika goodQuality = salah. Sistem keamanan rumah biasanya diprogram untuk membunyikan alarm jika kode yang salah dimasukkan (correctCode = salah) atau menonaktifkannya ketika kita memasukkan kode yang benar (correctCode = benar). Server jarak jauh dapat memberikan atau menolak akses ketika Anda menggesek kartu kredit Anda di toko berdasarkan apakah kartu Anda valid (benar) atau tidak valid (salah). Komputer di kendaraan Anda akan secara otomatis mengaktifkan airbag ketika memutuskan bahwa telah terjadi tabrakan (tabrakan = benar). Ponsel Anda mungkin menampilkan ikon peringatan ketika baterai lemah (batteryLow = benar) dan menghilangkan ikon tersebut ketika daya baterai mencukupi (batteryLow = salah).
Ini hanyalah beberapa contoh bagaimana komputer menyebabkan tindakan yang berbeda dilakukan dengan memeriksa hasil kondisi Boolean.
Perhatikan bahwa blok-blok dalam Tabel 6-1 semuanya berbentuk heksagonal. Seperti yang mungkin Anda ingat dari Bab 5, itu berarti hasil evaluasi salah satu blok ini adalah nilai Boolean, yang bisa berupa benar atau salah. Karena alasan ini, ekspresi ini juga disebut ekspresi Boolean. Misalnya, ekspresi price < 2000 menguji apakah nilai variabel price kurang dari 2.000. Jika price kurang dari 2.000, blok tersebut mengembalikan (atau dievaluasi menjadi) benar; jika tidak, ia mengembalikan salah. Anda dapat menggunakan ekspresi ini untuk membangun kondisi keputusan Anda dalam bentuk, “Jika (harga < 2000), maka beli mobil.” Sebelum kita melihat blok if, yang memungkinkan Anda untuk menerapkan pengujian seperti itu, mari kita bahas contoh sederhana yang menggambarkan bagaimana ekspresi Boolean dievaluasi di Scratch.
Mengevaluasi Ekspresi Boolean
Katakanlah kita menetapkan dua variabel, x dan y, sebagai berikut: x = 5, dan y = 10. Tabel 6-2 menunjukkan beberapa contoh yang menggunakan blok relasional Scratch.
Contoh-contoh ini mengungkapkan beberapa poin penting tentang operator relasional. Pertama, kita dapat menggunakannya untuk membandingkan variabel individual (seperti x, y) dan ekspresi lengkap (seperti 2 * x dan x + 6). Kedua, hasil perbandingan selalu benar atau salah (yaitu, nilai Boolean). Ketiga, blok x = y tidak berarti “Tetapkan x sama dengan y.” Sebaliknya, ia bertanya, “Apakah x sama dengan y?” Jadi ketika pernyataan set z to (x = y) dieksekusi, nilai x tetap 5.
.png)
Tabel 6-2: Contoh Penggunaan Blok Relasional
Membandingkan Huruf dan String
Mari kita pikirkan sebuah permainan di mana pemain mencoba menebak kode rahasia satu huruf antara A dan Z. Permainan membaca tebakan pemain, membandingkannya dengan kode rahasia, dan menginstruksikan pemain untuk memperbaiki tebakannya berdasarkan urutan abjad huruf. Misalnya, jika huruf rahasianya adalah G, dan pemain memasukkan B, permainan harus mengatakan sesuatu seperti "Setelah B" untuk memberi tahu pemain bahwa kode rahasia berada setelah huruf B dalam abjad. Bagaimana Anda dapat membandingkan huruf yang benar dengan masukan pemain untuk memutuskan pesan apa yang akan ditampilkan?
Untungnya, operator relasional di Scratch juga dapat membandingkan huruf. Seperti yang diilustrasikan pada Gambar 6-1, Scratch membandingkan huruf berdasarkan urutan abjadnya. Karena huruf A berada sebelum huruf B dalam abjad, ekspresi A < B mengembalikan nilai benar. Namun, penting untuk dicatat bahwa perbandingan ini tidak peka terhadap huruf besar/kecil; huruf kapital A sama dengan huruf kecil a. Dengan demikian, ekspresi A = a juga menghasilkan nilai benar.
.png)
Gambar 6-1: Menggunakan operator relasional untuk membandingkan huruf
Dengan mengetahui informasi ini, Anda dapat menguji tebakan pemain menggunakan serangkaian kondisi berikut:
.png)
JIKA (jawaban = kode rahasia), maka katakan Benar
JIKA (jawaban > kode rahasia), maka katakan Sebelum <jawaban>
JIKA (jawaban < kode rahasia), maka katakan Setelah <jawaban>
Kondisi adalah pernyataan dalam bentuk, “Jika kondisi benar, maka lakukan tindakan ini.” Di bagian selanjutnya, saya akan mengajari Anda cara menerapkan kondisi di Scratch, tetapi mari kita jelajahi operator relasional lebih lanjut dengan permainan tebak kode kita terlebih dahulu.
Bagaimana jika kode rahasia berisi lebih dari satu huruf? Misalnya, pemain mungkin perlu menebak nama hewan. Bisakah Anda tetap menggunakan operator relasional Scratch untuk melakukan perbandingan? Untungnya, jawaban singkatnya adalah ya:
Anda dapat menggunakan operator relasional Scratch untuk membandingkan string. Tetapi bagaimana Scratch memproses perbandingan seperti gajah > tikus? Contoh pada Gambar 6-2 mengilustrasikan hasil perbandingan string.
.png)
Gambar 6-2: Menggunakan operator relasional untuk membandingkan u string yang identik, v string yang hanya berbeda dalam huruf besar/kecil, w satu string dengan string lain yang berisi spasi tambahan, dan x string yang bervariasi sesuai dengan urutan kamus hurufnya
Dengan mengetahui hal ini, Anda seharusnya tidak terkejut ketika ekspresi elephant > mouse dievaluasi menjadi false, meskipun gajah sebenarnya jauh lebih besar daripada tikus. Menurut aturan perbandingan string Scratch, string "elephant" lebih kecil daripada string "mouse" karena huruf e (huruf pertama dalam elephant) berada sebelum huruf m (huruf pertama dalam mouse) dalam alfabet. Membandingkan dan mengurutkan string berdasarkan urutan alfabet karakternya digunakan dalam banyak situasi kehidupan nyata, termasuk mengurutkan daftar direktori, buku di rak buku, kata-kata dalam kamus, dan sebagainya. Kata elephant berada sebelum kata mouse dalam kamus, dan perbandingan string di Scratch memberikan jawaban berdasarkan urutan ini. Sekarang setelah Anda memahami apa itu operator relasional dan bagaimana Scratch menggunakan operator ini untuk membandingkan angka dan string, saatnya untuk mempelajari tentang blok kondisional.
Struktur Keputusan
Palet Kontrol Scratch berisi dua blok yang memungkinkan Anda untuk membuat keputusan dan mengontrol tindakan dalam program Anda: blok if dan blok if/else. Dengan menggunakan blok-blok ini, Anda dapat mengajukan pertanyaan dan mengambil tindakan berdasarkan jawabannya. Di bagian ini, kita akan membahas kedua blok ini secara detail, berbicara tentang flag, dan belajar menguji beberapa kondisi dengan blok if bersarang. Kemudian saya akan memperkenalkan aplikasi berbasis menu dan menjelaskan bagaimana blok if bersarang dapat membantu implementasinya.
Blok if
Blok if adalah struktur keputusan yang memberi Anda kemampuan untuk menentukan apakah serangkaian perintah harus (atau tidak boleh) dieksekusi berdasarkan hasil kondisi pengujian. Struktur blok if dan diagram alirnya ditunjukkan pada Gambar 6-3.
.png)
Gambar 6-3: Struktur blok if
Pada Gambar 6-3, bentuk berlian mewakili blok keputusan yang memberikan jawaban ya/tidak (atau benar/salah) untuk sebuah pertanyaan. Jika kondisi pengujian di header blok if benar, program akan mengeksekusi perintah yang tercantum di dalam badan sebelum melanjutkan ke perintah yang mengikuti blok if (Perintah M pada gambar). Jika kondisi pengujian salah, program akan melewati perintah-perintah tersebut dan langsung menuju Perintah M.
Studi yang cermat terhadap Gambar 6-2 menunjukkan hal berikut:
• Scratch membandingkan string tanpa memperhatikan huruf besar/kecilnya. String “HELLO” dan “hello” dalam v, misalnya, dianggap sama.
• Scratch menghitung spasi dalam perbandingannya. String “HELLO”, yang dimulai dan diakhiri dengan satu spasi, tidak sama dengan string
“HELLO” w.
• Saat membandingkan string “ABC” dan “ABD”, seperti dalam x, Scratch pertama-tama
mempertimbangkan karakter pertama dalam kedua string. Karena karakter tersebut sama (huruf A dalam kasus ini), Scratch memeriksa karakter kedua dalam kedua string. Karena karakter ini juga sama dalam kedua string, Scratch melanjutkan untuk memeriksa karakter ketiga. Karena huruf C lebih kecil dari huruf D (yaitu, C berada sebelum D dalam alfabet), Scratch menganggap string pertama lebih kecil dari string kedua.
Untuk melihat blok if beraksi, buat skrip yang ditunjukkan pada Gambar 6-4 dan jalankan. Skrip tersebut menjalankan loop selamanya yang menggerakkan sprite di sekitar panggung, mengubah warnanya, dan membuatnya memantul dari tepi Panggung.
.png)
Gambar 6-4: Skrip ini menyebabkan sprite mengubah warnanya hanya ketika bergerak di bagian kanan Panggung.
Loop selamanya dalam skrip kita berisi blok if yang memeriksa posisi x sprite setelah setiap perintah gerak. Jika posisi x lebih besar dari nol, sprite harus mengubah warnanya. Saat Anda menjalankan skrip ini, Anda akan melihat bahwa sprite mengubah warnanya hanya ketika bergerak di bagian kanan Panggung. Ini karena blok efek perubahan warna sebesar 25 dieksekusi hanya ketika kondisi posisi x > 0 benar.
Menggunakan Variabel sebagai Bendera
Misalnya, Anda sedang mengembangkan game petualangan luar angkasa di mana tujuannya adalah untuk menghancurkan armada kapal perang penyerang. Pemain, yang berperan sebagai kapten, mengendalikan pesawat ruang angkasa dengan tombol panah pada keyboard dan menembakkan rudal dengan menekan spasi. Jika pesawat ruang angkasa pemain terkena tembakan musuh beberapa kali, kapal tersebut kehilangan kemampuan untuk menyerang. Pada titik ini, menekan spasi seharusnya tidak lagi menembakkan rudal, dan kapten harus mengadopsi strategi pertahanan untuk menghindari terkena tembakan lagi. Jelas, ketika spasi ditekan, program Anda perlu memeriksa status sistem serangan pesawat ruang angkasa untuk memutuskan apakah pemain dapat menembak atau tidak.
Pemeriksaan semacam ini biasanya dilakukan menggunakan flag, yaitu variabel yang Anda gunakan untuk menunjukkan apakah suatu peristiwa yang diminati telah terjadi atau tidak. Anda dapat menggunakan dua nilai apa pun untuk menggambarkan status peristiwa tersebut, tetapi praktik umum adalah menggunakan 0 (atau false) untuk menunjukkan bahwa peristiwa tersebut belum terjadi dan 1 (atau true) untuk menunjukkan bahwa peristiwa tersebut telah terjadi.
Dalam game penembak ruang angkasa Anda, Anda dapat menggunakan flag bernama canFire untuk menunjukkan status pesawat ruang angkasa. Nilai 1 berarti bahwa pesawat ruang angkasa dapat menembakkan rudal, dan nilai 0 berarti bahwa pesawat tersebut tidak dapat menembakkan rudal. Berdasarkan hal ini, penanganan kejadian spasi Anda mungkin dikodekan seperti yang ditunjukkan pada Gambar 6-5.
.png)
Pada awal permainan, Anda akan menginisialisasi nilai flag canFire menjadi 1 untuk menunjukkan bahwa Pesawat luar angkasa mampu menembakkan rudal. Ketika pesawat luar angkasa terkena tembakan musuh dalam jumlah tertentu, Anda akan mengatur flag canFire menjadi 0 untuk menunjukkan bahwa sistem serangan telah menjadi tidak berfungsi; pada saat itu, menekan spasi tidak akan menembakkan rudal lagi.
Meskipun Anda dapat memberi nama flag Anda sesuka hati, saya sarankan untuk menggunakan nama yang mencerminkan sifat benar/salahnya. Tabel 6-3 menunjukkan beberapa contoh flag yang mungkin Anda gunakan dalam game penembak luar angkasa.
.png)
Tabel 6-3: Beberapa Contoh Penggunaan Flag
Sekarang Anda tahu cara menggunakan blok if dan flag, mari kita bahas tentang blok kondisional lain, yang memungkinkan Anda mengeksekusi satu blok kode ketika kondisi tertentu benar dan blok lain jika kondisi tersebut salah.
Blok if/else
Bayangkan Anda sedang membuat game untuk mengajarkan matematika dasar kepada siswa sekolah dasar. Game tersebut menyajikan soal penjumlahan dan kemudian meminta siswa untuk memasukkan jawaban. Siswa harus menerima satu poin untuk jawaban yang benar dan kehilangan satu poin untuk jawaban yang salah. Anda dapat melakukan tugas ini menggunakan dua pernyataan if:
Jika jawabannya benar, tambahkan satu poin ke skor
Jika jawabannya salah, kurangi satu poin dari skor
Anda juga dapat menyederhanakan logika ini—dan membuat kode lebih efisien—dengan menggabungkan kedua pernyataan if menjadi satu pernyataan if/else sebagai berikut:
Jika jawabannya benar
tambahkan satu poin ke skor
Jika tidak
kurangi satu poin dari skor