// Menyertakan library matematika untuk fungsi sqrt() dan pow()
#include <math.h>
void setup() {
// Memulai komunikasi serial pada 9600 bps
Serial.begin(9600);
while (!Serial) {
; // Tunggu koneksi Serial Monitor terbuka
}
// Pesan awal
Serial.println("=========================================");
Serial.println(" Selamat Datang di Game Perkalian Skalar Vektor ");
Serial.println("=========================================");
Serial.println("Aturan:");
Serial.println("- Kanan (i) adalah sumbu X positif.");
Serial.println("- Maju (j) adalah sumbu Y positif.");
Serial.println("Tujuan: Buktikan hasil perkalian skalar F dengan perintah.");
Serial.println("Pastikan Serial Monitor diatur ke 'Newline'.");
Serial.println();
}
void loop() {
// 1. MEMINTA INPUT UNTUK VEKTOR F
Serial.println("--- Masukkan Komponen Vektor F ---");
int f_i = 0; // Komponen i (sumbu X) dari vektor F
int f_j = 0; // Komponen j (sumbu Y) dari vektor F
Serial.print("Masukkan komponen i untuk F (cth: 3): ");
f_i = bacaAngkaSerial();
Serial.print("\nMasukkan komponen j untuk F (cth: 2): ");
f_j = bacaAngkaSerial();
Serial.print("\n-> Vektor F = ");
Serial.print(f_i);
Serial.print("i + ");
Serial.print(f_j);
Serial.println("j\n");
// 2. MEMINTA INPUT UNTUK SKALAR (PERBESARAN)
Serial.println("--- Masukkan Skalar Pengali ---");
int skalar = 0;
Serial.print("Masukkan nilai perbesaran vektor (cth: 2 atau -3): ");
skalar = bacaAngkaSerial();
Serial.print("\n-> Skalar Pengali = ");
Serial.println(skalar);
Serial.println();
// 3. HITUNG VEKTOR HASIL (RESULTAN) SECARA INTERNAL
int targetX = f_i * skalar;
int targetY = f_j * skalar;
// 4. MEMINTA INPUT RANGKAIAN PERINTAH
Serial.println("--- Tahap Pembuktian ---");
Serial.print("Sekarang, hitung (");
Serial.print(skalar);
Serial.print(") * F.");
Serial.println("\nMasukkan rangkaian perintah (kanan, kiri, maju, mundur)");
Serial.println("yang dipisahkan koma untuk membuktikan hasilnya.");
Serial.print("> ");
String inputPerintah = bacaInputSerial();
// 5. PROSES INPUT DAN HITUNG POSISI AKHIR
int posisiX = 0;
int posisiY = 0;
int indexAwal = 0;
while (indexAwal < inputPerintah.length()) {
int indexKoma = inputPerintah.indexOf(',', indexAwal);
if (indexKoma == -1) {
indexKoma = inputPerintah.length();
}
String perintah = inputPerintah.substring(indexAwal, indexKoma);
perintah.trim();
if (perintah.equalsIgnoreCase("kanan")) {
posisiX++;
} else if (perintah.equalsIgnoreCase("kiri")) {
posisiX--;
} else if (perintah.equalsIgnoreCase("maju")) {
posisiY++;
} else if (perintah.equalsIgnoreCase("mundur")) {
posisiY--;
}
indexAwal = indexKoma + 1;
}
// 6. TAMPILKAN HASIL AKHIR
Serial.println("\n--- Hasil Akhir Pembuktian ---");
Serial.print("Posisi akhir berdasarkan perintah Anda: (");
Serial.print(posisiX);
Serial.print(", ");
Serial.print(posisiY);
Serial.println(")");
if (posisiX == targetX && posisiY == targetY) {
Serial.println("✅ Selamat! Rangkaian perintah Anda sudah benar.");
// Tampilkan detail vektor hasil HANYA JIKA jawaban benar
Serial.println("\n--- Detail Vektor Hasil ---");
Serial.print("Hasil perkalian skalar adalah: ");
Serial.print(targetX);
Serial.print("i + ");
Serial.print(targetY);
Serial.println("j");
// Hitung panjang/magnitude dari vektor resultan
float panjangVektor = sqrt(pow(targetX, 2) + pow(targetY, 2));
Serial.print("Panjang (magnitude) dari vektor resultan adalah: ");
Serial.print(panjangVektor);
Serial.println(" unit.");
} else {
Serial.println("❌ Maaf, rangkaian perintah Anda salah.");
Serial.print("Titik tujuan yang seharusnya adalah: (");
Serial.print(targetX);
Serial.print(", ");
Serial.print(targetY);
Serial.println(")");
}
Serial.println("=========================================");
Serial.println("\nMemulai permainan baru dalam 5 detik...\n");
delay(5000);
}
/**
* Fungsi pembantu untuk membaca input string dari Serial Monitor.
*/
String bacaInputSerial() {
while (Serial.available() == 0) { }
String input = Serial.readStringUntil('\n');
input.toLowerCase();
return input;
}
/**
* Fungsi pembantu untuk membaca angka integer dari Serial Monitor.
*/
int bacaAngkaSerial() {
while (Serial.available() == 0) { }
int angka = Serial.parseInt();
while(Serial.available()) { Serial.read(); }
return angka;
}