Крестики-нолики на Leo
Привет! Сегодня мы напишем логику программы крестики-нолики на языке программирования Leo. Напоминаю, что Leo - это язык программирования от проекта Aleo, созданный на основе Rust. С помощью него можно взаимодействовать с блокчейном Aleo и писать полностью приватные и децентрализованные приложения.
Сразу хочу отметить, что мы не будем писать графический интерфейс. Функции Leo сейчас достаточно ограничены. Мы можем интегрировать в нашу работу Python и JS, но эта возможность пока еще дорабатывается командой Aleo. Подробнее вы можете прочитать про интенрацию Python в данной статье:
https://developer.aleo.org/sdk/python/zkml-transpiler
Создание проекта
Для начала открываем Git Bash и вводим
leo new krest
Таким образом мы создадим проект под названием krest.
Теперь нам нужно перейти в эту папку. Для этого пишем:
cd krest
Давайте перейдем в папку с программой и откроем файл main.leo из папки src в sublime test.
Теперь давайте напишем саму логику программы. Значения клеток будут храниться в трёх кортежах (каждый кортеж отрожает одну строку), которые имеют по 3 значения. Они будут иметь значение 0 (нолики) и 1 (крестики). Наша задача определить победителя. Значения в кортеже будут иметь тип u8.
Теперь давайте зададим значения в кортежах будто бы прошла игра:
При данной ситуации мы должны получить результат, что победил игрок, который играл крестиком.
Давайте создадим переменную result, которая будет хранить в себе значение победителя и при ничьей и по умолчанию будет иметь значение 2.
let result: u8 = 2u8;
Теперь нам нужно прописать определение этого. Для этого мы должны сравнивать значения в кортеже. Всего есть 8 вариантов победы того или иного игрока: 3 по горизонтали, 3 по вертикали и 2 по диагонали. Нам нужно просто их перебрать. У нас могут быть несколько различных условий. Или сумма какой-то из комбинации должна быть равна 0 (тогда победил нолик) или должна быть равна 3 (тогда победил крестик).
P.S. Также можно не складывать, а сравнивать, если все 3 клетки равны друг другу, значит, игрок победил.
Я выбирал первый вариант для реализации.
if l1.0 + l1.1 + l1.2 == 0u8 || l2.0 + l2.1 + l2.2 == 0u8 || l3.0 + l3.1 + l3.2 == 0u8 || l1.0 + l2.0 + l3.0 == 0u8 || l1.1 + l2.1 + l3.1 == 0u8 || l1.2 + l2.2 + l3.2 == 0u8 || l1.0 + l2.1 + l3.2 == 0u8 || l1.2 + l2.1 + l3.0 == 0u8 { result = 0u8; }
Если что-то из этого верно, то победил нолик и мы присваиваем переменной result значение 0.
Теперь нам нужно прописать такое же условие для крестика.
if l1.0 + l1.1 + l1.2 == 3u8 || l2.0 + l2.1 + l2.2 == 3u8 || l3.0 + l3.1 + l3.2 == 3u8 || l1.0 + l2.0 + l3.0 == 3u8 || l1.1 + l2.1 + l3.1 == 3u8 || l1.2 + l2.2 + l3.2 == 3u8 || l1.0 + l2.1 + l3.2 == 3u8 || l1.2 + l2.1 + l3.0 == 3u8 { result = 1u8; }
Осталось вернуть значение переменной result:
return result;
Теперь давайте запустим нашу программу. Мы должны получить значение 1, то есть крестик победил.
Для запуска программы в командной строке вводим
leo run main
Программа работает корректно. Давайте попробуем на других данных:
Здесь должен победить нолик. Давайте проверим.