Menu
CoddyTech

Simon: Game Lengkap

Termasuk bagian Proyek dalam perjalanan Arduino di Coddy. Pelajaran 16 dari 24.

Simon yang sebenarnya dimulai dari kecil lalu berkembang. Ronde 1 memainkan satu warna. Setiap kali kamu mengulangi ronde dengan benar, papan mempertahankan warna yang sama dan menambahkan satu warna di akhir, sampai kamu melakukan kesalahan.

Array membutuhkan ruang untuk permainan yang panjang, serta variabel length untuk menyimpan berapa banyak ruang yang digunakan. Menambahkan satu warna terdiri dari dua baris:

sequence[length] = random(4);
length++;

Atur seed sekali, saat permainan dimulai. playSequence() sekarang memainkan length warna, bukan empat, dan ronde selesai saat step mencapai length.

Kesalahan mengakhiri permainan dengan suara yang jelas bukan sebuah nada, 110 Hz selama satu detik, dan mencetak skor: jumlah ronde yang diselesaikan, length - 1, karena ronde yang gagal tidak dihitung.

Array memiliki 20 tempat dan sketch tidak boleh menulis melewati batas akhirnya, jadi pemain yang mengulangi 20 warna akan menang.

challenge icon

Tantangan

Sulit

Ubah menjadi game lengkap:

  • const int MAX_STEPS = 20;, int sequence[MAX_STEPS]; dan int length = 0;
  • game dimulai dengan satu warna; setiap ronde yang diulang dengan benar menambahkan satu warna dan memainkan seluruh urutan
  • jika terjadi kesalahan: bunyikan nada 110 Hz selama 1000 ms, lalu cetak Game over! Score: dan skornya, lalu akhiri game
  • jika 20 warna diulang dengan benar: cetak You win! dan akhiri game

Tekan Jalankan, lihat sejauh mana kamu bisa melangkah, lalu tekan Periksa.

Coba sendiri

// Satu entri per warna: merah, hijau, biru, kuning
const int ledPins[4] = {9, 10, 11, 12};
const int buttonPins[4] = {2, 3, 4, 5};
const int notes[4] = {262, 330, 392, 523};  // C, E, G, dan C tinggi
const int buzzerPin = 8;

int lastState[4] = {HIGH, HIGH, HIGH, HIGH};  // pembacaan terakhir setiap tombol

int sequence[4];       // warna-warna yang dimainkan papan
bool playing = false;  // false sampai tombol ditekan untuk memulai permainan
int step = 0;          // jumlah warna yang telah diulangi pemain

// Nyalakan warna i dan mainkan nadanya.
void lightOn(int i) {
  digitalWrite(ledPins[i], HIGH);
  tone(buzzerPin, notes[i]);
}

// Matikan warna i dan hentikan bunyinya.
void lightOff(int i) {
  digitalWrite(ledPins[i], LOW);
  noTone(buzzerPin);
}

// Mainkan urutannya: setiap warna menyala selama 400 ms, lalu hening selama 200 ms.
void playSequence() {
  delay(500);
  for (int i = 0; i < 4; i++) {
    lightOn(sequence[i]);
    delay(400);
    lightOff(sequence[i]);
    delay(200);
  }
}

// Pilih urutan acak baru dan mainkan.
void startGame() {
  randomSeed(micros());
  for (int i = 0; i < 4; i++) {
    sequence[i] = random(4);
  }
  playing = true;
  step = 0;
  playSequence();
}

// Pemain melepas tombol warna i: apakah itu warna berikutnya dalam urutan?
void checkPress(int i) {
  if (i != sequence[step]) {
    Serial.println("Wrong!");
    playing = false;
    return;
  }
  step++;
  if (step == 4) {
    Serial.println("Well done!");
    playing = false;
  }
}

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(ledPins[i], OUTPUT);
    pinMode(buttonPins[i], INPUT_PULLUP);
  }
  Serial.begin(9600);
}

void loop() {
  for (int i = 0; i < 4; i++) {
    int state = digitalRead(buttonPins[i]);
    if (state == LOW && lastState[i] == HIGH) {  // ditekan
      lightOn(i);
    }
    if (state == HIGH && lastState[i] == LOW) {  // dilepas
      lightOff(i);
      if (playing == false) {
        startGame();
      } else {
        checkPress(i);
      }
    }
    lastState[i] = state;
  }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Proyek

Latihan sendiri: Playground Arduino