Крестики нолики в эксель как сделать

Добавил пользователь Владимир З.
Обновлено: 10.09.2024

Здравствуйте, в данном уроке я хотел бы продемонстрировать создание простенькой игры на Visual Basic.

Сразу хотелось бы оговориться, что наш вариант игры ориентирован на 2-х игроков, т.е. поддержки так называемого ИИ (искусстевнного интелекта) не будет.

Итак, открываем Excel и запускаем там редактор Visual Basic.

На главную форму UserForm1 поместим 11 элементов TextBox, 4 элемента Label и 1 элемент CommandButton. Первые 9 элементов TextBox - это те ячейки, куда мы будем ставить крестики и нолики, далее еще 2 оставшихся элемента TextBox будут расположены слева (для 1-го игрока) и справа (для 2-го игрока) от основных девяти игровых ячеек TextBox. В эти две ячейки мы будем вписывать имена (ники) 1-го и 2-го игроков соответственно.

Далее, помещаем элемент Label1 над элементом TextBox10 и в графе свойств Caption элемента Label1 вписываем "Игрок 1". Помещаем элемент Label2 над элементом TextBox11 и в графе свойств Caption элемента Label2 вписываем "Игрок 2".

Помещаем элементы Label3 и Label4 под элементами TextBox10 и TextBox11 соответственно. Здесь при выигрыше одного из игроков будет появляться надпись WIN и имя одного из игроков. Допустим, если победил 1-й игрок, а его ник был ВАСЯ, то при выигрыше появится слева надпись "ВАСЯ WIN".

Под этими элементами помещаем еще 4 метки, так, чтобы Label7 была под Label5, а Label8 под Label6. В значение Caption элементов Label5 и Label6 вписываем слово "Победы:" - ниже будут прибавляться сами победы. Т.е. если победил 1-й игрок, то при нажатии на кнопку "Новая игра", в эл-те Label7 появится единичка, означающая, что у игрока 1 одна победа, если он бобедил еще раз, то будет уже 2 и т.д.

Элемент CommandButton1 - это кнопка. Она нужна нам для того, чтобы обнулить все результаты и начать новую игру. В графе Caption элемента CommandButton1 впишите "Новая игра".

Итак, теперь приступим непосредственно к написанию самого кода игры. Дважды щелкнем на элементе CommandButton1 и пропишем следующий код:

If Label3.Caption = TextBox10.Text + " WIN" Then

Label7.Caption = Label7.Caption + 1

If Label4.Caption = TextBox11.Text + " WIN" Then

Label8.Caption = Label8.Caption + 1

End If
TextBox1.Text = ""

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


Теперь, разберемся с основными ячейками, куда будем ставить "крестик" и "нолик". Крестик у нас будет заменять английская буква "x", а нолик - "o". Всего у нас восемь вариантов победы - это 3 варианта сверху-вниз, 3 варианта слева-направо и 2 варианта наискосок. Крестики - это всегда 1-й игрок, нолики - всегда 2-й.

Щелкаем дважды на элементе TextBox1 и вписываем туда следующий код-условие:

If TextBox1.Text = "x" And TextBox2.Text = "x" And TextBox3.Text = "x" Then

Label3.Caption = TextBox10.Text + " WIN"

Этот код означает, что если три крестика есть в элементах 1-2-3, то в элементе Label3 появится надпись ИМЯ + "WIN". Если условие, задействующие первые 3 элемента вписано в элемент TextBox1, то это же условие должно быть вписано и в элемент TextBox2 и в элемент TextBox3. И так же со всеми остальными элементами.

Теперь пропишем сразу несколько условий, в которых у нас будет задействован элемент TextBox1, т.е. ячейка 1 (сразу для крестиков и ноликов). Вместе с предыдущим кодом все это будет выглядеть так:

If TextBox1.Text = "x" And TextBox2.Text = "x" And TextBox3.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox1.Text = "x" And TextBox4.Text = "x" And TextBox7.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox1.Text = "x" And TextBox5.Text = "x" And TextBox9.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If

If TextBox1.Text = "o" And TextBox2.Text = "o" And TextBox3.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox1.Text = "o" And TextBox4.Text = "o" And TextBox7.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox1.Text = "o" And TextBox5.Text = "o" And TextBox9.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If

