Продолжение предыдущего поста - Игра Simon Say на Blockduino - игра в которой нужно повторить все усложняющуюся последовательность загорающихся светодиодов. Общим количеством в семь. Так же каждому светодиоду соответствует нота, которая звучит одновременно со светящимся светодиодом.
Конечно светодиодов о семи цветах не нашлось, но скомпоновал примерно вот так:
Алгоритм игры
При включении игра ждет нажатия кнопки для запуска игры (в процессе ожидания периодически помаргивают светодиоды и попискивает зуммер :)
В начале игра показывает два случайных светодиода и одновременно звучит привязанная к каждому светодиоду нота (теоретически нотная гамма - нижний 'до', вернхний - 'си', но так как я нотной грамоте не обучен и шибко неохота в нее вкапываться, то выбрал примерно наобум. Поправьте, плиз, кто может!)
Дальше, крутя ручку резистора, выбираем правильный светодиод (слыша соответствующую ноту) и нажимаем кнопу, фиксируя выбор. И так от двух (начальная сложность) до десяти (самая сложная последовательность).
В отличие от предыдущей игры, где проигрывается одна и та же последовательность, просто постоянно удлиняясь, в этой игре последовательность меняется каждый раз.
/* Simon Says Test your memory with this game! LEDs will blink in a pattern that you have to remember and repeat. If you get it right, the game gets more and more challenging. (c) 2014 Aduino Verkstad Simon Says 7 Notes Modified to play 7 notes with LEDs Add stand-by with effects Oct-2014 Vasyl Yudin www.blockduino.org*/
#include <BasicEducationShield.h>
#include "pitches.h"/* An array of pin numbers to which LEDs are attached the defaults are 2 to 8 but you can choose any of the digital pins. */int pinCount = 7;
int ledPins[] = {2, 3, 4, 5, 6, 7, 8};
int notes[] = {NOTE_C7, NOTE_D7, NOTE_E7, NOTE_F7, NOTE_G7, NOTE_A7, NOTE_B7};
VUMeter vuMeter;
boolean isPlaing = false;
Knob pot = Knob(A0);//a knob is connected to A0Button button = Button(10); //a button is connected to D10Melody piezo = Melody(9);//a piezo is connected to D9//Set the game parametersconstint turns_begin=2;//a new game starts with 2 turnsconstint turns_max=10;//the most difficult game has 10 turnsint game[turns_max];//array for storing the "simon says "int turns=turns_begin;//for storing the number of turns in current gameint blinkTime=500;//how fast does "simon says" blinkvoidsetup(){
//initialize the components
vuMeter.config(pinCount, ledPins);
vuMeter.begin();
pot.setLevels(pinCount);
button.begin();
//Create a random seed, so we can call random() later.randomSeed(analogRead(A5));
}
voidloop(){
if (!isPlaing) waiting();
newGame();
simonSays();
delay(1000);
getInputs();
}
void newGame(){
isPlaing = true;
vuMeter.blinkAll(200, 3);
vuMeter.clear();
delay(500);
//Generate simon says, it'll be stored in an array//So we can compare with player's input laterfor(int i=0;i<turns;i++){
game[i]=random(pinCount);
}
}
void simonSays(){
//Display simon says to the player. for(int i=0;i<turns;i++){
vuMeter.on(game[i]);
piezo.beep(notes[game[i]], blinkTime);
// delay(blinkTime);
vuMeter.off(game[i]);
delay(blinkTime);
}
}
void getInputs(){
//Get "i" inputs where "i" matches the number of //simon says in this round.for(int i=0;i<turns;i++){
int input;
//button.released() stops the program, so//let's do it in short pulses, in between //we can change the vuMeter display.while(!button.getState()){
vuMeter.clear();
vuMeter.on(pot.getLevel());
delay(100);
}
//When button is released, get the adjusted //value from the knob
input=pot.getLevel();
if(input==game[i]){
//if your input is right, play a score sound//and continue.
piezo.beep(notes[game[i]], blinkTime);
}else{
//Otherwise, gameover. Stop the function from//continuing by an empty return.
gameOver();
return ;
}
}
//When all the inputs matched simon says, you win//this round and level up.delay(500);
levelUp();
}
void gameOver(){
//When it's gameover, difficutly resets
turns=turns_begin;
//And play the gameover sound
piezo.effect_gameover();
isPlaing = false;
}
void levelUp(){
//When level up, adds more difficulty until it reaches maximumif(turns<turns_max){
turns++;
}
//And play a wining sound
piezo.effect_win();
}
void waiting(){
//After finish game wait to start game by pressing buttonint i = 0;
constint timeout = 100;
while(!button.getState()){
i = (i+1) % timeout;
if (i < pinCount) {
vuMeter.on(i);
piezo.beep(notes[i], 25);
vuMeter.off(i);
}
delay(50);
}
}
Комментариев нет:
Отправить комментарий