Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Игра Arduino Touch Tic-Tac-Toe

Компоненты и расходные материалы

Arduino UNO
× 1
2,8 "сенсорный экран
× 1

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

Дорогие друзья, добро пожаловать в очередной учебник по Arduino! В этом подробном руководстве мы собираемся создать игру Arduino Tic-Tac-Toe. Как видите, мы используем сенсорный экран и играем против компьютера. Простая игра, такая как крестики-нолики, - отличное введение в программирование игр и искусственный интеллект. Несмотря на то, что мы не будем использовать какие-либо алгоритмы искусственного интеллекта в этой игре, мы поймем, почему алгоритмы искусственного интеллекта требуются в более сложных играх.

Разработка игр для Arduino - дело непростое и требует много времени. Но мы можем создать несколько простых игр для Arduino, потому что это весело и позволит нам изучить некоторые более сложные темы программирования, такие как искусственный интеллект. Это отличный учебный опыт, а в конце у вас будет хорошая игра для детей!

Теперь приступим к созданию этого проекта.

Шаг 1. Получите все детали

Для создания этого проекта необходимы следующие части:

  • Arduino Uno
  • Сенсорный экран 2,8 дюйма.

Стоимость проекта очень низкая. Это всего 15 долларов.

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

Шаг 2. 2,8-дюймовый цветной сенсорный дисплей для Arduino

Я обнаружил этот сенсорный экран на banggood.com и решил купить его, чтобы попробовать использовать его в некоторых своих проектах. Как видите, дисплей недорогой, он стоит около 11 долларов.

Получите здесь .

Дисплей имеет разрешение 320x240 пикселей и представляет собой экран, который делает соединение с Arduino чрезвычайно простым. Как видите, дисплей использует почти все цифровые и аналоговые контакты Arduino Uno. При использовании этого экрана у нас остается только 2 цифровых вывода и 1 аналоговый вывод для наших проектов. К счастью, дисплей отлично работает и с Arduino Mega, поэтому, когда нам нужно больше контактов, мы можем использовать Arduino Mega вместо Arduino Uno. К сожалению, этот дисплей не работает с платой Arduino Due или Wemos D1 ESP8266. Еще одним преимуществом экрана является то, что он предлагает слот для карты памяти Micro SD, который очень прост в использовании.

Шаг 3. Создание проекта и его тестирование

После подключения экрана к Arduino Uno мы можем загрузить код, и мы готовы играть.

Сначала нажимаем кнопку «Начать игру» и игра запускается. Arduino играет первой. Затем мы можем сыграть свой ход, просто прикоснувшись к экрану. Затем Arduino выполняет свой ход и так далее. Игрок, которому удастся разместить три своих метки в горизонтальном, вертикальном или диагональном ряду, выигрывает игру. Когда игра закончится, появится экран Game Over. Затем мы можем нажать кнопку «Играть снова», чтобы снова начать игру.

Arduino очень хорош в этой игре. Он выиграет большинство игр, или, если вы очень хороший игрок, игра закончится ничьей. Я намеренно разработал этот алгоритм, чтобы допускать некоторые ошибки, чтобы дать игроку-человеку шанс на победу. Добавив еще две строчки в код игры, мы можем сделать так, чтобы Arduino не проиграла игру. Но как процессор Arduino стоимостью 2 доллара может превзойти человеческий мозг? Разработанная нами программа умнее человеческого мозга?

Шаг 4. Алгоритм игры

Чтобы ответить на этот вопрос, давайте посмотрим на реализованный мной алгоритм.

Компьютер всегда играет первым. Одно это решение значительно упрощает победу Arduino. Первый ход всегда угловой. Второй ход для Arduino также является случайным углом из оставшихся, не заботясь о перемещении игрока. С этого момента Arduino сначала проверяет, может ли игрок выиграть следующим ходом, и блокирует этот ход. Если игрок не может выиграть одним ходом, он играет угловой ход, если он доступен, или случайный из оставшихся. Вот и все, этот простой алгоритм может каждый раз побеждать игрока-человека или, в худшем случае, игра закончится ничьей. Это не лучший алгоритм игры в крестики-нолики, но один из самых простых.

Этот алгоритм можно легко реализовать в Arduino, потому что игра Tic-Tac-Toe очень проста, и мы можем легко ее проанализировать и решить. Если мы спроектируем дерево игры, мы сможем обнаружить некоторые выигрышные стратегии и легко реализовать их в коде, или мы можем позволить процессору вычислить дерево игры в реальном времени и самому выбрать лучший ход. Конечно, алгоритм, который мы используем в этой игре, очень прост, потому что игра очень проста. Если мы попытаемся разработать алгоритм победы в шахматах, даже если мы будем использовать самый быстрый компьютер, мы не сможем вычислить дерево игры за тысячу лет! Для подобных игр нам нужен другой подход, нам нужны алгоритмы искусственного интеллекта и, конечно же, огромная вычислительная мощность. Подробнее об этом в следующем видео.

Шаг 5. Код проекта

Взглянем на код проекта. Для компиляции кода нам нужны три библиотеки.

  • Модифицированный TFTLCD Adafruit
  • Adafruit GFX
  • Сенсорный экран