Теперь прописываем код-условие для других ячеек. Элемент TextBox2:

If TextBox1.Text = "x" And TextBox2.Text = "x" And TextBox3.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox2.Text = "x" And TextBox5.Text = "x" And TextBox8.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If

If TextBox1.Text = "o" And TextBox2.Text = "o" And TextBox3.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox2.Text = "o" And TextBox5.Text = "o" And TextBox8.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If

Элемент TextBox3:

If TextBox1.Text = "x" And TextBox2.Text = "x" And TextBox3.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox3.Text = "x" And TextBox6.Text = "x" And TextBox9.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox3.Text = "x" And TextBox5.Text = "x" And TextBox7.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If

If TextBox1.Text = "o" And TextBox2.Text = "o" And TextBox3.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox3.Text = "o" And TextBox6.Text = "o" And TextBox9.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox3.Text = "o" And TextBox5.Text = "o" And TextBox7.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If

Элемент TextBox4:

If TextBox1.Text = "x" And TextBox4.Text = "x" And TextBox7.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox4.Text = "x" And TextBox5.Text = "x" And TextBox6.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If

If TextBox1.Text = "o" And TextBox4.Text = "o" And TextBox7.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox4.Text = "o" And TextBox5.Text = "o" And TextBox6.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If

Элемент TextBox5:

If TextBox1.Text = "x" And TextBox5.Text = "x" And TextBox9.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox4.Text = "x" And TextBox5.Text = "x" And TextBox6.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox2.Text = "x" And TextBox5.Text = "x" And TextBox8.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox3.Text = "x" And TextBox5.Text = "x" And TextBox7.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If

If TextBox1.Text = "o" And TextBox5.Text = "o" And TextBox9.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox4.Text = "o" And TextBox5.Text = "o" And TextBox6.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox2.Text = "o" And TextBox5.Text = "o" And TextBox8.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox3.Text = "o" And TextBox5.Text = "o" And TextBox7.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If

Элемент TextBox6:

If TextBox4.Text = "x" And TextBox5.Text = "x" And TextBox6.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox3.Text = "x" And TextBox6.Text = "x" And TextBox9.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If

If TextBox4.Text = "o" And TextBox5.Text = "o" And TextBox6.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox3.Text = "o" And TextBox6.Text = "o" And TextBox9.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If

Элемент TextBox7:

If TextBox1.Text = "x" And TextBox4.Text = "x" And TextBox7.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox7.Text = "x" And TextBox8.Text = "x" And TextBox9.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox3.Text = "x" And TextBox5.Text = "x" And TextBox7.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If

If TextBox1.Text = "o" And TextBox4.Text = "o" And TextBox7.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox7.Text = "o" And TextBox8.Text = "o" And TextBox9.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox3.Text = "o" And TextBox5.Text = "o" And TextBox7.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If

Элемент TextBox8:

If TextBox7.Text = "x" And TextBox8.Text = "x" And TextBox9.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox2.Text = "x" And TextBox5.Text = "x" And TextBox8.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If

If TextBox7.Text = "o" And TextBox8.Text = "o" And TextBox9.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox2.Text = "o" And TextBox5.Text = "o" And TextBox8.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If

Элемент TextBox9:

If TextBox1.Text = "x" And TextBox5.Text = "x" And TextBox9.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox7.Text = "x" And TextBox8.Text = "x" And TextBox9.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox3.Text = "x" And TextBox6.Text = "x" And TextBox9.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If

If TextBox1.Text = "o" And TextBox5.Text = "o" And TextBox9.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox7.Text = "o" And TextBox8.Text = "o" And TextBox9.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox3.Text = "o" And TextBox6.Text = "o" And TextBox9.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If



Ну вот впринципе и всё. Проверьте как все работает. При 3-х крестиках надпись должна появляться слева, а при 3-х ноликах - справа.

Вставляйте галочки и крестики в ячейки с помощью символа быстрого доступа

1. Выделите ячейки столбца, в которые вы хотите вставить галочку и крестик, а затем выберите Webdings шрифт под Главная вкладку, см. снимок экрана:



Вставьте галочки и крестики в ячейки с кодом VBA

Вот еще один быстрый и простой способ поставить галочки и крестики одним щелчком мыши.

