Простая игра Наперстки

slideruno
Offline
Зарегистрирован: 26.06.2016

Собственно, разбирался с работой 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;
}
}

Может кому будет интересно. А лучше работа над ошибками по оптимизации кода.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Вы бы сразу ссылку на библиотеку LCD_I2C давали, а размещать её лучше в папке скетча, сменив директиву так:

#include "LiquidCrystal_I2C.h"  

 

slideruno
Offline
Зарегистрирован: 26.06.2016
svetly
svetly аватар
Offline
Зарегистрирован: 23.12.2016

а почему экран так станно подключен? там же куча проводов должно  ыть

svetly
svetly аватар
Offline
Зарегистрирован: 23.12.2016

а задумка очень простая и интересная!

svetly
svetly аватар
Offline
Зарегистрирован: 23.12.2016

а можно схем4ку, как собирать эту вещь?ё

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

svetly пишет:

а почему экран так станно подключен? там же куча проводов должно  ыть

через модуль I2C

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, не строго! Я думал Вы поставили сервы и реальные напёрстки двигаете :((((

Xumuk
Xumuk аватар
Offline
Зарегистрирован: 03.03.2016

ЕвгенийП пишет:

Ну, не строго! Я думал Вы поставили сервы и реальные напёрстки двигаете :((((

О_о сервами?)

vvadim
Offline
Зарегистрирован: 23.05.2012

прикольно

даже поигрался немного))))

AJlover
AJlover аватар
Offline
Зарегистрирован: 14.09.2016

Можно еще randomSeed() в setup засунуть. Для пущей рандомности.

svetly
svetly аватар
Offline
Зарегистрирован: 23.12.2016

МОжно нормальную схемку пожлуйсто? И чтобы экран без модулей всяких подключался!

svetly
svetly аватар
Offline
Зарегистрирован: 23.12.2016

Схему в fritzing нарисовать можно

slideruno
Offline
Зарегистрирован: 26.06.2016

AJlover пишет:

Можно еще randomSeed() в setup засунуть. Для пущей рандомности.

С рандомостью есть проблемы, из 3х чисел бывает "залипает" на одной и до 4х раз повторения. 

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

slideruno пишет:

AJlover пишет:

Можно еще randomSeed() в setup засунуть. Для пущей рандомности.

С рандомостью есть проблемы, из 3х чисел бывает "залипает" на одной и до 4х раз повторения. 

сравнивай старое с новым и запрашивай рандом, пока станет не равно.