January 24, 2024

Крестики-нолики на 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.

Открываем в sublime text.

Теперь давайте напишем саму логику программы. Значения клеток будут храниться в трёх кортежах (каждый кортеж отрожает одну строку), которые имеют по 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

Программа работает корректно. Давайте попробуем на других данных:

Здесь должен победить нолик. Давайте проверим.

Да, всё правильно. На этом всё. До встречи!