Simon: Lặp lại mẫu
Thuộc phần Dự án trong hành trình Arduino của Coddy. Bài học 15 trên 24.
Sau khi bảng phát xong, đến lượt bạn: lặp lại bốn màu theo đúng thứ tự. Đoạn code cần thêm một số nữa, step, để đếm xem bạn đã lặp lại bao nhiêu màu. Màu bạn cần nhấn tiếp theo là sequence[step].
Ghi nhận một lần nhấn khi bạn thả nút, như trò chơi đang làm để bắt đầu. Lúc đó, đèn và nốt nhạc của nút đã tắt, nên đoạn code có thể xử lý gọn gàng:
void checkPress(int i) {
if (i != sequence[step]) {
Serial.println("Wrong!");
playing = false;
return;
}
step++;
if (step == 4) {
Serial.println("Well done!");
playing = false;
}
}return thoát khỏi hàm ngay lập tức, vì vậy khi bạn nhấn sai màu, không có câu lệnh nào bên dưới chạy. Đặt lại playing thành false sẽ kết thúc trò chơi, và lần nhấn tiếp theo sẽ bắt đầu trò chơi mới.
Mỗi trò chơi mới phải đếm lại từ đầu: đặt step = 0 trong startGame().
Thử thách
KhóCho người chơi trả lời:
- một câu lệnh
int step = 0;, được đặt lại về 0 trongstartGame() - khi nhả nút và trò chơi đang
playing, hãy gọicheckPress(i) - nếu chọn sai màu, in ra
Wrong!và kết thúc trò chơi - sau khi chọn đúng bốn màu, in ra
Well done!và kết thúc trò chơi
Khởi động Serial trong setup(). Nhấn Chạy, quan sát, lặp lại mẫu, rồi nhấn Kiểm tra.
Tự làm thử
// Mỗi màu một phần tử: đỏ, xanh lá, xanh dương, vàng
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 và C cao
const int buzzerPin = 8;
int lastState[4] = {HIGH, HIGH, HIGH, HIGH}; // trạng thái đọc gần nhất của từng nút
int sequence[4]; // các màu mà bo mạch phát
bool playing = false; // false cho đến khi bạn nhấn nút để bắt đầu trò chơi
// Bật đèn màu i và phát nốt nhạc tương ứng.
void lightOn(int i) {
digitalWrite(ledPins[i], HIGH);
tone(buzzerPin, notes[i]);
}
// Tắt đèn màu i và dừng âm thanh.
void lightOff(int i) {
digitalWrite(ledPins[i], LOW);
noTone(buzzerPin);
}
// Phát chuỗi màu: mỗi màu sáng trong 400 ms, rồi im lặng 200 ms.
void playSequence() {
delay(500);
for (int i = 0; i < 4; i++) {
lightOn(sequence[i]);
delay(400);
lightOff(sequence[i]);
delay(200);
}
}
// Chọn một chuỗi màu ngẫu nhiên mới rồi phát chuỗi đó.
void startGame() {
randomSeed(micros());
for (int i = 0; i < 4; i++) {
sequence[i] = random(4);
}
playing = true;
playSequence();
}
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(ledPins[i], OUTPUT);
pinMode(buttonPins[i], INPUT_PULLUP);
}
}
void loop() {
for (int i = 0; i < 4; i++) {
int state = digitalRead(buttonPins[i]);
if (state == LOW && lastState[i] == HIGH) { // đã nhấn
lightOn(i);
}
if (state == HIGH && lastState[i] == LOW) { // đã thả
lightOff(i);
if (playing == false) {
startGame();
}
}
lastState[i] = state;
}
}
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Dự án
1Đèn giao thông
Chu kỳ đèn giao thôngĐèn giao thông dùng millis()Nút qua đườngTín hiệu đi bộ và còi báo4Simon
Simon: Nút bấm và nốt nhạcSimon: Trình tự ngẫu nhiênSimon: Lặp lại mẫuSimon: Trò chơi hoàn chỉnhTự luyện tập: Playground Arduino