// 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 Vektor Arah ");
Serial.println("=========================================");
Serial.println("Aturan:");
Serial.println("- Timur adalah sumbu X positif.");
Serial.println("- Utara adalah sumbu Y positif.");
Serial.println("Pastikan Serial Monitor diatur ke 'Newline'.");
Serial.println();
}
void loop() {
// 1. MEMINTA INPUT KOORDINAT TUJUAN
Serial.println("--- Tahap Pengaturan Titik Tujuan ---");
int targetX = 0;
int targetY = 0;
Serial.print("Masukkan koordinat X tujuan (Timur/Barat, cth: 3 atau -2): ");
targetX = bacaAngkaSerial();
Serial.print("\nMasukkan koordinat Y tujuan (Utara/Selatan, cth: 4 atau -1): ");
targetY = bacaAngkaSerial();
Serial.print("\nTitik tujuan ditetapkan: (");
Serial.print(targetX);
Serial.print(", ");
Serial.print(targetY);
Serial.println(")");
Serial.println("-------------------------------------\n");
// 2. MEMINTA INPUT RANGKAIAN ARAH
Serial.println("--- Tahap Pergerakan ---");
Serial.println("Masukkan rangkaian perintah arah (timur, barat, utara, selatan)");
Serial.println("dipisahkan oleh koma untuk mencapai titik tujuan.");
Serial.print("Contoh: utara,timur,timur,utara\n> ");
String inputPerintah = bacaInputSerial();
// 3. 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(); // Hapus spasi di awal/akhir
if (perintah.equalsIgnoreCase("timur")) {
posisiX++;
} else if (perintah.equalsIgnoreCase("barat")) {
posisiX--;
} else if (perintah.equalsIgnoreCase("utara")) {
posisiY++;
} else if (perintah.equalsIgnoreCase("selatan")) {
posisiY--;
}
indexAwal = indexKoma + 1;
}
// 4. TAMPILKAN HASIL AKHIR
Serial.println("\n--- Hasil Akhir Simulasi ---");
Serial.print("Posisi akhir Anda berdasarkan perintah: (");
Serial.print(posisiX);
Serial.print(", ");
Serial.print(posisiY);
Serial.println(")");
if (posisiX == targetX && posisiY == targetY) {
Serial.println("✅ Selamat! Anda berhasil mencapai titik tujuan yang benar.");
// Hitung Perpindahan (besar vektor dari titik 0,0)
// Gunakan tipe data float untuk menampung hasil desimal
float perpindahan = sqrt(pow(posisiX, 2) + pow(posisiY, 2));
Serial.print("Besar vektor perpindahan dari (0,0) adalah: ");
Serial.print(perpindahan);
Serial.println(" unit.");
} else {
Serial.println("❌ Maaf, Anda tidak mencapai titik tujuan.");
Serial.print("Titik tujuan yang benar adalah: (");
Serial.print(targetX);
Serial.print(", ");
Serial.print(targetY);
Serial.println(")");
}
Serial.println("=========================================");
Serial.println("\nMemulai permainan baru dalam 5 detik...\n");
delay(5000); // Jeda agar hasil bisa dibaca
}
/**
* Fungsi pembantu untuk membaca input string dari Serial Monitor.
* Berhenti membaca ketika karakter newline ('\n') diterima.
*/
String bacaInputSerial() {
while (Serial.available() == 0) {
// Tunggu sampai ada data yang masuk
}
String input = Serial.readStringUntil('\n');
input.toLowerCase(); // Ubah semua input menjadi huruf kecil agar mudah diproses
return input;
}
/**
* Fungsi pembantu untuk membaca angka integer dari Serial Monitor.
*/
int bacaAngkaSerial() {
while (Serial.available() == 0) {
// Tunggu sampai ada data yang masuk
}
int angka = Serial.parseInt();
// Buang sisa karakter di buffer (seperti newline)
while(Serial.available()) {
Serial.read();
}
return angka;
}