Съдържание:

Arduino - Пиано плочки: 16 стъпки (със снимки)
Arduino - Пиано плочки: 16 стъпки (със снимки)

Видео: Arduino - Пиано плочки: 16 стъпки (със снимки)

Видео: Arduino - Пиано плочки: 16 стъпки (със снимки)
Видео: Текстовые LCD дисплей на контроллере HD44780, Уроки Arduino 2024, Ноември
Anonim
Arduino - Плочки за пиано
Arduino - Плочки за пиано

Здравейте интернет хора, това ще бъде за това как да направите това, което ОПРЕДЕЛНО не е откъсване от мобилна игра на arduino uno r3.

така че за да започнете, ще ви трябват всички части, които са както следва! 1x Arduino Uno r3 ($ 42)

2x LCD клавиатурен щит ($ 19 всеки)

5x бутони

5x 220Ω резистори

28x проводници

Добре, след като имате всички части, време е да започнете!

Стъпка 1: Окабеляване

Електрически инсталации
Електрически инсталации
Електрически инсталации
Електрически инсталации
Електрически инсталации
Електрически инсталации

Започнете, като свържете вашето arduino и приятели, както е показано на диаграмата, Уверете се, че бутоните са свързани правилно, със слотовете A0-4 от страната на релсите за бутони, или вместо това arduino ще мисли, че бутоните се държат постоянно, а не само при натискане.

Стъпка 2: Декларации

Целият код тук трябва да мине преди вашата настройка на void и void loop, това е така, защото всички тези променливи и обекти се използват в няколко от функциите, които ще настроим.

Започнете с поставяне:

#включва

в горната част на кода ви, това казва на arduino да използва библиотеката "LiquidCrystal.h" и функциите, които са част от нея.

Следващата стъпка е да дефинираме пиновете, които използваме за нашите бутони, като поставим този код под нашия #include:

#define btnEnter A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

Определяме термините btnEnter и btn1 до btn 4, за да направим кода по -лесен за четене или да го променим, ако е необходимо. Това означава, че когато въведем btn1, arduino ще знае, че всъщност имаме предвид бутона 15. Въпреки че наричаме портовете port 15, 16, 17 и 18, те са означени на arduino като A1 A2 A3 и A4, това е така, защото това са портове, използвани специално за аналогови входове, въпреки че ги използваме само за цифрови входове.

След това ще създадем обекти, които ще контролират дисплеите с течни кристали. За да направите това, поставете този код под нашите дефиниции

