Simon: Tam Oyun
Coddy'nin Arduino Journey'sinin Projeler bölümünün bir parçası. Ders 16 / 24.
Gerçek Simon küçük başlar ve büyür. 1. turda bir renk çalar. Bir turu her doğru tekrarladığında, hata yapana kadar tahta aynı renkleri korur ve sona bir renk daha ekler.
Dizide uzun bir oyun için yer ve ne kadarının kullanıldığını belirten bir length değişkeni gerekir. Renk eklemek iki satırdır:
sequence[length] = random(4);
length++;Başlangıç değerini oyun başladığında bir kez ayarla. playSequence() artık dört yerine length renk çalar ve step, length değerine ulaştığında tur sona erer.
Hata yapmak, nota olmadığı açıkça belli olan bir sesle (110 Hz, bir saniye) oyunu bitirir ve skoru yazdırır: tamamlanan turların sayısı olan length - 1; kaybedilen tur sayılmaz.
Dizide 20 yer vardır ve taslak asla dizinin sonunu aşarak yazmamalıdır; bu nedenle 20 rengi tekrarlayan oyuncu kazanır.
Görev
ZorTam oyuna dönüştür:
const int MAX_STEPS = 20;,int sequence[MAX_STEPS];veint length = 0;- bir oyun tek renkle başlar; doğru tekrarlanan her tur bir renk ekler ve hepsini çalar
- bir hata: 1000 ms boyunca 110 Hz, ardından
Game over! Score:ve skoru yazdır, sonra oyunu bitir - 20 rengi doğru tekrarlarsan:
You win!yazdır ve oyunu bitir
Run'a bas, ne kadar ilerleyebildiğini gör, ardından Check'e bas.
Kendin dene
// Her renk için bir giriş: kırmızı, yeşil, mavi, sarı
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 ve tiz C
const int buzzerPin = 8;
int lastState[4] = {HIGH, HIGH, HIGH, HIGH}; // her düğmenin son okunan durumu
int sequence[4]; // kartın çaldığı renkler
bool playing = false; // bir basış oyunu başlatana kadar false
int step = 0; // oyuncunun tekrarladığı renk sayısı
// i renginin ışığını yak ve notasını çal.
void lightOn(int i) {
digitalWrite(ledPins[i], HIGH);
tone(buzzerPin, notes[i]);
}
// i renginin ışığını söndür ve sesi durdur.
void lightOff(int i) {
digitalWrite(ledPins[i], LOW);
noTone(buzzerPin);
}
// Diziyi çal: her renk 400 ms, ardından 200 ms sessizlik.
void playSequence() {
delay(500);
for (int i = 0; i < 4; i++) {
lightOn(sequence[i]);
delay(400);
lightOff(sequence[i]);
delay(200);
}
}
// Yeni bir rastgele dizi seç ve çal.
void startGame() {
randomSeed(micros());
for (int i = 0; i < 4; i++) {
sequence[i] = random(4);
}
playing = true;
step = 0;
playSequence();
}
// Oyuncu i renginin düğmesini bıraktı: bu, dizideki sıradaki renk mi?
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) { // basıldı
lightOn(i);
}
if (state == HIGH && lastState[i] == LOW) { // bırakıldı
lightOff(i);
if (playing == false) {
startGame();
} else {
checkPress(i);
}
}
lastState[i] = state;
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Projeler bölümündeki tüm dersler
Kendi başına pratik yap: Arduino playground