1. Щелкните правой кнопкой мыши вкладку листа, в которую вы хотите вставить галочки и крестики, а затем выберите Просмотреть код из контекстного меню в открывшемся Microsoft Visual Basic для приложений окна, скопируйте и вставьте следующий код в пустой модуль:

Код VBA: вставьте галочки и крестики в ячейки:


Внимание: В приведенном выше коде B2: B12 - это ячейки, в которые вы хотите вставить галочку и крестик, вы можете изменить ссылку на ячейку по своему усмотрению.

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


Авто Текст особенность Kutools for Excel может помочь вам сохранить определенные символы, формулы, данные или другие элементы в области автотекста, а затем вы сможете повторно использовать их в любом месте нужного файла Excel.


Kutools for Excel: с более чем 300 удобными надстройками Excel, которые можно попробовать бесплатно без ограничений в течение 30 дней. Загрузите и бесплатную пробную версию прямо сейчас!

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


Эта статья про процесс разработки ИИ на javascript для игры в одну из таких вариаций крестиков-ноликов: получилось довольно много материала, но я разбавил его анимацией и картинками. В любом случае, хотя бы стоит попробовать поиграть в это.
Отличия этого варианта игры от оригинала в следующем:

  1. Поле может быть сколь угодно большим (На сколько хватит тетради)
  2. Побеждает тот, кто поставит 5 фигур (если их можно так назвать) в ряд.

Перед тем, как начнем

Вынужден извиниться заранее за объем статьи и местами не совсем доходчивое изложение мысли, однако у меня не получилось сжать стаю без потери в содержании и качестве.
Рекомендую сначала ознакомиться с результатом. Код

Горячие клавиши и команды:

  • D – ИИ сделает ход за вас
  • T – посмотреть вес клетки
  • Напишите в консоли SHOW_WEIGHTS = true, чтобы просматривать веса всех анализируемых клеток.

Начнем

Начать нужно с реализации самой игры, т.е. написать приложение для двух игроков, пока без бота. Для своих целей я решил использовать javascript + jquery + bootstrap4, хотя он там практически не используется, но его лучше оставить – или таблица поплывет. Тут рассказывать особо нечего, материала по js, jquery и bootstrap на хабре полно. Скажу лишь, что использовал MVC. Да и вообще, объяснять абсолютно весь код я не буду – материала и без того получилось много.

Итак, игровое поле было готово. Можно устанавливать фигуры в клетки. Но победа кого-либо из игроков никак не фиксировалась.

Это тупой способ, но он работал. Однако, его можно было значительно улучшить, что я и сделал: Большая часть клеток будет оставаться пустой на протяжении всей игры – игровое поле слишком большое, чтоб его можно было заполнить целиком. Поскольку сканировать его нужно было каждый ход, а за один ход ставится только одна фигура — то можно сосредоточиться только на этой фигуре (клетке): просканировать только одну горизонталь, вертикаль и две диагонали клетки, которым принадлежит та самая клетка.

Плюс ко всему, не нужно сканировать все клетки линий. Поскольку конец игры – это 5 фигур в ряд, то фигуры, удаленные друг от друга на 6 клеток нас не интересуют. Достаточно сканировать по пять клеток в каждую из сторон. Не понятно? Смотри анимацию ниже.

Приступим к самому боту

Итак, мы уже написали страницу с крестиками-ноликами. Переходим к основной задаче – ИИ.
Нельзя просто так взять и написать код, если ты не знаешь как: нужно продумать логику бота.

Суть заключается в анализе игрового поля, хотя бы его части, и просчета цены (веса) каждой клетки на поле. Клетка с наибольшим весом – самая перспективная – туда бот и поставит фигуру. Основная сложность именно в просчете веса одной клетки.

Терминология

Крестики и нолики – это фигуры.
Атакой будем называть несколько одинаковых фигур, стоящих рядом, на одной линии. По сути, это множество. Количество фигур в атаке – её мощность. Одна отдельная фигура – тоже атака (мощностью 1).



Рис 1. Атака [4:1]

В ходе анализа мы будем оценивать все клетки, которые входят в определенную область. У каждой клетки будет просчитываться её вес. Он вычисляется на основе весов всех атак, на которые влияет данная клетка.

Суть анализа