LiquidCrystal lcdLeft (8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight (2, 3, 4, 5, 6, 7);

Това означава, че казва на arduino, че когато извикваме lcdLeft или lcdRight, ние се позоваваме на обект LiquidCrystal. Числата в приложените скоби казват на arduino кои портове обектът трябва да използва за изпращане на съобщения до LCD, когато използваме техните функции.

Сега трябва да декларираме променливите, като поставим следващия бит код под декларациите на обекта:

// тези променливи са опции, които можете да промените - по -високи числа = по -бърза скорост на играта upint intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;

// настройка на променливи за gameboolean bolPlay; // проследява дали играчът int intScore; // проследява резултата на играча int intDiff; // само естетично нещо за да се каже на каква трудност е играта // настройване на променливи за въвеждане int intEnter; // проследява, ако потребителят натисне бутона за въвеждане int intInput; // проследява кои бутони потребителят натиска boolean bolTilePressed; // гарантираме, че плейърът случайно не натиска бутон 5 пъти и губи // настройва променливи за turn int intTick; // брои милиони (на цикъл) до intDelay int intDelay; // времето, в което програмата изчаква до следващия завой в millis int intGameSpeed; // abit of debug options boolean bolSerialBoard; // когато true ще отпечата платката в серийния монитор

Декларираме променлива, като посочваме типа данни и след това името на променливата, напр. int thisIsAnInteger

Булевите променливи, като bolSerialBoard и bolPlay, могат да имат само една от двете стойности, true или false.

Целочислената променлива (int) като intScore и intInput може да приема цели числа като стойности, като 1, 5 или 100.

Някои други забележими типове данни, които не използваме тук, са низ, който представлява парче текст, и плаващ знак, който е десетично число.

Всяка от променливите тук се използва на няколко различни места от програмата, ето резюме на това, което всяка прави

bolPlay казва на програмата дали менюто трябва да се покаже или дали действителната игра трябва да се изпълнява.

intScore проследява резултата на играча, когато удари плочки, intDiff се използва в главното меню, за да каже на програмата какъв бит текст да отпечата на LCD дисплея, intEnter се използва, за да съобщи на програмата дали е натиснат бутонът за въвеждане (най -отдалечен), intInput се използва, за да каже на програмата кой от другите 4 бутона е натиснат.

bolTilePressed се използва, за да се увери, че програмата чете само при натискане на бутона, но не и при задържане.

intGameSpeed, intGameSpeedEasy, intGameSpeedMedium и intGameSpeedHard се използват за контрол на това колко бързо трябва да се ускори играта в зависимост от избраната трудност.

intTick и intDelay се използват, за да спрат програмата да премества дъската всеки път, когато се затвори.

bolSerialBoard се използва, за да ви позволи да накарате програмата да изпраща платката до серийния монитор на arduino като поредица от номера за целите на тестването.

Накрая е време да обявим нашата дъска като масив, използвайки този код:

// настройване на масив от игри arrGame [16] [4] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};

Масив е матрица, която всяка точка, в която може да бъде извикана за математика или да бъде променена.

Вашият код сега трябва да изглежда нещо подобно;

// включва библиотеки#include

// тези променливи са опции, които можете да промените - по -високи числа = по -бързо ускоряване на играта

int intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;

// Определяне на щифтове

#define btnEnter A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

// създаване на LCD обекти (n, ~, n, ~, ~, n)

LiquidCrystal lcdLeft (8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight (2, 3, 4, 5, 6, 7);

// настройка на масив от игри

int arrGame [16] [4] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};

// настройваме променливи за играта

булев болПлей; // проследява дали играчът int intScore; // проследява резултата на играча int intDiff; // просто естетично нещо за разказване на каква трудност е играта

// настройваме променливи за въвеждане

int intEnter; // проследява, ако потребителят натисне бутона за въвеждане int intInput; // проследява кои бутони потребителят натиска boolean bolTilePressed; // гарантираме, че играчът не натиска случайно бутон 5 пъти и губи

// настройваме променливи за завой

int intTick; // брои милиони (на цикъл) до intDelay int intDelay; // времето, в което програмата изчаква до следващия завой в millis int intGameSpeed;

// abit на опциите за отстраняване на грешки

boolean bolSerialBoard; // когато true ще отпечата платката в серийния монитор

Стъпка 3: Функция за настройка

Цикълът за настройка е функция, прочетена от arduino само веднъж, когато първоначално стартира.

В цикъла за настройка просто задаваме стойностите на няколко от нашите променливи, защото вместо да им задаваме стойност, когато ги декларираме, ние го правим тук.

Започнете, като поставите този код във вашата Void Setup.

bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium;

Всеки ред просто задава променлива на стойност.

bolPlay е зададен на false, така че играта да не започне да се играе.

intScore е зададен на 0, защото естествено резултатът ви започва с 0.

intTick започва от 0, защото програмата в момента не отчита нищо.

intDelay е зададено на 1000, защото това е скоростта, от която започват плочките.

intDiff е просто аскетично нещо, така че програмата да знае какво да напише за трудността на играта.

intGameSpeed е зададено на каквото и да е intGameSpeedMedium, което означава, че е зададено на средна трудност.

След това поставете този код в настройката на Void под кода, който току -що сте въвели.

lcdLeft.begin (16, 2); lcdRight.begin (16, 2);

Serial.begin (9600);

Това казва на arduino да започне да комуникира с компютъра чрез серийния монитор (видимо чрез щракване върху бутона в горния десен ъгъл на arduino IDE).

Вашата настройка на Void сега трябва да изглежда нещо подобно!

void setup () {Serial.begin (9600); // стартира серийния монитор // настройва променливите bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // започваме lcdLeft.begin на lcd (16, 2); lcdRight.begin (16, 2); }

Стъпка 4: Функцията Loop

Цикличната функция се изпълнява от arduino при всяка итерация на arduino.

Копирайте следния код във вашия Void Loop.

void loop () {вход (); // проверка за възпроизвеждане на вход if (bolPlay == true) {if (intTick> = intDelay) {// проверка дали играта трябва да играе ход или да продължи да чака Serial.println ("~~~~~~~ ~~ "); // печат за означаване на движещата се дъска // writeSerial (); // ако опцията е активирана запишете дъската в серийни бутониGame (); // проверка за входове на плейъра playBoard (); // преместваме дъската и добавяме нова плочка clearLcd (); // почистваме LCD дисплеите, преди да нарисуваме drawBoard (); // изтегляме дъската върху дъното на lcd'sCheck (); intTick = 0; // нулиране на intTick} else {buttonsGame (); // проверка за входове на плейъра clearLcd (); // почистваме LCD дисплеите, преди да нарисуваме drawBoard (); // изтегляме дъската върху intTick на lcd = intTick + intGameSpeed; // добавяне към отметка}} else {clearLcd (); // почистваме LCD дисплеите преди да нарисуваме заглавие (); // показване на бутоните за информация за заглавието и резултатаMenu (); // прочетете входа на плейъра clearBoard (); // гарантираме, че цялата дъска = 0} забавяне (10); // забавяме arduino с кратък момент}

когато bolPlay е равно на true, това означава, че играта се играе и целият код за играта трябва да се изпълнява, но ние искаме само дъската да добави нова плочка и да се премести надолу, когато intTick е по -голям от нашия intDelay, в противен случай все още искаме да позволим на потребителя да натисне бутон, за да удари плочка и intTick да увеличи скоростта.

Повечето от този код използва функции, които тепърва ще направим и ще ги направим в следващите стъпки. Целта на тези функции е следната.

Входът отчита кои бутони е натиснал потребителят.

buttonGame контролира какво правят бутоните, когато са в играта, а не в менюто

playBoard добавя нова плочка към дъската и след това премества всичко на дъската надолу с едно пространство

clearLCD почиства LCD дисплеите, за да се увери, че зад плочките не са останали призраци

drawBoard преминава през arrGame и го отпечатва върху LCD дисплеите

clearBoard изчиства целия arrGame, когато играта не се играе

bottomCheck проверява долната част на arrGame за състояние на повреда

title показва заглавието на играта и информацията за резултата, когато е в менюто

Менюто на бутоните контролира действията на потребителя, когато са в менюто.

gameOver е друга функция, въпреки че не се извиква тук, тъй като вместо това се извиква в долната част Проверете и бутони Игри функции.

Стъпка 5: Функцията ClearLCD

за да създадем функция, започваме с добавяне на това към кода

void functionName () {

}

"functionName" може да бъде всичко, стига да не съществува вече.

Копирайте този код във вашата програма:

void clearLcd () {for (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 1; ii ++) {lcdLeft.setCursor (i, ii); lcdLeft.write (""); lcdRight.setCursor (i, ii); lcdRight.write (""); }}}

това преминава през целия масив, като се използват 2 преброени цикъла, за да преминете през всяка точка на LCD дисплеите и да напишете интервал.

Без да се нулира, LCD дисплеите ще поддържат всичко, което е било написано по -рано

Стъпка 6: Функцията DrawBoard

копирайте този код във вашата програма

void drawBoard () {for (int i = 1; i <= 15; i ++) {// нарисувайте columms 1 и 2 на левия LCD // ако плочката = 0 напишете нищо, = 1 напишете "#", = 2 напишете "@" lcdLeft.setCursor (i, 1); // зададен на първата колона (най -отдалечена) if (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // зададен на втората колона (вляво в центъра) if (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // зададен на третата колона (вдясно в центъра) if (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // зададен на четвъртата колона (най -вдясно) if (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.write ("@");}}}

това използва цикъл, за да премине през всеки ред на дъската, след това проверява дали някоя колона в реда е равна на 1 или 2, въз основа на това тя след това отпечатва на LCD или хаштаг, за плочка, която тепърва ще бъде hit, или @ за хит плочка.

Стъпка 7: Функцията PlayBoard

копирайте този код във вашата програма.

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // изчистване на горния ред arrGame [0] [random (0, 4)] = 1; // задаваме произволна точка в горния ред като плочка за (int i = 15; i> = 1; i-) {// работеща от дъното на дъската до горната част за (int ii = 0; ii <= 3; ii ++) {// за всяка колона arrGame [ii] = arrGame [i - 1] [ii]; }}}

този код започва с изчистване на целия горен ред на 0, или без плочки, и след това задава една произволна плочка да бъде 1, и премахване на плочката.

След това преминава през отброен цикъл в обратна посока, от 15 до 1, като настройва реда да бъде равен на който и да е редът над него, като кара платката да се движи надолу по LCD

Стъпка 8: Функцията ClearBoard

копирайте този код във вашата програма.

void clearBoard () {// нулиране на стойностите за отметка и забавяне intTick = 0; intDelay = 1000; // преминете през дъската и задайте всичко на 0 за (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

Този код се изпълнява, когато играта не се играе, за да се уверите, че цялата arrGame е настроена на 0 или без плочки, като използвате преброените цикли, за да преминете през масива.

Кодът също така нулира стойностите на intDelay и intTick.

Стъпка 9: Функция заглавие

копирайте следния код във вашата програма

void title () {// запис на заглавие на LCD и място за оценка lcdRight.setCursor (0, 0); lcdRight.write ("Плочки за пиано"); lcdRight.setCursor (0, 1); lcdRight.write ("Резултат:"); // конвертираме резултата в низ char strScore [3]; sprintf (strScore, "%d", intScore); // показва резултата на LCD lcdRight.write (strScore); // добавяме трудно lcdRight.setCursor (10, 1); if (intDiff == 0) {lcdRight.write ("Лесно"); } if (intDiff == 1) {lcdRight.write ("Medium"); } if (intDiff == 2) {lcdRight.write ("Hard"); } // Натиснете малко инструкция lcdLeft.setCursor (0, 0); lcdLeft.write ("Натиснете Enter"); lcdLeft.setCursor (0, 1); lcdLeft.write ("да започна!"); }

Този код записва заглавието на играта и резултата на LCD дисплеите, като прави това, като казва на LCD екрана къде да започне да пише с помощта на LCD.setCursor и след това пише низа в LCD.write.

Тук също се създава нова променлива, strScore, тя се използва за преобразуване на intScore в низ от данни или тип данни с помощта на функцията sprintf.

intDiff също се използва тук, въз основа на неговите стойности, той отпечатва различните опции за трудност.

Стъпка 10: Функцията ButtonsMenu

вмъкнете следния код във вашата програма

void buttonsMenu () {// когато е натиснат enter, стартирайте играта и нулирайте стойността на резултата, ако (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // при натискане на бутон 3 включете опцията за отстраняване на грешки за отпечатване на платката в сериен if (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = вярно; } else {Serial.println ("Serial Board Disabled"); bolSerialBoard = false; }} // задайте скоростта на играта на лесна трудност, ако (intInput == 0) {Serial.print ("Играта е настроена на easy ("); Serial.print (intGameSpeedEasy); Serial.println ("ms ускорение)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // задайте скорост на играта на средна трудност, ако (intInput == 1) {Serial.print ("Играта е настроена на средна ("); Serial.print (intGameSpeedMedium); Serial.println ("ms ускорение)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // задайте скоростта на играта на твърда трудност, ако (intInput == 2) {Serial.print ("Играта е зададена на твърд ("); Serial.print (intGameSpeedHard); Serial.println ("ms ускорение)"); intDiff = 2; intGameSpeed = intGameSpeedHard; }}

този код се изпълнява само когато bolPlay е равен на false в void Loop

ако intEnter е зададен на 1, това означава, че бутонът за въвеждане е натиснат, ако е натиснат, програмата задава bolPlay на true и играта започва.

След това програмата чете на какво е равно intInput. ако е равно на 0, първият бутон отляво се натиска, нагоре надясно до 3. Ако intInput е равно на 4, не се натиска бутон.

ако се натиснат бутони 0-2, играта променя трудността, като също така регулира стойността на скоростта на играта, което означава, че тя ще се ускори по-бързо.

ако е натиснат бутон 3, играта ще активира или деактивира режим за отстраняване на грешки, при който цялата дъска се отпечатва в серийния монитор, за да помогне за намирането на проблеми в програмата.

Стъпка 11: Функцията ButtonsGame

копирайте следния код във вашата програма

void buttonsGame () {if (intInput! = 4) {// ако бутон е натиснат if (bolTilePressed == false) {// само ако bolTilePressed е фалшиво действие за задействане за проверка на бутона натиснете bolTilePressed = true; // след това задайте bolTilePressed на true, за да се уверите, че не е задействано повторно int intLowestTile = 0; // да се настрои на плочката с най -ниската плочка int intCheckedTile = 15; // за да следите кои плочки са били проверени докато (intLowestTile == 0) {// стига да не е настроено за нищо, проверете плочките (int i = 0; i 100) {// стига int забавянето не е по -малко от 100 intDelay = intDelay - 20; // вземаме стойност от него}} else {Serial.println ("Неправилно натиснат бутон"); играта приключи(); // иначе играта приключи}}}}}

Кодът се изпълнява само когато bolPlay е равно на true в void Loop.

Подобно на бутоните Меню въз основа на стойността на intInput проверява дали играчът е ударил плочка или я е пропуснал.

Той прави това, като премине през arrGame отдолу нагоре, като използва цикъл while, за да потърси кой ред е най -нисък с непокрита плочка. След това той проверява дали мястото в този ред, съответстващо на натиснатия бутон, е нехитова плочка или не, ако е нехитово, то го задава на 2 вместо на 1, което означава, че ще се покаже като @, в противен случай задейства играта Over функция, която тепърва ще създаваме.

Тази функция също използва променливата bolTilePressed, като я задава на true при натискане на бутон и false при липса на бутон. Това се прави, за да се гарантира, че потребителят случайно не е загубил играта, защото програмата смята, че са натиснали бутона няколко пъти, когато са го задържали.

Стъпка 12: Функцията GameOver

Копирайте следния код във вашата програма

void gameOver () {Serial.println ("Играта свърши!"); Serial.print ("Резултатът ви беше:"); Serial.println (intScore); Serial.print ("Вашата скорост беше:"); Serial.println (intDelay); bolPlay = false; }

Това се задейства от функциите checkBottom или ButtonsGame и задейства края на играта, като задава bolPlay на false.

Той също така отпечатва съобщение в серийния монитор за оценка на потребителите и плочките за скорост са добавени за милисекунди.

Стъпка 13: Входната функция

Копирайте следния код във вашата програма.

void input () {intEnter = digitalRead (btnEnter); // четете enter // четете кой от другите входове, или ако нито един не е зададен на 4 if (digitalRead (btn1) == HIGH) {intInput = 0;} else {if (digitalRead (btn2) == HIGH) {intInput = 1;} else {if (digitalRead (btn3) == HIGH) {intInput = 2;} else {if (digitalRead (btn4) == HIGH) {intInput = 3;} else {intInput = 4; }}}} // сериен печат на входовете if (intEnter == 1) {Serial.println ("Enter Presssed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } else {// ако не е натиснат бутон нулиране bolTilePressed bolTilePressed = false; }}

Този код се използва с бутоните Игри и бутони Меню функции. въз основа на бутоните, които потребителят е натиснал, той задава стойността на intInput или ако не е натиснат бутон, той задава intInput на равно 4.

Ако не е натиснат бутон, това е мястото, където bolTilePressed се нулира за функцията buttonSame.

Той също така отпечатва съобщение до серийния монитор, върху който е натиснат бутонът.

Стъпка 14: Функцията BottomCheck

копирайте следния код във вашата програма.

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// за 4 -те колони if (arrGame [15] == 1) {// ако плочка е в долната част Serial.println ("Плочки в долната част"); arrGame [15] = 2; drawBoard (); забавяне (400); arrGame [15] = 1; drawBoard (); забавяне (400); arrGame [15] = 2; drawBoard (); забавяне (400); arrGame [15] = 1; drawBoard (); забавяне (400); играта приключи(); }}}

с помощта на цикъл този код проверява долния ред на arrGame за някакви непокрити плочки (плочки, равни на 1), ако има непокрита плочка в долната част на екрана, тя ще мига плочката и след това ще задейства функцията за игра.

Стъпка 15: Функцията WriteSerial

копирайте следния код във вашата програма

void writeSerial () {if (bolSerialBoard == true) {for (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {Serial.print (arrGame [ii]); Serial.print (","); } Serial.println (""); }}}

Това е функцията, последвана от опцията за отстраняване на грешки, която може да бъде активирана във функцията бутони Меню. Ако bolSerialBoard е зададен на true в тази функция, той ще премине през arrGame и ще отпечата цялата платка в серийния монитор за целите на тестване, като използва масив.

Стъпка 16: Приключване

Завършване!
Завършване!

Целият ви код не трябва да бъде пълен и да изглежда нещо подобно!

/ * * Име - Плочки за пиано; Arduino * От - Доменик Марули * Дата - 11/ *

/ включват библиотеки

#включва

// тези променливи са опции, които можете да промените - по -високи числа = по -бързо ускоряване на играта

int intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;

// Определяне на щифтове

#define btnEnter A0 #define btn1 15 #define btn2 16 #define btn3 17 #define btn4 18

// създаване на LCD обекти (n, ~, n, ~, ~, n)

LiquidCrystal lcdLeft (8, 9, 12, 10, 11, 13); LiquidCrystal lcdRight (2, 3, 4, 5, 6, 7);

// настройка на масив от игри

int arrGame [16] [4] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};

// настройваме променливи за играта

булев болПлей; // проследява дали играчът int intScore; // проследява резултата на играча int intDiff; // просто естетично нещо за разказване на каква трудност е играта

// настройваме променливи за въвеждане

int intEnter; // проследява, ако потребителят натисне бутона за въвеждане int intInput; // проследява кои бутони потребителят натиска boolean bolTilePressed; // гарантираме, че играчът не натиска случайно бутон 5 пъти и губи

// настройваме променливи за завой

int intTick; // брои милиони (на цикъл) до intDelay int intDelay; // времето, в което програмата изчаква до следващия завой в millis int intGameSpeed;

// abit на опциите за отстраняване на грешки

boolean bolSerialBoard; // когато true ще отпечата платката в серийния монитор

// настройката, която ще се изпълнява веднъж

void setup () {Serial.begin (9600); // стартира серийния монитор // настройва променливите bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // започваме lcdLeft.begin на lcd (16, 2); lcdRight.begin (16, 2); }

// цикълът, който ще се изпълнява на всеки 10 милисекони

void loop () {вход (); // проверка за възпроизвеждане на вход if (bolPlay == true) {if (intTick> = intDelay) {// проверка дали играта трябва да играе ход или да продължи да чака Serial.println ("~~~~~~~ ~~ "); // печат за означаване на движещата се дъска // writeSerial (); // ако опцията е активирана запишете дъската в серийни бутониGame (); // проверка за входове на плейъра playBoard (); // преместваме дъската и добавяме нова плочка clearLcd (); // почистваме LCD дисплеите, преди да нарисуваме drawBoard (); // изтегляме дъската върху дъното на lcd'sCheck (); intTick = 0; // нулиране на intTick} else {buttonsGame (); // проверка за входове на плейъра clearLcd (); // почистваме LCD дисплеите, преди да нарисуваме drawBoard (); // изтегляме дъската върху intTick на lcd = intTick + intGameSpeed; // добавяне към отметка}} else {clearLcd (); // почистваме LCD дисплеите преди да нарисуваме заглавие (); // показване на бутоните за информация за заглавието и резултатаMenu (); // прочетете входа на плейъра clearBoard (); // гарантираме, че цялата дъска = 0} забавяне (10); // забавяме arduino с кратък момент}

// почиства lcd, така че всички невписани клетки не остават там

void clearLcd () {for (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 1; ii ++) {lcdLeft.setCursor (i, ii); lcdLeft.write (""); lcdRight.setCursor (i, ii); lcdRight.write (""); }}}

// изтегля дъската върху lcd

void drawBoard () {for (int i = 1; i <= 15; i ++) {// нарисувайте columms 1 и 2 на левия LCD // ако плочката = 0 напишете нищо, = 1 напишете "#", = 2 напишете "@" lcdLeft.setCursor (i, 1); // зададен на първата колона (най -отдалечена) if (arrGame [0] == 1) {lcdLeft.write ("#");} if (arrGame [0] == 2) {lcdLeft.write ("@");} lcdLeft.setCursor (i, 0); // зададен на втората колона (вляво в центъра) if (arrGame [1] == 1) {lcdLeft.write ("#");} if (arrGame [1] == 2) {lcdLeft.write ("@");} lcdRight.setCursor (i, 1); // зададен на третата колона (вдясно в центъра) if (arrGame [2] == 1) {lcdRight.write ("#");} if (arrGame [2] == 2) {lcdRight.write ("@");} lcdRight.setCursor (i, 0); // зададен на четвъртата колона (най -вдясно) if (arrGame [3] == 1) {lcdRight.write ("#");} if (arrGame [3] == 2) {lcdRight.write ("@");}}}

// премества дъската надолу и поставя произволна стойност като плочка

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // изчистване на горния ред arrGame [0] [random (0, 4)] = 1; // задаваме произволна точка в горния ред като плочка за (int i = 15; i> = 1; i-) {// работеща от дъното на дъската до горната част за (int ii = 0; ii <= 3; ii ++) {// за всяка колона arrGame [ii] = arrGame [i - 1] [ii]; }}}

// задава цялата дъска на 0 и нулира променливите до предварителна игра

void clearBoard () {// нулиране на стойностите за отметка и забавяне intTick = 0; intDelay = 1000; // преминете през дъската и задайте всичко на 0 за (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {arrGame [ii] = 0; }}}

// показва главното меню на LCD дисплея

void title () {// запис на заглавие на LCD и място за оценка lcdRight.setCursor (0, 0); lcdRight.write ("Плочки за пиано"); lcdRight.setCursor (0, 1); lcdRight.write ("Резултат:"); // конвертираме резултата в низ char strScore [3]; sprintf (strScore, "%d", intScore); // показва резултата на LCD lcdRight.write (strScore); // добавяме трудно lcdRight.setCursor (10, 1); if (intDiff == 0) {lcdRight.write ("Лесно"); } if (intDiff == 1) {lcdRight.write ("Medium"); } if (intDiff == 2) {lcdRight.write ("Hard"); } // Натиснете малко инструкция lcdLeft.setCursor (0, 0); lcdLeft.write ("Натиснете Enter"); lcdLeft.setCursor (0, 1); lcdLeft.write ("да започна!"); }

// проверява бутоните и какво да прави с тях, докато е извън играта

void buttonsMenu () {// когато е натиснат enter, стартирайте играта и нулирайте стойността на резултата, ако (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // при натискане на бутон 3 включете опцията за отстраняване на грешки за отпечатване на платката в сериен if (intInput == 3) {if (bolSerialBoard == false) {Serial.println ("Serial Board Active"); bolSerialBoard = вярно; } else {Serial.println ("Serial Board Disabled"); bolSerialBoard = false; }} // задайте скоростта на играта на лесна трудност, ако (intInput == 0) {Serial.print ("Играта е настроена на easy ("); Serial.print (intGameSpeedEasy); Serial.println ("ms ускорение)"); intDiff = 0; intGameSpeed = intGameSpeedEasy; } // задайте скорост на играта на средна трудност, ако (intInput == 1) {Serial.print ("Играта е настроена на средна ("); Serial.print (intGameSpeedMedium); Serial.println ("ms ускорение)"); intDiff = 1; intGameSpeed = intGameSpeedMedium; } // задайте скоростта на играта на твърда трудност, ако (intInput == 2) {Serial.print ("Играта е зададена на твърд ("); Serial.print (intGameSpeedHard); Serial.println ("ms ускорение)"); intDiff = 2; intGameSpeed = intGameSpeedHard; }}

// проверява бутоните и какво да прави с тях, докато е в играта

void buttonsGame () {if (intInput! = 4) {// ако бутон е натиснат if (bolTilePressed == false) {// само ако bolTilePressed е фалшиво действие за задействане за проверка на бутона натиснете bolTilePressed = true; // след това задайте bolTilePressed на true, за да се уверите, че не е задействано повторно int intLowestTile = 0; // да се настрои на плочката с най -ниската плочка int intCheckedTile = 15; // за да следите кои плочки са били проверени докато (intLowestTile == 0) {// стига да не е настроено за нищо, проверете плочките (int i = 0; i 100) {// стига int забавянето не е по -малко от 100 intDelay = intDelay - 20; // вземаме стойност от него}} else {Serial.println ("Неправилно натиснат бутон"); играта приключи(); // иначе играта приключи}}}}}

void gameOver () {

Serial.println ("Играта свърши!"); Serial.print ("Резултатът ви беше:"); Serial.println (intScore); Serial.print ("Вашата скорост беше:"); Serial.println (intDelay); bolPlay = false; }

// проверява за въвеждане на плейъра

void input () {intEnter = digitalRead (btnEnter); // четете enter // четете кой от другите входове, или ако нито един не е зададен на 4 if (digitalRead (btn1) == HIGH) {intInput = 0;} else {if (digitalRead (btn2) == HIGH) {intInput = 1;} else {if (digitalRead (btn3) == HIGH) {intInput = 2;} else {if (digitalRead (btn4) == HIGH) {intInput = 3;} else {intInput = 4; }}}} // сериен печат на входовете if (intEnter == 1) {Serial.println ("Enter Presssed!");} if (intInput! = 4) {Serial.print ("Button Press:"); Serial.println (intInput); } else {// ако не е натиснат бутон нулиране bolTilePressed bolTilePressed = false; }}

// проверява долната част на дъската за повреда

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// за 4 -те колони if (arrGame [15] == 1) {// ако плочка е в долната част Serial.println ("Плочка в долната част"); arrGame [15] = 2; drawBoard (); забавяне (400); arrGame [15] = 1; drawBoard (); забавяне (400); arrGame [15] = 2; drawBoard (); забавяне (400); arrGame [15] = 1; drawBoard (); забавяне (400); играта приключи(); }}}

// отпечатва платката в серийния монитор, ако bolSerialBoard е вярно

void writeSerial () {if (bolSerialBoard == true) {for (int i = 0; i <= 15; i ++) {for (int ii = 0; ii <= 3; ii ++) {Serial.print (arrGame [ii]); Serial.print (","); } Serial.println (""); }}}

След като въведете целия код, качете го на вашия arduino и се наслаждавайте!

Препоръчано: