Простая игра Наперстки
- Войдите на сайт для отправки комментариев
Вс, 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х раз повторения.
сравнивай старое с новым и запрашивай рандом, пока станет не равно.