Представим, что на игровом поле уже есть несколько атак одного и второго игрока. Кто-то из игроков делает ход (пускай крестики). Естественно ход он делает в пустую клетку – и тем самым он может:

  1. Развить свою атаку, а может быть и не одну, увеличив ее мощность. Может начать новую атаку и т.д.
  2. Препятствовать развитию атаки противника или и вовсе заблокировать ее.

Суть анализа в следующем:

  1. Бот подставляет в проверяемую клетку фигуры: сначала крестик, потом нолик.
  2. Далее он ищет все атаки, которые были получены такими ходами и суммирует их веса.
  3. Полученная сумма – это вес клетки.
  4. Подобный алгоритм выполняется для всех клеток игрового поля.


По сути, таким алгоритмом мы проверяем, что будет, если мы пойдем так… а что будет если так пойдет оппонент. Мы смотрим на один ход вперед и выбираем наиболее подходящую клетку – с наибольшим весом.

Если какая-то клетка имеет больший вес, нежели другая, значит она приводит к созданию более опасных атак, либо к блокировке сильных атак противника. Все логично… мне кажется.
Если зайти на страницу и написать в консоли SHOW_WEIGHTS = true, можно визуально прочувствовать работу алгоритма (Будут показаны веса клеток).

Веса атак

Пораскинул я мозгами и привел такое соответствие атак и весов:


Подобрано эмпирически – возможно это не оптимальный вариант.

Я добавил в массив атаки мощностью 5 с запредельно большим весом. Объяснить это можно тем, что бот анализирует игру, смотря на шаг вперед (подставляя фигуру в клетку). Пропуск такой атаки есть ни что иное, как поражение. Ну или победа… смотря для кого.

Атаки с большим потенциалом ценятся выше.

Атака [4:2] в большинстве случаев решает исход игры. Если игроку удалось создать такую атаку, то оппонент уже не сможет ее заблокировать. Однако это еще не победа. Противник может быстрее завершить игру, даже при наличие у нас на поле атаки [4:2], поэтому ее вес ниже, чем у атак мощностью 5. Смотри пример ниже.



Рис 2. Атака [4:2]

Рассмотрим такую ситуацию: при подстановке фигуры на удалении нескольких пустых клеток, но не более 5-и, расположена еще одна.

Специально для таких случаев, для каждой атаки будем просчитывать делитель. Изначально его значение равно 1.

Алгоритм поиска атак

Во-первых, создадим класс атаки. У атаки будет 3 атрибута, о которых я писал ранее:


И один метод, который будет возвращать вес данной атаки:


Далее. Поиск всех атак для одной клетки мы разделим на:

  1. Поиск на горизонтали
  2. Поиск на вертикали
  3. Поиск на диагонали 45 градусов
  4. Поиск на диагонали 135 градусов

Однако, нам не нужно проверять всю линию целиком. Максимальная мощность атаки, которая нас интересует – 5. Безусловно, создать атаку мощностью, скажем, 6 – возможно. Но для ИИ, который анализирует игровую ситуацию следующего хода, все равно, что 6, что 5. Перспектива получить одну из этих атак говорит о конце игры на следующем ходу. Соответственно, вес анализируемой клетки будет в обоих случаях будет одинаковым.


Здесь надо остановиться, так как может возникнуть вопрос: зачем проверять 6-ую клетку, если максимальная мощность атаки – 5. Ответ – это нужно для определения потенциала удаленной от центра атаки.



Рис. 3. Сканирование 6-ых клеток. Если не просканировать 6-ую клетку, можно неправильно определить потенциал атаки.


Для завершения некоторых атак может просто не хватать места. Посчитав attackplace мы заранее можем понять, какие из атак бесперспективны.



Рис. 4. Место для атаки

1) Начнем с центральной клетки. Она должна быть пустой (мы ведь собираемся сделать в нее ход, не так ли? Однако мы не забываем, что наш ИИ должен подставлять фигуры в данную клетку для анализа следующего хода. Фигура, которую мы подставляем – this.subfig – по умолчанию крестик. Поскольку центральная клетка изначально будет содержать в себе какую-либо фигуру после подстановки, то она будет принадлежать какой-то атаке this.curAttack:

  • ее мощность будет не меньше 1 (фигура в центральной клетке)
  • делитель – 1, т.к. речь идет о центральной атаке ( ей принадлежит сканируемая клетка);
  • потенциал пока неизвестен – по умолчанию 0;

Все эти пункты мы отобразили в значениях конструктора по умолчанию – смотри код выше.

2) Далее, уменьшая итератор, перебираем 5 клеток с одной стороны от сканируемой. За это отвечает функция getAttacks( cellX, cellY, subFig, dx, dy ), где:

cellX, cellY – координаты проверяемой клетки
subFig – фигура, которую мы подставляем в проверяемую клетку
dx, dy – изменения координат x и y в циклах – так мы задаем направление поиска:

  • Горизонталь ( dx = 1, dy = 0 )
  • Вертикаль ( dx = 0, dy = 1 )
  • Диагональ 45 ( dx = 1, dy = -1 )
  • Диагональ 135 ( dx = 1, dy = 1 )


Обратите внимание, что если checkCell() что-то вернет, то выполнение цикла прекращается.

3) Проверяем фигуры данных клеток.
За это отвечает функция checkCell( x, y ):

Для начала запишем фигуру в переменную fig:
Model.Field – наше игровое поле.


fig может быть ‘x’, ‘o’, ‘b’ (граница), 0 (пустая клетка).

    Если такая фигура совпадает с фигурой центральной клетки (this.subFig), тогда продолжаем алгоритм – значит мы продолжаем сканировать атаку, все замечательно, продолжаем в том же духе. Лишняя фигура в атаке – плюс к ее мощности(this.curAttack.capability) и месту (this.attackplace).


Функция checkCell – готова. Однако продолжаем работать над классом checkLine.


6) Далее идем в другую сторону от текущей клетки, увеличивая итератор.
Абсолютно такая же проверка фигур. (Код уже написан – функция getAttacks)

7) Все, мы собрали все атаки, что были на линии в один массив.
На этом с классом checkLine всё… закончили.

Ну а дальше все просто – создаем объект checkLine для каждой из линий (2 диагонали, горизонталь и вертикаль) и вызываем функцию getAttacks. То есть, для каждой линии — свой объект checkLine и, соответственно, свой набор атак.

Пусть за все это отвечает функция getAllAttacks() – уже отдельно от описанных выше классов;


На выходе имеем объект со всеми атаками для проверяемой клетки

  • С нулевой мощностью (мало ли такие попадут в массив)
  • Атаки, которым не хватает места (attackplace = 4, то это брейкпоинт
    На самом деле брейкпоинты можно было просто перечислить, их не так много, но это я понял далеко не сразу.

Да соберем, наконец, все воедино

Итак, основной ад позади — описан выше. Пора слепить из него что-то рабочее. Функция countWeight( x, y ) — принимает на вход координаты клетки, а возвращает ее вес. Что же у нее под капотом?

Во-первых, получим массив всех атак, которым клетка принадлежит. ( getAllAttacks( x, y ) ). Перебирая все линии, мы считаем количество брейкпоинтов. Если 2 брейкпоинта – вспоминаем, что такая ситуация может решить исход игры, и увеличиваем вес клетки на 100.
Однако все брейкпоинты должны принадлежать одному игроку, поэтому пришлось реализовать проверку в 2 шага: сначала крестики, потом нолики.

Поскольку в массиве весов атак ( ATTACK_WEIGHTS[] ) я не предусмотрел атаки мощностью 6 и больше, мне пришлось заменить их на атаки мощностью 5. Разницы никакой – все они приводят к концу игры.

Ну и суммируем веса атак – к этому все и шло.


Теперь при вызове этой функции для конкретной клетки мы получим ее вес. Проводим эту операцию для всех клеток и выбираем наилучшую (с наибольшим весом). Туда и ходим)

Остальной код вы сможете найти на github. Материала уже предостаточно, и его изложение, как я не пытался, оставляет желать лучшего. Но если ты смог дочитать до этого момента, дорогой читатель, то я тебе благодарен.

Мое мнение о полученном результате

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

Знаю, что можно проще, но не знаю как. Хотелось бы выслушать людей знающих или посмотреть на иные реализации такого бота.

Знаю, что можно лучше. Да… можно воспользоваться известными алгоритмами, вроде минимакса, но для этого нужно обладать некоторой базой знаний в области теории игр, чем похвастать увы не могу.

