Мазмұны:

Ардуино - фортепиано плиткалары: 16 қадам (суреттермен)
Ардуино - фортепиано плиткалары: 16 қадам (суреттермен)

Бейне: Ардуино - фортепиано плиткалары: 16 қадам (суреттермен)

Бейне: Ардуино - фортепиано плиткалары: 16 қадам (суреттермен)
Бейне: ОГУРЕЧНОЕ ПИАНИНО | огуркофон? | электроогурцы? | собрал на arduino 2024, Шілде
Anonim
Ардуино - фортепиано плиткалары
Ардуино - фортепиано плиткалары

Сәлеметсіздер ме, интернет тұрғындары, бұл arduino uno r3 ұялы ойынының бұзылмайтынын қалай жасау керектігі туралы болмақ.

бастау үшін сізге барлық бөлшектер қажет болады, олар келесідей! 1x Arduino Uno r3 ($ 42)

2x LCD пернетақта қалқаны (әрқайсысы 19 доллар)

5x түймелер

5х 220Ω резисторлар

28x сымдар

Жақсы, барлық бөлшектерді алғаннан кейін, жұмысқа кірісу уақыты келді!

1 -қадам: Сымдарды жалғау

Сымдар
Сымдар
Сымдар
Сымдар
Сымдар
Сымдар

Диаграммада көрсетілгендей ардуино мен достарыңызды қосудан бастаңыз, Түймешіктердің түйіспелі жолдың төменгі жағындағы A0-4 слоттарымен дұрыс байланыстырылғанына көз жеткізіңіз, немесе arduino оның орнына түймелерді тек престе емес, үнемі ұстап тұрады деп ойлайды.

2 -қадам: Декларация мәлімдемелері

Мұндағы барлық код void орнату мен void циклінің алдында болуы керек, себебі бұл айнымалылар мен объектілердің барлығы біз орнататын бірнеше функцияларда қолданылады.

Қоюдан бастаңыз:

#қосу

сіздің кодыңыздың жоғарғы жағында, бұл arduino -ға «LiquidCrystal.h» кітапханасын және оның құрамына кіретін функцияларды қолдануға нұсқау береді.

Келесі қадам - бұл кодты #include астына қою арқылы біз түймелер үшін пайдаланатын түйреуіштерді анықтау.

#анықта btnҚолдан A0 #btn1 15 анықта

Біз кодты оқуды жеңілдету үшін btnEnter және btn1 -ден btn 4 -ге дейінгі терминдерді анықтаймыз немесе қажет болған жағдайда өзгертеміз. Бұл btn1 терген кезде arduino 15 батырмасын білдіретінін білетінін білдіреді. Біз 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 -ға олардың функцияларын қолданған кезде СКД -ге хабар жіберу үшін объекті қандай порттарды қолдану керектігін айтады.

Енді біз айнымалыларды келесі кодты объект декларациясының астына қою арқылы жариялауымыз керек:

// бұл айнымалылар - бұл өзгертуге болатын опциялар - жоғары сандар = intGameSpeedEasy = 10 жылдам ойын жылдамдығы; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;

// gameBole bolPlay үшін айнымалыларды орнату; // тректер, егер ойыншы int intScore; // ойыншының ұпайын int intiff арқылы бақылайды; // ойынның қандай қиын екенін айту үшін эстетикалық нәрсе // int intEnter енгізу үшін айнымалыларды орнату; // пайдаланушы int intInput енгізу батырмасын басатынын бақылайды; // пайдаланушы логикалық bolTilePressed түймелерін басатын тректер; // ойнатқыш кездейсоқ 5x батырмасын басып қалмайтынына көз жеткізіңіз // turn int intTick үшін айнымалыларды орнатыңыз; // intDelay int intDelay дейін миллименттерді есептейді (цикл бойынша); // бағдарлама millis int intGameSpeed келесі айналымға дейін күтетін уақыт; // abit отладка опциялары логикалық bolSerialBoard; // қашан true тақтаны сериялық мониторда басып шығарады