Как видите, даже такая простая игра требует более 600 строк кода. Код сложный, поэтому я не буду пытаться объяснять его в коротком руководстве. Я покажу вам реализацию алгоритма движений Arduino.

Сначала мы проигрываем два случайных угла.

  int firstMoves [] ={0,2,6,8}; // сначала будут использовать эти позиции для (counter =0; counter <4; counter ++) // Подсчитайте первые сыгранные ходы {if (board [firstMoves [counter]]! =0) // Кто-то сделал первый ход {movePlayed ++; }} делать {если (перемещает <=2) {int randomMove =random (4); int c =firstMoves [randomMove]; если (доска [c] ==0) {задержка (1000); доска [c] =2; Serial.print (firstMoves [randomMove]); Serial.println (); drawCpuMove (firstMoves [randomMove]); б =1; }}  

Далее в каждом раунде мы проверяем, сможет ли игрок выиграть следующим ходом.

  

int checkOpponent ()
{if (board [0] ==1 &&board [1] ==1 &&board [2] ==0) return 2; иначе, если (доска [0] ==1 &&доска [1] ==0 &&доска [2] ==1) return 1; иначе, если (доска [1] ==1 &&доска [2] ==1 &&доска [0] ==0) return 0; иначе, если (доска [3] ==1 &&доска [4] ==1 &&доска [5] ==0) return 5; иначе, если (доска [4] ==1 &&доска [5] ==1 &&доска [3] ==0) return 3; иначе, если (доска [3] ==1 &&доска [4] ==0 &&доска [5] ==1) return 4; иначе, если (доска [1] ==0 &&доска [4] ==1 &&доска [7] ==1) return 1; иначе вернуть 100;}

Если да, мы блокируем это движение в большинстве случаев. Мы не блокируем все ходы, чтобы дать игроку-человеку шанс на победу. Вы можете найти, какие ходы не заблокированы? После блокировки хода мы играем в оставшийся угол или случайный ход. Вы можете изучить код и легко реализовать свой собственный непревзойденный алгоритм. Как всегда, вы можете найти код проекта в этом руководстве.

ПРИМЕЧАНИЕ. Поскольку Banggood предлагает один и тот же дисплей с двумя разными драйверами дисплея, если приведенный выше код не работает, измените функцию initDisplay на следующее:

  void initDisplay () {tft.reset (); tft.begin (0x9341); tft.setRotation (3);}  
graphics.c TicTacToeEasy.ino

Шаг 6:Заключительные мысли и улучшения

Как видите, даже с Arduino Uno мы можем создать непревзойденный алгоритм для простых игр. Этот проект великолепен, потому что его легко построить, и в то же время он представляет собой отличное введение в искусственный интеллект и программирование игр. В будущем я постараюсь создать еще несколько продвинутых проектов с искусственным интеллектом, используя более мощный Raspberry Pi, так что следите за обновлениями! Хотелось бы услышать ваше мнение об этом проекте.

Пожалуйста, оставьте свои комментарии ниже и не забудьте лайкнуть руководство, если вы найдете его интересным. Спасибо!

Код

  • Фрагмент кода №1
  • Фрагмент кода №2
Фрагмент кода №1 Обычный текст
 

int firstMoves [] ={0,2,6,8}; // будут использовать эти позиции первыми

for (counter =0; counter <4; counter ++) // Считаем первые ходы, сыгранные {if (board [firstMoves [counter]]! =0) // Первый ход играет кто-то {movePlayed ++; }} делать {если (перемещает <=2) {int randomMove =random (4); int c =firstMoves [randomMove]; если (доска [c] ==0) {задержка (1000); доска [c] =2; Serial.print (firstMoves [randomMove]); Serial.println (); drawCpuMove (firstMoves [randomMove]); б =1; }}

Фрагмент кода 2 Обычный текст
 

int checkOpponent ()
{if (board [0] ==1 &&board [1] ==1 &&board [2] ==0) return 2; иначе, если (доска [0] ==1 &&доска [1] ==0 &&доска [2] ==1) return 1; иначе, если (доска [1] ==1 &&доска [2] ==1 &&доска [0] ==0) return 0; иначе, если (доска [3] ==1 &&доска [4] ==1 &&доска [5] ==0) return 5; иначе, если (доска [4] ==1 &&доска [5] ==1 &&доска [3] ==0) return 3; иначе, если (доска [3] ==1 &&доска [4] ==0 &&доска [5] ==1) return 4; иначе, если (доска [1] ==0 &&доска [4] ==1 &&доска [7] ==1) return 1; иначе вернуть 100;}

Github
https://github.com/adafruit/Adafruit-GFX-Libraryhttps://github.com/adafruit/Adafruit-GFX-Library
Github
https://github.com/adafruit/Touch-Screen-Libraryhttps://github.com/adafruit/Touch-Screen-Library

Производственный процесс

  1. Шахматы
  2. Игра с гироскопом Arduino с MPU-6050
  3. Игра Arduino Pong - OLED-дисплей
  4. Портативное емкостное сенсорное пианино
  5. Игровой контроллер Arduino
  6. Игра Arduino Pong на матрице 24x16 с MAX7219
  7. Игра Arduino Touch Breakout
  8. Игра Giant Animatronics Lego Minfig Operation Game
  9. Игра Pixel Chaser
  10. Автоматизированная игра Дино с использованием arduino