В будущем планирую добавить анализ брейкпоитов на несколько шагов вперед, что сделает бота еще более серьезным соперником. Однако сейчас не имею четкого представления о реализации сего; лишь имею предстоящую сессию и недописанный диплом – что меня огорчает.

Здравствуйте, в данном уроке я хотел бы продемонстрировать создание простенькой игры на Visual Basic.

Сразу хотелось бы оговориться, что наш вариант игры ориентирован на 2-х игроков, т.е. поддержки так называемого ИИ (искусстевнного интелекта) не будет.

Итак, открываем Excel и запускаем там редактор Visual Basic.

На главную форму UserForm1 поместим 11 элементов TextBox, 4 элемента Label и 1 элемент CommandButton. Первые 9 элементов TextBox - это те ячейки, куда мы будем ставить крестики и нолики, далее еще 2 оставшихся элемента TextBox будут расположены слева (для 1-го игрока) и справа (для 2-го игрока) от основных девяти игровых ячеек TextBox. В эти две ячейки мы будем вписывать имена (ники) 1-го и 2-го игроков соответственно.

Далее, помещаем элемент Label1 над элементом TextBox10 и в графе свойств Caption элемента Label1 вписываем "Игрок 1". Помещаем элемент Label2 над элементом TextBox11 и в графе свойств Caption элемента Label2 вписываем "Игрок 2".

Помещаем элементы Label3 и Label4 под элементами TextBox10 и TextBox11 соответственно. Здесь при выигрыше одного из игроков будет появляться надпись WIN и имя одного из игроков. Допустим, если победил 1-й игрок, а его ник был ВАСЯ, то при выигрыше появится слева надпись "ВАСЯ WIN".

Под этими элементами помещаем еще 4 метки, так, чтобы Label7 была под Label5, а Label8 под Label6. В значение Caption элементов Label5 и Label6 вписываем слово "Победы:" - ниже будут прибавляться сами победы. Т.е. если победил 1-й игрок, то при нажатии на кнопку "Новая игра", в эл-те Label7 появится единичка, означающая, что у игрока 1 одна победа, если он бобедил еще раз, то будет уже 2 и т.д.

Элемент CommandButton1 - это кнопка. Она нужна нам для того, чтобы обнулить все результаты и начать новую игру. В графе Caption элемента CommandButton1 впишите "Новая игра".

Итак, теперь приступим непосредственно к написанию самого кода игры. Дважды щелкнем на элементе CommandButton1 и пропишем следующий код:

If Label3.Caption = TextBox10.Text + " WIN" Then

Label7.Caption = Label7.Caption + 1

If Label4.Caption = TextBox11.Text + " WIN" Then

Label8.Caption = Label8.Caption + 1

End If
TextBox1.Text = ""

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


Теперь, разберемся с основными ячейками, куда будем ставить "крестик" и "нолик". Крестик у нас будет заменять английская буква "x", а нолик - "o". Всего у нас восемь вариантов победы - это 3 варианта сверху-вниз, 3 варианта слева-направо и 2 варианта наискосок. Крестики - это всегда 1-й игрок, нолики - всегда 2-й.

Щелкаем дважды на элементе TextBox1 и вписываем туда следующий код-условие:

If TextBox1.Text = "x" And TextBox2.Text = "x" And TextBox3.Text = "x" Then

Label3.Caption = TextBox10.Text + " WIN"

Этот код означает, что если три крестика есть в элементах 1-2-3, то в элементе Label3 появится надпись ИМЯ + "WIN". Если условие, задействующие первые 3 элемента вписано в элемент TextBox1, то это же условие должно быть вписано и в элемент TextBox2 и в элемент TextBox3. И так же со всеми остальными элементами.

Теперь пропишем сразу несколько условий, в которых у нас будет задействован элемент TextBox1, т.е. ячейка 1 (сразу для крестиков и ноликов). Вместе с предыдущим кодом все это будет выглядеть так:

If TextBox1.Text = "x" And TextBox2.Text = "x" And TextBox3.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox1.Text = "x" And TextBox4.Text = "x" And TextBox7.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox1.Text = "x" And TextBox5.Text = "x" And TextBox9.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If