Біз айнымалыны мәлімет түрін, содан кейін айнымалы атауын айту арқылы жариялаймыз. int thisIsAnInteger

BolSerialBoard және bolPlay сияқты логикалық айнымалылар шын немесе жалған екі мәннің біреуіне ғана ие бола алады.

IntScore және intInput сияқты бүтін сандар айнымалысы (int) 1, 5 немесе 100 сияқты бүтін сандарды қабылдай алады.

Біз қолданбайтын басқа да белгілі деректер түрлері - бұл мәтіннің бөлігі болып табылатын жол және ондық сан болып табылатын флоат.

Мұндағы айнымалылардың әрқайсысы бағдарлама бойынша бірнеше жерде қолданылады, олардың әрқайсысы не істейтіні туралы қысқаша ақпарат

bolPlay бағдарламасы мәзірді көрсету керектігін немесе нақты ойын жұмыс істеп тұрғанын айтады.

intScore плиткаға соғылған кезде ойыншының ұпайын бақылайды, intDiff негізгі мәзірде СКД -де қандай мәтінді басып шығару керектігін бағдарламаға айту үшін қолданылады.

intEnter - бұл енгізу батырмасы (ең сол жақта) басылғанда бағдарламаға хабарлау үшін қолданылады, intInput бағдарламаға қалған 4 батырманың қайсысы басылғанын айту үшін қолданылады.

bolTilePressed - бұл бағдарлама тек түйме басылғанда ғана қосылатынын және оны ұстап тұрғанда оқылмайтынын тексеру үшін қолданылады.

intGameSpeed, intGameSpeedEasy, intGameSpeedMedium және intGameSpeedHard ойынның қандай қиындыққа байланысты тездетілетінін бақылау үшін қолданылады.

intTick және intDelay бағдарламаның айналған сайын тақтаны жылжытуын тоқтату үшін қолданылады.

bolSerialBoard бағдарламасы тестілеу мақсатында сандар сериясы ретінде тақтаны arduino сериялық мониторына жіберуге мүмкіндік беру үшін қолданылады.

Ақырында, біздің тақтаны осы кодты қолданып массив ретінде жариялаудың уақыты келді:

// arrayint 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 intGameSpeedEasy = 10; int intGameSpeedMedium = 25; int intGameSpeedHard = 80;

// түйреуіштерді анықтаңыз

#анықтаңыз

// СКД нысандарын жасау (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}};

// ойынға айнымалыларды орнату

логикалық bolPlay; // тректер, егер ойыншы int intScore; // ойыншының ұпайын int intiff арқылы бақылайды; // ойынның қандай қиын екенін айту үшін эстетикалық нәрсе

// енгізу үшін айнымалыларды орнату

int intEnter; // пайдаланушы int intInput енгізу батырмасын басатынын бақылайды; // пайдаланушы логикалық bolTilePressed түймелерін басатын тректер; // ойнатқыш кездейсоқ 5x түймесін басып кетпейтініне көз жеткізіңіз

// айнымалыларды бұрылуға орнату

int intTick; // intDelay int intDelay дейін миллименттерді есептейді (цикл бойынша); // бағдарлама millis int intGameSpeed келесі айналымға дейін күтетін уақыт;

// отладка опцияларының абит

логикалық bolSerialBoard; // қашан true тақтаны сериялық мониторда басып шығарады

3 -қадам: Орнату функциясы

Орнату циклы - бұл arduino бастапқыда бір рет оқитын функция.

Орнату циклінде біз тек бірнеше айнымалылардың мәндерін орнатамыз, себебі оларды жариялау кезінде мәнді орнатудың орнына біз мұны осында жасаймыз.

Бұл кодты Void Setup -ке енгізуден бастаңыз.

bolPlay = жалған; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium;

Әр жол тек айнымалы мәнді орнатады.

