суббота, 15 ноября 2014 г.

Игра Simon Say 7Notes


Продолжение предыдущего поста - Игра Simon Say на Blockduino -  игра в которой нужно повторить все усложняющуюся последовательность загорающихся светодиодов. Общим количеством в семь. Так же каждому светодиоду соответствует нота, которая звучит одновременно со светящимся светодиодом.

Конечно светодиодов о семи цветах не нашлось, но скомпоновал примерно вот так:

Алгоритм игры

При включении игра ждет нажатия кнопки для запуска игры (в процессе ожидания периодически помаргивают светодиоды и попискивает зуммер :)
В начале игра показывает два случайных светодиода и одновременно звучит привязанная к каждому светодиоду нота (теоретически нотная гамма - нижний 'до', вернхний - 'си', но так как я нотной грамоте не обучен и шибко неохота в нее вкапываться, то выбрал примерно наобум. Поправьте, плиз, кто может!)
Дальше, крутя ручку резистора, выбираем правильный светодиод (слыша соответствующую ноту) и нажимаем кнопу, фиксируя выбор. И так от двух (начальная сложность) до десяти (самая сложная последовательность).
В отличие от предыдущей игры, где проигрывается одна и та же последовательность, просто постоянно удлиняясь, в этой игре последовательность меняется каждый раз.

Код:

Код под спойлером:
Исходный код и библиотека к коду на сайте; http://madrid.verkstad.cc/

/*
  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 A0

Button button = Button(10); //a button is connected to D10

Melody piezo = Melody(9);//a piezo is connected to D9

//Set the game parameters
const int turns_begin=2;//a new game starts with 2 turns
const int turns_max=10;//the most difficult game has 10 turns

int game[turns_max];//array for storing the "simon says "
int turns=turns_begin;//for storing the number of turns in current game
int blinkTime=500;//how fast does "simon says" blink

void setup(){
  //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));
}
void loop(){
  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 later
  for(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 maximum
  if(turns<turns_max){
    turns++;
  }
  //And play a wining sound
  piezo.effect_win();
}
void waiting(){
  //After finish game wait to start game by pressing button
int i = 0;
const int 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);
  }
}




Больше фото



Видео отчет