// 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 Penjumlahan 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 P + Q dengan perintah.");
Serial.println("Pastikan Serial Monitor diatur ke 'Newline'.");
Serial.println();
}
void loop() {
// 1. MEMINTA INPUT UNTUK VEKTOR P
Serial.println("--- Masukkan Komponen Vektor P ---");
int p_i = 0; // Komponen i (sumbu X) dari vektor P
int p_j = 0; // Komponen j (sumbu Y) dari vektor P
Serial.print("Masukkan komponen i untuk P (cth: 3): ");
p_i = bacaAngkaSerial();
Serial.print("\nMasukkan komponen j untuk P (cth: 2): ");
p_j = bacaAngkaSerial();
Serial.print("\n-> Vektor P = ");
Serial.print(p_i);
Serial.print("i + ");
Serial.print(p_j);
Serial.println("j\n");
// 2. MEMINTA INPUT UNTUK VEKTOR Q
Serial.println("--- Masukkan Komponen Vektor Q ---");
int q_i = 0; // Komponen i (sumbu X) dari vektor Q
int q_j = 0; // Komponen j (sumbu Y) dari vektor Q
Serial.print("Masukkan komponen i untuk Q (cth: -2): ");
q_i = bacaAngkaSerial();
Serial.print("\nMasukkan komponen j untuk Q (cth: 4): ");
q_j = bacaAngkaSerial();
Serial.print("\n-> Vektor Q = ");
Serial.print(q_i);
Serial.print("i + ");
Serial.print(q_j);
Serial.println("j\n");
// 3. HITUNG VEKTOR HASIL (RESULTAN) SECARA INTERNAL
int targetX = p_i + q_i;
int targetY = p_j + q_j;
// 4. MEMINTA INPUT RANGKAIAN PERINTAH
Serial.println("--- Tahap Pembuktian ---");
Serial.println("Sekarang, hitung P + Q.");
Serial.println("Masukkan 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 penjumlahan (P + Q) 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;
}