// 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 Fisika Vektor ");
Serial.println("=============================================");
Serial.println("Aturan:");
Serial.println("- Timur (i) adalah sumbu X positif.");
Serial.println("- Utara (j) adalah sumbu Y positif.");
Serial.println(" (Maka Selatan adalah Y negatif)");
Serial.println("Tujuan: Hitung posisi akhir & besar perpindahan.");
Serial.println("Pastikan Serial Monitor diatur ke 'Newline'.");
Serial.println();
}
void loop() {
// 1. MEMINTA INPUT VEKTOR KECEPATAN (v)
Serial.println("--- Masukkan Vektor Kecepatan (v) ---");
int v_i = 0; // Komponen i (Timur/Barat)
int v_j = 0; // Komponen j (Utara/Selatan)
Serial.print("Masukkan komponen i (Timur) untuk v (cth: 3): ");
v_i = bacaAngkaSerial();
Serial.print("\nMasukkan komponen j (Utara) untuk v (cth: -2): ");
v_j = bacaAngkaSerial();
Serial.print("\n-> Vektor Kecepatan v = ");
Serial.print(v_i);
Serial.print("i + ");
Serial.print(v_j);
Serial.println("j\n");
// 2. MEMINTA INPUT WAKTU (t)
Serial.println("--- Masukkan Waktu Tempuh (t) ---");
int waktu = 0;
Serial.print("Masukkan waktu dalam detik (cth: 3): ");
waktu = bacaAngkaSerial();
Serial.print("\n-> Waktu t = ");
Serial.print(waktu);
Serial.println(" detik\n");
// 3. HITUNG JAWABAN YANG BENAR SECARA INTERNAL
// Posisi akhir s = v * t
int targetX = v_i * waktu;
int targetY = v_j * waktu;
// Besar perpindahan |s| = sqrt(x^2 + y^2)
float targetPerpindahan = sqrt(pow(targetX, 2) + pow(targetY, 2));
// 4. TANTANGAN 1: MENEBAK VEKTOR POSISI AKHIR
Serial.println("--- Tantangan 1: Tentukan Vektor Posisi Akhir (s) ---");
Serial.println("Hitunglah s = v * t.");
int jawaban_i, jawaban_j;
Serial.print("Masukkan komponen i dari posisi akhir: ");
jawaban_i = bacaAngkaSerial();
Serial.print("\nMasukkan komponen j dari posisi akhir: ");
jawaban_j = bacaAngkaSerial();
// 5. VALIDASI TANTANGAN 1
if (jawaban_i == targetX && jawaban_j == targetY) {
Serial.println("\n✅ Benar! Vektor posisi akhir Anda tepat.");
Serial.print(" Vektornya adalah ");
Serial.print(targetX);
Serial.print("i + ");
Serial.print(targetY);
Serial.println("j\n");
// 6. TANTANGAN 2: MENEBAK BESAR PERPINDAHAN
Serial.println("--- Tantangan 2: Tentukan Besar Perpindahan ---");
Serial.println("Sekarang hitung panjang (magnitude) dari vektor posisi akhir.");
Serial.print("Masukkan jawaban Anda (bisa desimal, gunakan titik '.'): ");
float jawabanPerpindahan = bacaFloatSerial();
// 7. VALIDASI TANTANGAN 2 (dengan toleransi)
if (abs(jawabanPerpindahan - targetPerpindahan) < 0.1) {
Serial.println("\n✅ LUAR BIASA! Jawaban besar perpindahan Anda juga benar.");
Serial.print(" Besar perpindahannya adalah ");
Serial.print(targetPerpindahan);
Serial.println(" unit.");
} else {
Serial.println("\n❌ Sayang sekali, besar perpindahan Anda kurang tepat.");
Serial.print(" Jawaban yang benar adalah: ");
Serial.println(targetPerpindahan);
}
} else {
Serial.println("\n❌ Maaf, vektor posisi akhir Anda salah.");
Serial.print(" Jawaban yang benar seharusnya: ");
Serial.print(targetX);
Serial.print("i + ");
Serial.print(targetY);
Serial.println("j");
}
Serial.println("=============================================");
Serial.println("\nMemulai permainan baru dalam 7 detik...\n");
delay(7000);
}
/**
* Fungsi pembantu untuk membaca angka integer dari Serial Monitor.
*/
int bacaAngkaSerial() {
while (Serial.available() == 0) { }
int angka = Serial.parseInt();
// Buang sisa karakter di buffer (seperti newline)
while(Serial.available()) { Serial.read(); }
return angka;
}
/**
* Fungsi pembantu untuk membaca angka float dari Serial Monitor.
*/
float bacaFloatSerial() {
while (Serial.available() == 0) { }
float angka = Serial.parseFloat();
while(Serial.available()) { Serial.read(); }
return angka;
}