Простая игра Наперстки
- Войдите на сайт для отправки комментариев
Вс, 25/12/2016 - 23:13
Собственно, разбирался с работой LCD 16x2(подсключение по шине i2c), кнопками с ардуино. Родилась простейшая игра "Наперстки". Суть известной игры - угадать в каком наперстке спрятан шарик.
Шарик прячется с помощью генератора случайных чисел randon(). Три кнопки имитируют выбор наперстка.
В итоге...понадобилось:
1. Arduino uno;
2. Кнопки 3шт. + 3 шт. резитор 10КОм.
3.LCD 16x2 c модулем PCF8574T для подключения по шине i2c;
4. Макетная плата + провода;
Для программной реализации нам понадобится:
Библиотека Arduino-LiquidCrystal-I2C-library-master.zip.
Подключение LCD:
GND-земля, VCC-5V, SDA - A4, SCL-A5
#include <Wire.h> //библиотека для работы по i2c #include <LiquidCrystal_I2C.h> //библиотека для lcd по i2c LiquidCrystal_I2C lcd(0x27, 16, 2); // подключение дисплея 16x2 const int PIN_button_SR = 2; // указываем номер вывода arduino, к которому подключена кнопка 1 (она же старт) const int PIN_button_SND = 3; // указываем номер вывода arduino, к которому подключена кнопка 2 const int PIN_button_TRD = 4; // указываем номер вывода arduino, к которому подключена кнопка 3 long randNumber; // переменная для случайного числа int kolpachek; // переменная для наперстка void setup() { pinMode(PIN_button_SR, INPUT); // устанавливаем режим работы вывода кнопки 1, как "вход" pinMode(PIN_button_SND, INPUT); // устанавливаем режим работы вывода кнопки 2, как "вход" pinMode(PIN_button_TRD, INPUT); // устанавливаем режим работы вывода кнопки 3, как "вход" delay(300); // ждем 300мс lcd.begin(); //инициализация дисплея lcd.setCursor(0, 0); //устанавливаем курсор в начало 1 строки lcd.print("Naperstki_V1.0"); //выводим текст на экран delay(500); //задержка 500мс lcd.setCursor(0, 1); //устанавливаем курсор в начало 2 строки lcd.print("Nazhmi START"); //выводим текст на экран int r=0; while(r<1) {if (digitalRead(PIN_button_SR)){r=1;};} //ждем нажатие кнопки 1 lcd.clear(); //отчищаем экран lcd.setCursor(3, 0); //устанавливаем курсор 1 строка 4 символ lcd.print("Gde sharik?"); //выводим текст на экран } void loop() { Func_ball_hide(); //передаем работу функции Func_ball_hide() Func_buttons_control(); //передаем работу функции управление кнопками } void Func_ball_hide(){ lcd.clear(); //отчищаем экран lcd.setCursor(3, 0); // Устанавливаем курсор в начало 1 строки lcd.print("Gde sharik?"); //выводим текст на экран for (int i=1; i<=3; i++){ // рисуем наперстки lcd.setCursor(5+i, 1); // delay(500); // lcd.write(255);} // randNumber=random(1, 4); // прячем шарик, случайное число от 1 до 3 включительно } void Func_buttons_control(){ kolpachek=0; //устанавливаем начальное значение, наперсток не выбран while(kolpachek==0){ //цикл, ждем выбора наперстка от игрока if(digitalRead(PIN_button_SR)){ //нажата кнопка 1 kolpachek = 1; lcd.clear(); if (kolpachek==randNumber){ //если нажатая кнопка 1 соответствует наперстку со спрятанным шариком lcd.setCursor(3, 0); lcd.print("Vigrali!!!!!!");} //угадали else {Func_vivod ();}} //иначе проиграли if(digitalRead(PIN_button_SND)){ kolpachek = 2; lcd.clear(); if (kolpachek==randNumber){ //если нажатая кнопка 2 соответствует наперстку со спрятанным шариком lcd.setCursor(3, 0); lcd.print("Vigrali!!!!!!");} //угадали else {Func_vivod();}} //иначе проиграли if(digitalRead(PIN_button_TRD)){ kolpachek = 3; lcd.clear(); if (kolpachek==randNumber){ //если нажатая кнопка 2 соответствует наперстку со спрятанным шариком lcd.setCursor(3, 0); lcd.print("Vigrali!!!!!!");} //угадали else {Func_vivod ();}} //иначе проиграли } delay(2000); } void Func_vivod (){ //функция показывает где был шарик, в случае если пройгрыш (у нас все по-честному=)) lcd.clear(); lcd.setCursor(3, 0); lcd.print("Neverno :("); switch (randNumber){ case 1: lcd.setCursor(6, 1);lcd.print("*OO");break; case 2: lcd.setCursor(6, 1);lcd.print("0*0");break; case 3: lcd.setCursor(6, 1);lcd.print("00*");break; } }
Может кому будет интересно. А лучше работа над ошибками по оптимизации кода.
Вы бы сразу ссылку на библиотеку LCD_I2C давали, а размещать её лучше в папке скетча, сменив директиву так:
Библиотека бралась http://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
а почему экран так станно подключен? там же куча проводов должно ыть
а задумка очень простая и интересная!
а можно схем4ку, как собирать эту вещь?ё
а почему экран так станно подключен? там же куча проводов должно ыть
через модуль I2C
Ну, не строго! Я думал Вы поставили сервы и реальные напёрстки двигаете :((((
Ну, не строго! Я думал Вы поставили сервы и реальные напёрстки двигаете :((((
О_о сервами?)
прикольно
даже поигрался немного))))
Можно еще randomSeed() в setup засунуть. Для пущей рандомности.
МОжно нормальную схемку пожлуйсто? И чтобы экран без модулей всяких подключался!
Схему в fritzing нарисовать можно
Можно еще randomSeed() в setup засунуть. Для пущей рандомности.
С рандомостью есть проблемы, из 3х чисел бывает "залипает" на одной и до 4х раз повторения.
Можно еще randomSeed() в setup засунуть. Для пущей рандомности.
С рандомостью есть проблемы, из 3х чисел бывает "залипает" на одной и до 4х раз повторения.
сравнивай старое с новым и запрашивай рандом, пока станет не равно.