bolPlay жалған болып орнатылады, сондықтан ойын ойнай бастайды.

intScore 0 -ге қойылған, себебі сіздің баллыңыз 0 -ден басталады.

intTick 0 -ден басталады, себебі бағдарлама қазір ештеңені есептемейді.

intDelay 1000 -ға орнатылған, себебі бұл плиткалар басталады.

intDiff - бұл аскетикалық нәрсе, сондықтан бағдарлама ойынның қиындығы үшін не жазуды біледі.

intGameSpeed intGameSpeedMedium кез келгеніне орнатылады, яғни ол орташа қиындықта орнатылады.

Содан кейін бұл кодты сіз енгізген кодтың астындағы Void Setup қойыңыз.

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

Serial.begin (9600);

Бұл arduino -ға компьютермен сериялық монитор арқылы сөйлесуді бастауды айтады (arduino IDE жоғарғы оң жақ батырмасын басу арқылы көрінеді).

Сіздің Void Setup енді осындай болуы керек!

void setup () {Serial.begin (9600); // сериялық мониторды іске қосу // айнымалыларды орнату bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // begin lcd's lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }

4 -қадам: Цикл функциясы

Цикл функциясын arduino әр итерация арқылы басқарады.

Келесі кодты Void Loop ішіне көшіріңіз.

void loop () {input (); // if (bolPlay == true) if if (bolPlay == true) {if (intTick> = intDelay) {// ойынды бұру керек пе, жоқ па, соны тексеріңіз Serial.println («~~~~~~~ ~~ «); // тақтада жылжуды білдіретін басып шығару // writeSerial (); // егер опция қосылған болса, тақтаны сериялық түймелерге жазыңызGame (); // ойнатқыштың кірістерін тексеру playBoard (); // тақтаны жылжытыңыз және жаңа тақтаны қосыңыз clearLcd (); // drawBoard () сызбас бұрын СКД -ны тазалаңыз; // тақтаны lcd түбіне салыңызCheck (); intTick = 0; // қалпына келтіру intTick} else {buttonGame (); // ойнатқыш кірістерін тексеру clearLcd (); // drawBoard () сызбас бұрын СКД -ны тазалаңыз; // тақтаны lcd's intTick = intTick + intGameSpeed -ке салыңыз; // белгіге қосу}} else {clearLcd (); // тақырыпты түсірмес бұрын СКД тазалаңыз (); // тақырып пен балл туралы ақпарат түймелерін көрсетуMenu (); // ойнатқыштың кірісін оқу clearBoard (); // барлық тақтаны қамтамасыз етіңіз = 0} кешігу (10); // ардуиноны қысқа уақытқа кешіктіріңіз}

Егер bolPlay шындыққа тең болса, бұл ойынның ойнап жатқанын білдіреді және ойынның барлық коды іске қосылуы керек, бірақ біз тек тақтаның intTick біздің intDelay -ден үлкен болған кезде жаңа тақта қосып, төмен жылжуын қалаймыз, әйтпесе біз әлі де пайдаланушыға батырманы басуға және intTick жылдамдығын арттыруға рұқсат бергіміз келеді.

Бұл кодтың көпшілігінде біз әлі жасамайтын функцияларды қолданады және біз оларды келесі қадамдарда жасаймыз. Бұл функциялардың мақсаты төмендегідей.

Енгізу пайдаланушы қандай батырмаларды басқанын оқиды.

buttonGame түймелердің мәзірде емес, ойын кезінде не істейтінін басқарады

playBoard тақтаға жаңа тақта қосады, содан кейін тақтадағы барлық нәрсені бір бос орынға жылжытады

clearLCD тақтайшалардың артында елестер қалмағанына көз жеткізу үшін СКД -ны тазартады

drawBoard arrGame арқылы өтеді және оны СКД -ге басып шығарады

clearBoard ойын болмаған кезде arrGame -ді толығымен жояды

bottomCheck arrGame төменгі жағын сәтсіздік жағдайына тексереді

тақырып мәзірде болған кезде ойынның атауы мен ұпай туралы ақпаратты көрсетеді

түймелер мәзірі пайдаланушының кірістері мәзірде не істейтінін басқарады.

gameOver - бұл басқа функция, бірақ ол мұнда шақырылмаған, бірақ оның орнына төменгіCheck және buttonGame функциялары деп аталады.

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 есептелген циклды қолдану арқылы бүкіл массив бойынша өтеді.

Ешқандай күйге келтірместен, СКД бұрын жазылғанды сақтайды

6 -қадам: DrawBoard функциясы

бұл кодты бағдарламаға көшіріңіз

void drawBoard () {for (int i = 1; i <= 15; i ++) {// сол жақтағы СКД -де 1 және 2 нөмірлерді салыңыз // егер тақта = 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); // үшінші колумға орнатыңыз (оң жақта) егер (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 -ге тең екендігін тексереді, осының негізінде тақта үшін әлі де хэштегті СКД -де басып шығарады. хит, немесе хит тақтайшасы үшін @.

7 -қадам: PlayBoard функциясы

бұл кодты бағдарламаға көшіріңіз.

void playBoard () {for (int i = 0; i <= 3; i ++) {arrGame [0] = 0;} // жоғарғы жолды тазалау arrGame [0] [кездейсоқ (0, 4)] = 1; // (int i = 15; i> = 1; i-) {// тақтаның төменгі жағынан жоғарыға қарай жұмыс істейтін кездейсоқ нүктені жоғарғы жолға орнатыңыз (int ii = 0; ii <= 3; ii ++) {// әрбір collum arrGame [ii] = arrGame [i - 1] [ii] үшін; }}}

бұл код барлық жоғарғы жолды 0 -ге тазартудан немесе плиткасыз басталады, содан кейін бір кездейсоқ тақтаны 1 -ге және көрсетілмеген тақтаға орнатады.

Содан кейін ол 15 -тен 1 -ге дейін кері цикл арқылы өтеді, бұл жолды жоғарыдағы жолға тең етіп теңестіріп, тақтаны СКД төмен қарай жылжытады.

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 («Ұпай:»); // ұпайды strScore жолына түрлендіру [3]; sprintf (strScore, «%d», intScore); // баллды LCD lcdRight.write экранына шығару (strScore); // diffictuly lcdRight.setCursor қосыңыз (10, 1); егер (intDiff == 0) {lcdRight.write («Оңай»); } if (intDiff == 1) {lcdRight.write («Орташа»); } егер (intDiff == 2) {lcdRight.write («Қатты»); } // lcdLeft.setCursor (0, 0) нұсқаулығын аздап басыңыз; lcdLeft.write («Enter» пернесін басыңыз); lcdLeft.setCursor (0, 1); lcdLeft.write («бастау үшін!»); }

Бұл код ойынның атауын және баллды СКД -ға жазады, бұл LCD -ге LCD.setCursor көмегімен теруді қайдан бастау керектігін айтып, содан кейін LCD.write жолын жазу арқылы жасайды.

Бұл жерде strScore жаңа айнымалы құрылады, ол intScore -ды sprintf функциясын қолдана отырып, деректер түріне немесе char түріне түрлендіру үшін қолданылады.

intDiff мұнда да қолданылады, оның мәндеріне қарай әр түрлі қиындық нұсқаларын басып шығарады.

10 -қадам: ButtonsMenu функциясы

бағдарламаға келесі кодты енгізіңіз

void keysMenu () {// enter басылған кезде ойынды бастаңыз және егер (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // 3 батырмасы басылғанда тақтаны сериялық түрде басып шығару опциясын қосыңыз, егер (intInput == 3) {if (bolSerialBoard == false) {Serial.println («Serial Board Active»); bolSerialBoard = ақиқат; } else {Serial.println («Сериялық тақта өшірілген»); bolSerialBoard = жалған; }} // ойын жылдамдығын оңай қиындыққа қойыңыз, егер (intInput == 0) {Serial.print («Ойын оңай» («); 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 void Loop ішіндегі жалғанға тең болғанда ғана іске қосылады

егер intEnter 1 -ге қойылса, бұл енгізу батырмасы басылғанын білдіреді, егер ол басылса, бағдарлама bolPlay -ді ақиқатқа орнатады және ойын басталады.

Содан кейін бағдарлама intInput неге тең екенін оқиды. егер ол 0 -ге тең болса, сол жақтағы бірінші түйме басылады, оңға қарай 3 -ке дейін көтеріледі. Егер intInput 4 -ке тең болса, ешқандай түйме басылмайды.

Егер 0-2 түймелері басылса, ойын күрделілікті өзгертеді, сонымен қатар ойын жылдамдығының мәнін реттейді, яғни ол тездетіледі.

егер 3 батырмасы басылса, ойын бағдарламаны түзету режимін қосады немесе өшіреді, онда бағдарламадағы мәселелерді табуға көмектесу үшін барлық тақта сериялық мониторда басылады.

11 -қадам: ButtonsGame функциясы

келесі кодты бағдарламаға көшіріңіз

void түймелеріGame () {if (intInput! = 4) {// егер түймешік басылса, егер (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 void Loop ішінде ақиқатқа тең болғанда ғана іске қосылады.

IntInput мәніне негізделген түймелер менюі сияқты, ойыншы плиткаға соғылғанын немесе жіберілмегенін тексереді.

Ол мұны arrGame арқылы төменнен жоғарыға өту арқылы уақытша циклды қолдана отырып, қай қатардың ең төмен екенін ізделмеген тақтайшамен іздейді. Содан кейін ол басылған батырмаға сәйкес келетін жолдағы нүктенің сақталмаған тақтайша ма, жоқ па екенін тексереді, егер ол көрсетілмеген болса, оны 1 емес, 2 -ге теңестіреді, яғни ол @түрінде көрсетіледі, әйтпесе ол gameOver -ді іске қосады. біз әлі жасамайтын функция.

Бұл функция bolTilePressed айнымалы мәнін батырманы басқан кезде ақиқатқа және ешбір түйме басылмаған кезде жалған күйге қою арқылы пайдаланады. Бұл пайдаланушының ойынды кездейсоқ жоғалтпауын қамтамасыз ету үшін, себебі бағдарлама оны ұстап тұрғанда түймені бірнеше рет басады деп ойлады.

12 -қадам: GameOver функциясы

Келесі кодты бағдарламаға көшіріңіз

void gameOver () {Serial.println («Ойын аяқталды!»); Serial.print («Сіздің баллыңыз:»); Serial.println (intScore); Serial.print («Сіздің жылдамдығыңыз:»); Serial.println (intDelay); bolPlay = жалған; }

Бұл checkBottom немесе buttonGame функциялары арқылы іске қосылады және bolPlay параметрін жалған деп орнату арқылы ойынның соңын бастайды.

Ол сонымен қатар пайдаланушылардың ұпайлары туралы сериялық мониторға хабарламаны басып шығарады және жылдамдық тақталары миллисекундтарда қосылады.

13 -қадам: енгізу функциясы

Келесі кодты бағдарламаға көшіріңіз.

void input () {intEnter = digitalRead (btnEnter); // оқуды енгізу // басқа кірістердің қайсысын оқу керек, немесе егер 4 -ке орнатылмаған болса (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 Pressed!»);} if (intInput! = 4) {Serial.print («Button Press:»); Serial.println (intInput); } else {// егер ешқандай түйме басылмаса, reset bolTilePressed bolTilePressed = false; }}

Бұл код GameG түймелері мен buttonMenu функциялары үшін қолданылады. түймелер негізінде пайдаланушы басады, ол intInput мәнін орнатады, немесе егер ешқандай түйме басылмаса, ол intInput мәнін 4 -ке тең етеді.

Егер ешқандай түйме басылмаса, онда бұл жерде bolTilePressed түймелері Game функциясы үшін қалпына келтіріледі.

Ол сонымен қатар түйме басылатын сериялық мониторға хабарламаны басып шығарады.

14 -қадам: BottomCheck функциясы

келесі кодты бағдарламаға көшіріңіз.

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// 4 collumns үшін if (arrGame [15] == 1) {// егер тақта төменгі жағында болса.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 функциясы

келесі кодты бағдарламаға көшіріңіз

жарамсыз 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 («»); }}}

Бұл buttonMenu функциясында қосылатын отладка опциясы арқылы орындалатын функция. Егер bolSerialBoard бұл функцияда true мәніне орнатылса, ол arrGame арқылы өтеді және массивті қолдану арқылы тестілеу үшін барлық тақтаны сериялық мониторға басып шығарады.

16 -қадам: Аяқтау

Аяқтау!
Аяқтау!

Сіздің барлық кодыңыз толық болмауы керек және ұқсас болуы керек!

/ * * Аты - фортепиано плиткалары; Arduino * By - Доменик Марулли * Күні - 11/ *

/ кітапханалар кіреді

#қосу

// бұл айнымалылар - сіз өзгерте алатын опциялар - жоғары сандар = жылдам ойын жылдамдығы

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

// түйреуіштерді анықтаңыз

#анықтаңыз

// СКД нысандарын жасау (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}};

// ойынға айнымалыларды орнату

логикалық bolPlay; // тректер, егер ойыншы int intScore; // ойыншының ұпайын int intiff арқылы бақылайды; // ойынның қандай қиын екенін айту үшін эстетикалық нәрсе

// енгізу үшін айнымалыларды орнату

int intEnter; // пайдаланушы int intInput енгізу батырмасын басатынын бақылайды; // пайдаланушы логикалық bolTilePressed түймелерін басатын тректер; // ойнатқыш кездейсоқ 5x түймесін басып кетпейтініне көз жеткізіңіз

// айнымалыларды бұрылуға орнату

int intTick; // intDelay int intDelay дейін миллименттерді есептейді (цикл бойынша); // бағдарлама millis int intGameSpeed келесі айналымға дейін күтетін уақыт;

// отладка опцияларының абит

логикалық bolSerialBoard; // қашан true тақтаны сериялық мониторда басып шығарады

// бір рет іске қосылатын орнату

void setup () {Serial.begin (9600); // сериялық мониторды іске қосу // айнымалыларды орнату bolPlay = false; intScore = 0; intTick = 0; intDelay = 1000; intDiff = 1; intGameSpeed = intGameSpeedMedium; // begin lcd's lcdLeft.begin (16, 2); lcdRight.begin (16, 2); }

// әр 10 миллисекундада орындалатын цикл

void loop () {input (); // if (bolPlay == true) if if (bolPlay == true) {if (intTick> = intDelay) {// ойынды бұру керек пе, жоқ па, соны тексеріңіз Serial.println («~~~~~~~ ~~ «); // тақтада жылжуды білдіретін басып шығару // writeSerial (); // егер опция қосылған болса, тақтаны сериялық түймелерге жазыңызGame (); // ойнатқыштың кірістерін тексеру playBoard (); // тақтаны жылжытыңыз және жаңа тақтаны қосыңыз clearLcd (); // drawBoard () сызбас бұрын СКД -ны тазалаңыз; // тақтаны lcd түбіне салыңызCheck (); intTick = 0; // қалпына келтіру intTick} else {buttonGame (); // ойнатқыш кірістерін тексеру clearLcd (); // drawBoard () сызбас бұрын СКД -ны тазалаңыз; // тақтаны lcd's intTick = intTick + intGameSpeed -ке салыңыз; // белгіге қосу}} else {clearLcd (); // тақырыпты түсірмес бұрын СКД тазалаңыз (); // тақырып пен балл туралы ақпарат түймелерін көрсетуMenu (); // ойнатқыштың кірісін оқу clearBoard (); // барлық тақтаны қамтамасыз етіңіз = 0} кешігу (10); // ардуиноны қысқа уақытқа кешіктіріңіз}

// 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 («»); }}}

// тақтаны дискіге тартады

void drawBoard () {for (int i = 1; i <= 15; i ++) {// сол жақтағы СКД -де 1 және 2 нөмірлерді салыңыз // егер тақта = 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); // үшінші колумға орнатыңыз (оң жақта) егер (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] [кездейсоқ (0, 4)] = 1; // (int i = 15; i> = 1; i-) {// тақтаның төменгі жағынан жоғарыға қарай жұмыс істейтін кездейсоқ нүктені жоғарғы жолға орнатыңыз (int ii = 0; ii <= 3; ii ++) {// әрбір collum 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; }}}

// СКД экранында Негізгі мәзірді көрсетеді

void title () {// тақырыпты LCD -ге жазыңыз және lcdRight.setCursor (0, 0) балл үшін бос орын; lcdRight.write («Фортепиано плиткалары»); lcdRight.setCursor (0, 1); lcdRight.write («Ұпай:»); // ұпайды strScore жолына түрлендіру [3]; sprintf (strScore, «%d», intScore); // баллды LCD lcdRight.write экранына шығару (strScore); // diffictuly lcdRight.setCursor қосыңыз (10, 1); егер (intDiff == 0) {lcdRight.write («Оңай»); } if (intDiff == 1) {lcdRight.write («Орташа»); } егер (intDiff == 2) {lcdRight.write («Қатты»); } // lcdLeft.setCursor (0, 0) нұсқаулығын аздап басыңыз; lcdLeft.write («Enter» пернесін басыңыз); lcdLeft.setCursor (0, 1); lcdLeft.write («бастау үшін!»); }

// түймелерді тексереді және ойыннан тыс кезде олар үшін не істеу керек

void keysMenu () {// enter басылған кезде ойынды бастаңыз және егер (intEnter == 1) {bolPlay = true; intScore = 0; playBoard (); drawBoard (); } // 3 батырмасы басылғанда тақтаны сериялық түрде басып шығару опциясын қосыңыз, егер (intInput == 3) {if (bolSerialBoard == false) {Serial.println («Serial Board Active»); bolSerialBoard = ақиқат; } else {Serial.println («Сериялық тақта өшірілген»); bolSerialBoard = жалған; }} // ойын жылдамдығын оңай қиындыққа қойыңыз, егер (intInput == 0) {Serial.print («Ойын оңай» («); 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 keysGame () {if (intInput! = 4) {// егер түймешік басылса, егер (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 = жалған; }

// ойыншының кіруін тексереді

void input () {intEnter = digitalRead (btnEnter); // оқу енгізу енгізу // басқа кірістердің қайсысын оқу немесе егер 4 (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 Pressed!»);} if (intInput! = 4) {Serial.print («Button Press:»); Serial.println (intInput); } else {// егер ешқандай түйме басылмаса, reset bolTilePressed bolTilePressed = false; }}

// тақтаның төменгі жағын сәтсіздікке тексереді

void bottomCheck () {for (int i = 0; i <= 3; i ++) {// 4 collumns үшін if (arrGame [15] == 1) {// егер тақта серияның төменгі жағында болса.println («Төмендегі плитка»); arrGame [15] = 2; drawBoard (); кешіктіру (400); arrGame [15] = 1; drawBoard (); кешіктіру (400); arrGame [15] = 2; drawBoard (); кешіктіру (400); arrGame [15] = 1; drawBoard (); кешіктіру (400); ойын аяқталды(); }}}

// bolSerialBoard рас болса, тақтаны сериялық мониторға басып шығарады

жарамсыз 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 -ға жүктеп, ләззат алыңыз!

Ұсынылған: