Крестики-нолики на Си.

Chaco
Offline
Зарегистрирован: 11.01.2019

Здравствуйте. Нужен скетч на Ардуино. Игра крестики -нолики на Си. Играют два человека. 9 светодиодов и 2 кнопки, одной выбираешь диод, другой утверждаешь. Точно как в этом видео. https://m.youtube.com/watch?v=_GQQUjHrRsY. Жду ответа.

Gas311
Gas311 аватар
Offline
Зарегистрирован: 06.12.2018

Могу сделать. Пишите на почту

Chaco
Offline
Зарегистрирован: 11.01.2019

Давайте адрес почты.

Gas311
Gas311 аватар
Offline
Зарегистрирован: 06.12.2018
karamzin01
Offline
Зарегистрирован: 08.03.2018

р е а л и з у е м о - maslachenko767@mail.ru , консультации, подбор компонентов бесплатно, гарантии

karamzin01
Offline
Зарегистрирован: 08.03.2018

очень не понятный заказчик(

Gas311
Gas311 аватар
Offline
Зарегистрирован: 06.12.2018

Всё там понятно. Простые крестики нолики

karamzin01
Offline
Зарегистрирован: 08.03.2018

не в том дело)

Chaco
Offline
Зарегистрирован: 11.01.2019

Вопрос решен на freelance.ru за 3000 рублей, и один вечер. Спасибо - великие гении Ардуино.

Gas311
Gas311 аватар
Offline
Зарегистрирован: 06.12.2018

Да программа то совсем простенькая. Ему для курсовой нужна была. Сам то не учился. 

Может кому пригодится.

#define LED0 2
#define LED1 3
#define LED2 4
#define LED3 5
#define LED4 6
#define LED5 7
#define LED6 8
#define LED7 9
#define LED8 10
#define SET_BTN 11
#define CHANGE_BTN 12
#define X 1
#define O 2
//=============================================
 
//Информация о предыдущем состоянии кнопок. Необходимо для борьбы с дребезгом контактов
char prevStateChangeBtn = HIGH;
char prevStateSetBtn = HIGH;
//=============================================
//Эта поле хранит информацию о том, чья сейчас очередь(X или O)
char currentPlayersTurn = X;
//=============================================
//Эти счетчики используются для того, чтобы мигание светодиодами выполнялось параллельно всему процессу, а не тормозя всю работу, как это реализовано в примере
char O_BlinkCounter = 0;
char Change_BlinkCounter = 0;
//=============================================
//Это текущая выбранная ячейка с помощью первой кнопки
int SelectedCell = 0;
//=============================================
//Массив с пинами светодиодов(Аналог массива "led" из вашего примера)
int LedPins[9] = {LED0, LED1, LED2, LED3, LED4, LED5, LED6, LED7, LED8};
//=============================================
char GameField[9] = {
  0, 0, 0,
  0, 0, 0,
  0, 0, 0
};
 
char X_Matrix[9] = {
  1, 0, 1,
  0, 1, 0,
  1, 0, 1
};
 
char O_Matrix[9] = {
  1, 1, 1,
  1, 0, 1,
  1, 1, 1
};
 
//=============================================
void changePosition ()
{
  SelectedCell++;
  if (SelectedCell > 8)
  {
    SelectedCell = 0;
  }
 
  Serial.println(SelectedCell+1);
}
//=============================================
void makePlay()
{
  if (GameField[SelectedCell] == 0)
  {
    GameField[SelectedCell] = currentPlayersTurn;
 
    if (currentPlayersTurn == X)
    {
      currentPlayersTurn = O;
    }
    else if (currentPlayersTurn == O)
    {
      currentPlayersTurn = X;
    }
  }
}
//=============================================
char validateGame()
{
  //проверяем строки
  for (int row = 0; row < 3; row++)
  {
    if (GameField[row*3] != 0 && GameField[row*3] == GameField[row*3 + 1] && GameField[row*3 + 1] == GameField[row*3 + 2])
    {
      return currentPlayersTurn == X ? O : X;
    }
  }
 
  //проверяем колонки
  for (int col = 0; col < 3; col++)
  {
    if (GameField[col] != 0 && GameField[col] == GameField[col + 3] && GameField[col + 3] == GameField[col + 6])
    {
      return currentPlayersTurn == X ? O : X;
    }
  }
 
  //проверяем главную диагональ
  if (GameField[0] != 0 && GameField[0] == GameField[4] && GameField[4] == GameField[8])
  {
    return currentPlayersTurn == X ? O : X;
  }
  
  //проверяем побочную диагональ
  if (GameField[2] != 0 && GameField[2] == GameField[4] && GameField[4] == GameField[6])
  {
    return currentPlayersTurn == X ? O : X;
  }
 
  for (int j = 0; j < 9; j++)
  {
    if (GameField[j] == 0)
    {
      return 0;
    }
  }
 
  //Ничья
  for (int i = 0; i < 9; i++)
  {
     GameField[i] = 1;
  }
}
//=============================================
void announceWinner(char winner)
{
  if (winner == X)
  {
    for (int i = 0; i < 9; i++)
    {
      GameField[i] = X_Matrix[i];
    }
  }
  else if (winner == O)
  {
    for (int i = 0; i < 9; i++)
    {
      GameField[i] = O_Matrix[i];
    }
  }
}
//=============================================
void reset()
{
  SelectedCell = 0;
  
  for (int i = 0; i < 9; i++)
  {
      GameField[i] = 0; 
  }
}
//=============================================
void Flush()
{
  for (int i = 0; i < 9; i++)
  {
    if (GameField[i] == X)
    {
      digitalWrite(LedPins[i], HIGH);
    }
    else if (GameField[i] == O)
    {
      if (O_BlinkCounter > 64)
      {
        digitalWrite(LedPins[i], HIGH);
      }
      else 
      {
        digitalWrite(LedPins[i], LOW);
      }
    }
    else if (i == SelectedCell && Change_BlinkCounter > 64)
    {
      digitalWrite(LedPins[i], HIGH);  
    }
    else 
    {
      digitalWrite(LedPins[i], LOW);  
    }
  }
}
//=============================================
void setup() {
 Serial.begin(9600);// открываем последовательное соединение с Serial monitor
 
  //Устанавливаем режим работы пинов для светодиодов на выдачу
  for (int i = 0; i < 9; i++){
    pinMode(LedPins[i], OUTPUT);
  }
  
  //Устанавливаем режим работы пинов для кнопок на прием
  pinMode(SET_BTN, INPUT);
  pinMode(CHANGE_BTN, INPUT);
 
  //Активируем подтяжечные резисторы для кнопок
  digitalWrite(SET_BTN, HIGH);
  digitalWrite(CHANGE_BTN, HIGH);
}
//=============================================
void loop() {
  O_BlinkCounter+=3;
  Change_BlinkCounter+=16;
  Flush();
 
  delay(10);//Борьба с дребезгом кнопок
  char currentStateChangeBtn = digitalRead(CHANGE_BTN);
  char currentStateSetBtn = digitalRead(SET_BTN);
  
  char isButtonChangePressed = currentStateChangeBtn == LOW && prevStateChangeBtn != currentStateChangeBtn;
  char isButtonSetPressed = currentStateSetBtn == LOW && prevStateSetBtn != currentStateSetBtn;
 
  //Если зажаты две кнопки сразу
  if ((currentStateChangeBtn == LOW) && (currentStateSetBtn == LOW) && ((prevStateChangeBtn != currentStateChangeBtn) || (prevStateSetBtn != currentStateSetBtn) ) )
  {
    reset();
  }
  else 
  {
    //Если зажата певрая кнопка
    if (isButtonChangePressed)
    {
      changePosition();
    }
 
    //Если нажата вторая кнопка
    if (isButtonSetPressed)
    {
      makePlay();
    }
  }
 
  //Запоминаем состояния кнопок для борьбы с дребезгом
  prevStateChangeBtn = currentStateChangeBtn;
  prevStateSetBtn = currentStateSetBtn;
 
  //Проверяем, а не появился ли у нас победитель
  char gameState = validateGame();
  
  announceWinner(gameState);
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Chaco пишет:
Вопрос решен на freelance.ru за 3000 рублей, и один вечер. Спасибо - великие гении Ардуино.

Вам на Амперке предлагали написать за 2000 - вы не согласились, на Фриланс за 3000 пошли :)

Chaco
Offline
Зарегистрирован: 11.01.2019

Программа была простенькая, но вам для ее выполнения нужно 3 дня было... А мне всего лишь зачёт в предмете -
Великие Гении Ардуино.

Chaco
Offline
Зарегистрирован: 11.01.2019

А теперь пусть вас всех жаба задушит.

Gas311
Gas311 аватар
Offline
Зарегистрирован: 06.12.2018

Да не. Нам не жалко ваших трёх тысяч. Заплатили значит заплатили. 

b707
Offline
Зарегистрирован: 26.05.2017

Chaco пишет:
Программа была простенькая, но вам для ее выполнения нужно 3 дня было... А мне всего лишь зачёт в предмете - Великие Гении Ардуино.

если б я с Вами договаривался - я бы меньше чем за неделю не взялся бы :) Не люблю спешить.  Если нужно было быстро - тогда все справедливо, на фрилансе взяли лишние деньги за скорость

Жаба меня не задушит :) - мне совершенно не жалко, что кто-то другой тоже заработал  Славо богу не голод сейчас :)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Chaco пишет:
А теперь пусть вас всех жаба задушит.

А пусть тебя теперь преподы по программе погоняют, Великий Лодырь.  

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Гении-то должны были подорваться и, теряя трусы, бежать кодить - так я понимаю ход мысли?

Chaco
Offline
Зарегистрирован: 11.01.2019

В этом и есть ваша проблема. Пока вы снимали трусы, другие зарабатывали. А если не умеете, то и эту ветку на форуме открывать не надо было

Chaco
Offline
Зарегистрирован: 11.01.2019

К стати, не форум, а сговор бабок на базаре. Из всех, только 4 человека по сути ответили.

Chaco
Offline
Зарегистрирован: 11.01.2019

Считайте, что благодаря уважаемому gas311, вы все этот код увидели. Я подарил ему коммерчиские права на этот код.

Chaco
Offline
Зарегистрирован: 11.01.2019

Админ, считаю что вопрос в этой ветке исчерпан. Пора закрывать тему.
А то бабки гляди - перегрызуться.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Вы что, накидались с утра штоли? Никому особо ваши метания неинтересны были - только и всего. А скоко вы отдали за скетч - ваше личное дело. Может и 1.5 отдали или 10 - пруфов-то нет.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ТС, нас не трогает ничо, мы в чай добавляем 

и погружаемся в нирвану.  А ты можешь дальше кипятком сать. 

b707
Offline
Зарегистрирован: 26.05.2017

Chaco пишет:
Считайте, что благодаря уважаемому gas311, вы все этот код увидели. Я подарил ему коммерчиские права на этот код.

если исполнитель - gas311 - то откуда наезды на форум? - он вам на этом форуме первым услуги предложил :)

 

b707
Offline
Зарегистрирован: 26.05.2017

А, кстати, раз ТС милостиво передал этот код обществу  - почему бы не обсудить. Я бы по другому написал :)

ИМХО, определение победителя черезчур мудреное, можно в разы упростить. Эти дикие вложенные условия, имхо, нафик не нужны :) Нужно всего лишь сравнить фишки конкретного игрока с выигрышными комбинациями - их всего восемь - и сделать это можно в одном простеньком цикле.

К тому же, проверять победителя до пятого хода вовсе не имеет смысла. А дальше после каждого хода можно проверять на победу только комбинацию игрока, только что сделавшего ход.

gas311 - вот такие строчки - даже если вы уверены, что они правильно работают - писать не надо, это моветон

char isButtonChangePressed = currentStateChangeBtn == LOW && prevStateChangeBtn != currentStateChangeBtn;

 

Gas311
Gas311 аватар
Offline
Зарегистрирован: 06.12.2018

А я и не писал. Это ТС показал мне программу с фриланса. За которую он отдал 3000 р. И разрешил выложить её сюда. 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

b707 пишет:

ИМХО, определение победителя черезчур мудреное, можно в разы упростить. Эти дикие вложенные условия, имхо, нафик не нужны :) Нужно всего лишь сравнить фишки конкретного игрока с выигрышными комбинациями - их всего восемь - и сделать это можно в одном простеньком цикле.

Я, кстати, не удивлён и оказывался в такой ситуации не раз. Когда требование "нужно прям через два часа" - ни о каких оптимальных алгоритмах не думаешь. На следующий день смотришь в код и непонимаешь - с похмела писал что ли... Что-то походя, конечно, сделаешь красиво (потому что раньше над подобным размышлял), но с первого быстрого кодинга всегда получается Пикассо.

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Я, кстати, не удивлён и оказывался в такой ситуации не раз. Когда требование "нужно прям через два часа" - ни о каких оптимальных алгоритмах не думаешь.

а, тогда все понятно. Для быстрого написания код вполне ничего.

 

DrProg
Offline
Зарегистрирован: 07.08.2015

Испытываю испанский стыд. И за заказчика - ленивую жопу, и за исполнителя. Одно это только на зачет для такого же гениального препода годится:

#define LED0 2
#define LED1 3
#define LED2 4
#define LED3 5
#define LED4 6
#define LED5 7
#define LED6 8
#define LED7 9
#define LED8 10
 
Индусский код - испансикй стыд.
Gas311
Gas311 аватар
Offline
Зарегистрирован: 06.12.2018

DrProg пишет:

Одно это только на зачет для такого же гениального препода годится:

Заказчик пишет, что препод 6 лет в мелкософте проработал. 

b707
Offline
Зарегистрирован: 26.05.2017

DrProg пишет:

Индусский код - испансикй стыд.

утверждается. что код написан за 2 часа. Если так - то я после этого не считаю себя вправе что-либо обсуждать, потому как сам не напишу такого за пару часов.

А без учета времени можно много что обсуждать в этом коде - я там выше уже писал. что делал бы по другому.

Green
Онлайн
Зарегистрирован: 01.10.2015

DrProg пишет:

#define LED0 2
#define LED1 3
#define LED2 4
#define LED3 5
#define LED4 6
#define LED5 7
#define LED6 8
#define LED7 9
#define LED8 10
 
Индусский код - испансикй стыд.

Что смущает?

Gas311
Gas311 аватар
Offline
Зарегистрирован: 06.12.2018

Можно конечно написать это массивом. Но в процессор код в итоге загрузится тот же самый. Разница - массивом смотрится солиднее? А кому это надо? Или экономия бумаги?

Green
Онлайн
Зарегистрирован: 01.10.2015

А кто то предпочитает настройки вообще держать в отдельном хедере. Массивы будем туда пихать? Или enum-ы?

Gas311
Gas311 аватар
Offline
Зарегистрирован: 06.12.2018

Ну и я ж про то. Кому как удобнее, так и пишет.

Вы не представляете, сколько критиков учили Пушкина, как стихи писать. Все знали, как надо и как не надо. А он всё равно писал. 

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

sadman41 пишет:

b707 пишет:

ИМХО, определение победителя черезчур мудреное, можно в разы упростить. Эти дикие вложенные условия, имхо, нафик не нужны :) Нужно всего лишь сравнить фишки конкретного игрока с выигрышными комбинациями - их всего восемь - и сделать это можно в одном простеньком цикле.

Я, кстати, не удивлён и оказывался в такой ситуации не раз. Когда требование "нужно прям через два часа" - ни о каких оптимальных алгоритмах не думаешь. На следующий день смотришь в код и непонимаешь - с похмела писал что ли... Что-то походя, конечно, сделаешь красиво (потому что раньше над подобным размышлял), но с первого быстрого кодинга всегда получается Пикассо.

Вам не нравится Пикассо? А под другим углом смотреть пробовали )))

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Он же не Кустодиевская барышня, чтобы всем нравиться... 

Gas311
Gas311 аватар
Offline
Зарегистрирован: 06.12.2018

А чем Пикассо плох?

andriano
andriano аватар
Онлайн
Зарегистрирован: 20.06.2015

sadman41 пишет:

Он же не Кустодиевская барышня, чтобы всем нравиться...