当前位置:网站首页>Arduino tutorial - Simon games
Arduino tutorial - Simon games
2022-07-06 06:53:00 【Wonderful drifting of coal】
Simon game Simon Game
《 Simon game 》 Is a puzzle leisure games , The rules of the game are , Let players remember the lighting sequence of lights of different colors , Click on the lights in turn , If the order is the same as AI The order of giving is the same , Then the game continues and increases the difficulty , Otherwise the game is over , Reset game .
On-line arduino Simon game
Code
/** Simon Game for ATTiny85 Copyright (C) 2018, Uri Shaked Licensed under the MIT License. */
#include <avr/sleep.h>
#include <avr/interrupt.h>
#include "pitches.h"
/* Constants - define pin numbers for leds, buttons and speaker, and also the game tones */
byte buttonPins[] = {
1, 2, 3, 4};
#define SPEAKER_PIN 0
#define MAX_GAME_LENGTH 100
int gameTones[] = {
NOTE_G3, NOTE_C4, NOTE_E4, NOTE_G5};
/* Global variales - store the game state */
byte gameSequence[MAX_GAME_LENGTH] = {
0};
byte gameIndex = 0;
/** Set up the GPIO pins */
void setup() {
// The following line primes the random number generator. It assumes pin A0 is floating (disconnected)
randomSeed(analogRead(1));
// Disable ADC - saves about 324.5uA in sleep mode!
ADCSRA = 0;
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
for (int i = 0; i < 4; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
pinMode(SPEAKER_PIN, INPUT);
}
ISR(PCINT0_vect) {
GIMSK &= ~0b00100000; // Turn off pin change interrupts
sleep_disable();
}
void sleep() {
sleep_enable();
noInterrupts();
GIMSK |= 0b00100000; // Turn on pin change interrupts
for (byte i = 0; i < 4; i++) {
PCMSK |= 1 << buttonPins[i];
}
interrupts();
sleep_cpu();
}
// The sound-producing function
void beep (unsigned char speakerPin, int frequencyInHertz, long timeInMilliseconds)
{
// http://web.media.mit.edu/~leah/LilyPad/07_sound_code.html
int x;
long delayAmount = (long)(1000000 / frequencyInHertz);
long loopTime = (long)((timeInMilliseconds * 1000) / (delayAmount * 2));
pinMode(speakerPin, OUTPUT);
for (x = 0; x < loopTime; x++) {
digitalWrite(speakerPin, HIGH);
delayMicroseconds(delayAmount);
digitalWrite(speakerPin, LOW);
delayMicroseconds(delayAmount);
}
pinMode(speakerPin, INPUT);
}
/** Lights the given led and plays the suitable tone */
void lightLedAndPlaySound(byte ledIndex) {
pinMode(buttonPins[ledIndex], OUTPUT);
digitalWrite(buttonPins[ledIndex], LOW);
beep(SPEAKER_PIN, gameTones[ledIndex], 300);
pinMode(buttonPins[ledIndex], INPUT_PULLUP);
}
/** Plays the current sequence of notes that the user has to repeat */
void playSequence() {
for (int i = 0; i < gameIndex; i++) {
byte currentLed = gameSequence[i];
lightLedAndPlaySound(currentLed);
delay(50);
}
}
/** Waits until the user pressed one of the buttons, and returns the index of that button */
byte readButton() {
for (;;) {
for (int i = 0; i < 4; i++) {
byte buttonPin = buttonPins[i];
if (digitalRead(buttonPin) == LOW) {
return i;
}
}
sleep();
}
}
/** Plays the tone associated with a specific button + debouncing mechanism */
void playButtonTone(byte buttonIndex) {
beep(SPEAKER_PIN, gameTones[buttonIndex], 150);
// Wait until button is released.
while (digitalRead(buttonPins[buttonIndex]) == LOW);
delay(50);
}
/** Play the game over sequence, and report the game score */
void gameOver() {
gameIndex = 0;
delay(200);
// Play a Wah-Wah-Wah-Wah sound
beep(SPEAKER_PIN, NOTE_DS5, 300);
beep(SPEAKER_PIN, NOTE_D5, 300);
beep(SPEAKER_PIN, NOTE_CS5, 300);
for (int i = 0; i < 200; i++) {
beep(SPEAKER_PIN, NOTE_C5 + (i % 20 - 10), 5);
}
delay(500);
}
/** Get the user input and compare it with the expected sequence. If the user fails, play the game over sequence and restart the game. */
void checkUserSequence() {
for (int i = 0; i < gameIndex; i++) {
byte expectedButton = gameSequence[i];
byte actualButton = readButton();
playButtonTone(actualButton);
if (expectedButton == actualButton) {
/* good */
} else {
gameOver();
return;
}
}
}
/** Plays an hooray sound whenever the user finishes a level */
void levelUp() {
beep(SPEAKER_PIN, NOTE_E4, 150);
beep(SPEAKER_PIN, NOTE_G4, 150);
beep(SPEAKER_PIN, NOTE_E5, 150);
beep(SPEAKER_PIN, NOTE_C5, 150);
beep(SPEAKER_PIN, NOTE_D5, 150);
beep(SPEAKER_PIN, NOTE_G5, 150);
}
/** The main game loop */
void loop() {
// Add a random color to the end of the sequence
gameSequence[gameIndex] = random(0, 4);
gameIndex++;
playSequence();
checkUserSequence();
delay(300);
if (gameIndex > 0) {
levelUp();
delay(300);
}
}
边栏推荐
- Explain in detail the functions and underlying implementation logic of the groups sets statement in SQL
- The ECU of 21 Audi q5l 45tfsi brushes is upgraded to master special adjustment, and the horsepower is safely and stably increased to 305 horsepower
- Delete external table source data
- Today's summer solstice
- Suspended else
- A method to measure the similarity of time series: from Euclidean distance to DTW and its variants
- PCL realizes frame selection and clipping point cloud
- 18.多级页表与快表
- [unity] how to export FBX in untiy
- SSO process analysis
猜你喜欢
AI on the cloud makes earth science research easier
指尖上的 NFT|在 G2 上评价 Ambire,有机会获得限量版收藏品
Basic commands of MySQL
Attributeerror: can 't get attribute' sppf 'on < module' models. Common 'from' / home / yolov5 / Models / comm
SQL Server manager studio(SSMS)安装教程
Map of mL: Based on the adult census income two classification prediction data set (whether the predicted annual income exceeds 50K), use the map value to realize the interpretable case of xgboost mod
Bitcoinwin (BCW): the lending platform Celsius conceals losses of 35000 eth or insolvency
【服务器数据恢复】IBM服务器raid5两块硬盘离线数据恢复案例
Development of entity developer database application
RichView TRVStyle 模板样式的设置与使用
随机推荐
How effective is the Chinese-English translation of international economic and trade contracts
SSO process analysis
机器学习植物叶片识别
漏了监控:Zabbix对Eureka instance状态监控
Reflex WMS中阶系列3:显示已发货可换组
AI on the cloud makes earth science research easier
指尖上的 NFT|在 G2 上评价 Ambire,有机会获得限量版收藏品
Market segmentation of supermarket customers based on purchase behavior data (RFM model)
UNIPRO Gantt chart "first experience": multi scene exploration behind attention to details
同事上了个厕所,我帮产品妹子轻松完成BI数据产品顺便得到奶茶奖励
Latex文字加颜色的三种办法
Fedora/REHL 安装 semanage
接口自动化测试实践指导(上):接口自动化需要做哪些准备工作
At the age of 26, I changed my career from finance to software testing. After four years of precipitation, I have been a 25K Test Development Engineer
The registration password of day 239/300 is 8~14 alphanumeric and punctuation, and at least 2 checks are included
中青看点阅读新闻
Chapter 7 - thread pool of shared model
SQL Server manager studio(SSMS)安装教程
Brief introduction to the curriculum differences of colleges and universities at different levels of machine human major -ros1/ros2-
万丈高楼平地起,每个API皆根基