If TextBox1.Text = "o" And TextBox2.Text = "o" And TextBox3.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox1.Text = "o" And TextBox4.Text = "o" And TextBox7.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox1.Text = "o" And TextBox5.Text = "o" And TextBox9.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If

Теперь прописываем код-условие для других ячеек. Элемент TextBox2:

If TextBox1.Text = "x" And TextBox2.Text = "x" And TextBox3.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox2.Text = "x" And TextBox5.Text = "x" And TextBox8.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If

If TextBox1.Text = "o" And TextBox2.Text = "o" And TextBox3.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox2.Text = "o" And TextBox5.Text = "o" And TextBox8.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If

Элемент TextBox3:

If TextBox1.Text = "x" And TextBox2.Text = "x" And TextBox3.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox3.Text = "x" And TextBox6.Text = "x" And TextBox9.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox3.Text = "x" And TextBox5.Text = "x" And TextBox7.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If

If TextBox1.Text = "o" And TextBox2.Text = "o" And TextBox3.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox3.Text = "o" And TextBox6.Text = "o" And TextBox9.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox3.Text = "o" And TextBox5.Text = "o" And TextBox7.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If

Элемент TextBox4:

If TextBox1.Text = "x" And TextBox4.Text = "x" And TextBox7.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox4.Text = "x" And TextBox5.Text = "x" And TextBox6.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If

If TextBox1.Text = "o" And TextBox4.Text = "o" And TextBox7.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox4.Text = "o" And TextBox5.Text = "o" And TextBox6.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If

Элемент TextBox5:

If TextBox1.Text = "x" And TextBox5.Text = "x" And TextBox9.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox4.Text = "x" And TextBox5.Text = "x" And TextBox6.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox2.Text = "x" And TextBox5.Text = "x" And TextBox8.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox3.Text = "x" And TextBox5.Text = "x" And TextBox7.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If

If TextBox1.Text = "o" And TextBox5.Text = "o" And TextBox9.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox4.Text = "o" And TextBox5.Text = "o" And TextBox6.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox2.Text = "o" And TextBox5.Text = "o" And TextBox8.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox3.Text = "o" And TextBox5.Text = "o" And TextBox7.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If

Элемент TextBox6:

If TextBox4.Text = "x" And TextBox5.Text = "x" And TextBox6.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox3.Text = "x" And TextBox6.Text = "x" And TextBox9.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If

If TextBox4.Text = "o" And TextBox5.Text = "o" And TextBox6.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox3.Text = "o" And TextBox6.Text = "o" And TextBox9.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If

Элемент TextBox7:

If TextBox1.Text = "x" And TextBox4.Text = "x" And TextBox7.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox7.Text = "x" And TextBox8.Text = "x" And TextBox9.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox3.Text = "x" And TextBox5.Text = "x" And TextBox7.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If

If TextBox1.Text = "o" And TextBox4.Text = "o" And TextBox7.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox7.Text = "o" And TextBox8.Text = "o" And TextBox9.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox3.Text = "o" And TextBox5.Text = "o" And TextBox7.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If

Элемент TextBox8:

If TextBox7.Text = "x" And TextBox8.Text = "x" And TextBox9.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox2.Text = "x" And TextBox5.Text = "x" And TextBox8.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If

If TextBox7.Text = "o" And TextBox8.Text = "o" And TextBox9.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox2.Text = "o" And TextBox5.Text = "o" And TextBox8.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If

Элемент TextBox9:

If TextBox1.Text = "x" And TextBox5.Text = "x" And TextBox9.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox7.Text = "x" And TextBox8.Text = "x" And TextBox9.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If
If TextBox3.Text = "x" And TextBox6.Text = "x" And TextBox9.Text = "x" Then
Label3.Caption = TextBox10.Text + " WIN"
End If

If TextBox1.Text = "o" And TextBox5.Text = "o" And TextBox9.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox7.Text = "o" And TextBox8.Text = "o" And TextBox9.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If
If TextBox3.Text = "o" And TextBox6.Text = "o" And TextBox9.Text = "o" Then
Label4.Caption = TextBox11.Text + " WIN"
End If



Ну вот впринципе и всё. Проверьте как все работает. При 3-х крестиках надпись должна появляться слева, а при 3-х ноликах - справа.

Читайте также: