В одном треде тут мной был предложен челлендж - реализовать игру в шашки на выбранном вами языке и парадигме. Я свою часть выполнил, написал шашки на процессинге. Всем желающим предлагается проделать то же самое на своем любимом языке, тем самым продемонстрировав его красоту, изящество, удобство. Обратите внимание, от вас требуется не сделать какую-то более продвинутую версию по функционалу, а максимально близко портировать эти шашки (в идеале, чтобы отличий вообще не было видно)
Подробнее о программе (основные требования): - игра по правилам русских шашек - программа контролирует и обозначает допустимые ходы - движение шашек должно быть анимировано (шашки не должны двигаться скачками) - можно играть вдвоем, можно против ИИ, или ИИ против ИИ - ИИ просто делает случайный допустимый ход - есть редактор, где можно расставить шашки как угодно (для тестирования) - снизить зависимость от тяжелых фреймворков (лучше использовать простые библиотеки для вывода графики и обработки ввода)
Я в данном случае не отстаивал какую-то конкретную парадигму, эта версия пусть будет ориентиром для соревнующихся. Мой код написан по сути на Java, но ООП на всю катушку не используется, хотя классы есть. Весь код в одном файле на 900+ строк.
>>1715234 (OP) Решение на любом популярном языке будет выглядеть примерно так же. Да и у борщехлёбов, в принципе, тоже, но содержимое функций будет вывернуто наизнанку.
>>1715247 Я думаю решения могут получиться разные, потому что я сам размышлял о разных вариантах, пока писал. Но даже если в целом структура будет похожей, то детали тоже интересны.
>>1715234 (OP) Имхо, челлендж некорректен. Во-первых, процессинг это не язык. Во-вторых, язык и парадигма не имеют никакого отношения к графическому интерфейсу. Это всегда работа библиотек. А так как библиотек существует крайне ограниченное число, то и челлендж такой не уместен.
>>1715266 >Во-первых, процессинг это не язык. Процессинг - это упрощенная версия джявы, который компелируется в джаву. Это делает его не языком?
>Во-вторых, язык и парадигма не имеют никакого отношения к графическому интерфейсу Ну так работа с графическим интерфейсом должна быть сведена к минимуму. У меня весь интерфейс рисуется квадратами и кружочками.
>>1715269 Когда дамка бьет, то она не может встать на любую клетку после битой, если на перпендикулярных диагоналях есть еще шашки, которые можно бить. Она обязана встать так, чтобы продолжать бить. Это анализ тех позиций, с которых бить можно повторно.
>>1715272 >>движение шашек должно быть анимировано (шашки не должны двигаться скачками) >>есть редактор, где можно расставить шашки как угодно (для тестирования) >>снизить зависимость от тяжелых фреймворков 1. Условия челленджа заранее подогнаны под твою среду разработки 2. Предъявляются конкретные требования по графике. Это уже никак не "сведена к минимуму"
>>1715283 Моя среда разработки умеет рисовать круги, квадраты, линии, выводить текст. Примитивная обработка ввода и метод draw(), который вызывается 30 раз в секунду. Это много, это где-то очень сложно реализуется? Требование снизить зависимость от сложных фреймворков нужно для того, чтобы изучающему код не было нужды разбираться в этом фреймворке.
>>1715234 (OP) >Битва тележек и парадигм >В одном треде тут мной был предложен челлендж - сложить из ящиков пирамиду с любой выбранной вами тележкой и парадигмой. >Я свою часть выполнил, навозил ящики тачкой. Всем желающим предлагается проделать то же самое на своей любимой тележке, тем самым продемонстрировав её красоту, изящество, удобство. Обратите внимание, от вас требуется не сделать какую-то более продвинутую версию по функционалу, а максимально близко портировать эти ящики (в идеале, чтобы отличий вообще не было видно)
>Я в данном случае не отстаивал какую-то конкретную парадигму, эта версия пусть будет ориентиром для соревнующихся.
>Ну что грузчики, где ваш энтузиазм?!
Ну блядь даже незнаю. Может лучше пивка выпьем, за аниме перетрем? А ящики на работе потаскаем?
Но ты, судя по всему, пишешь какое-то десктопное приложение. Причём по твоему ТЗ ИИ что-то примитивное.
То есть твоя программа не работает по сети и у неё нет интеллекта. Ну и кому это нужно вообще? Под ДОС в прошлом веке писали лучше и красивее. И влезали в 640 килобайт памяти.
Сейчас такое на JS лучше делать. И легко добавить поддержку сети.
>>1715437 >Ну и кому это нужно вообще? Смысл в том, чтобы посмотреть, как одну программу можно реализовать в разных парадигмах. Такой уровень сложности выбран намеренно, реализация не должна затягиваться надолго, но в то же время код не должен быть однострочником.
>>1715456 Это не пет-прожект, это синтетическая бессмысленная задача по забиванию шурупа в доску микроскопом.
Ты предлагаешь сделать GUI, оторванное от реальной задачи, то есть без игры с компьютером и с другим человеком. При этом предлагаешь не пользоваться специальными инструментами для серьёзного GUI.
>>1715498 Ну да, можно там и 3д графоний запилить, и шейдеры написать. Только тут все это не используется. Можно было на чистой яве писать с гуем из стандартной библиотеки, там тоже можно квадраты рисовать. Так что не понимаю предъяв к процессингу.
>>1715712 >Это обычная учебно-тренировочная задача. Чем она хуже очередной реализации алгоритма сортировки? Граф интерфейс отдельная нудная тема. Предлагается кучу усилий потратить на бессмысленную графику. Да и отличий никаких не будет.
На сортировке хотя-бы есть место для демонстрации "языка" и "парадигмы".
Предложил бы лучше ИИ писать к шашкам. Предварительно высрав например шашечный сервер с какимнить жесон интерфейсом.
>>1715847 >>1715901 Графика тут вообще не при чем, она второстепенна. Тренировка в структурировании кода, ведь для этого парадигмы придумывали. Смотреть на сортировку на разных языках не особо интересно, там нечего структурировать. Сам алгоритм может быть сложный, но структурно такая программа примитивна, получает входные данные, обрабатывает их и выдает результат. А 1000 строк это тот объем, который безструктурно уже лучше не писать. Намного больше брать наверно смысла нет, потому что точно никто не возьмется.
Шашечный ИИ тоже не очень тема, потому что специфична. А для моей задачи нужны только базовые навыки программирования.
>>1715923 >А для моей задачи нужны только базовые навыки программирования. Ну и как только с базовыми знаниями что-то там демонстрировать и структурировать? Хватит бредить.
>>1715927 Под базовыми знаниями я имею в виду знание своего языка и его парадигмы. Ии, сети, моделирование физических процессов - это не базовые знания, они изучаются отдельными курсами.
В моем любимом языке (кложа) графику можно реализовывать либо через кложаскрипт (что уже вроде как другой язык все таки, другая среда исполнения, свои библиотеки и тд т тп), либо тащить гуишные либы из жабы, что впизду по очевидным причинам. Короче, челендж говно.
>>1715935 С чего ты взял, что гуй чем-то проще и относится к базовым знаниям? По количеству концепций, которые придётся изучить, гуй сравним с написанием простой нейросети.
> ИИ Простейшая нейронка с нуля пишется в 100 строчек. Если юзать сторонние либы - в 5-10 строчек.
> Сети Импортировал либу с сокетами, написал 5 строчкек - и уже подключился к серверу и отправил ему данные.
> Гуй Нужно изучить пару десятков классов, подход и общую структуру, рекомендуемую конкретной гуёвой либой. В других либах всё учить с нуля. .
>>1715944 Я уже устал повторять, у меня весь гуй это квадраты и круги. Мы их учились еще в школе рисовать на бейсике. Круг рисуется методом ellipse(), квадрат - методом rect(). Так что не надо сравнивать с сетями и ии в сотню строк.
А искуственный интеллект противника тоже писать? Шашки то я могу хоть на джаваскрипте хоть на си с sdl чисто логически реализовать и нарисовать с музыкальными треками в фоне, анимацией и оформлением, но вот интеллект противника я не смогу, небыло такого опыта не представляю даже как это в коде выглядит.
>>1717054 >но вот интеллект противника я не смогу, небыло такого опыта не представляю даже как это в коде выглядит. Там простейший минмакс алгоритм с отсечениями. Я в универе на шарпе лабал эти ебучие шашки. Второй раз лениво до жути.
Это конечно круто, но тут на днях вышел полноценный контр-страйк, который работает прямо в браузере. После такого как-то руки опускаются всякие говношашки писать.
Мне зашла идея, но просто хуярить для хуесосящих все борщехлебов, без пользы для себя не особо хочу. Попробую реализовать на всех либах, фреймворках и платформах, которые хотел поворочать + добавлю пару мокрописек от себя, так что будет не по оповскому тз.
Через пару дней скину вариант на iOS(UIKit + swift).
>>1715234 (OP) >реализовать игру в шашки на выбранном вами языке и парадигме. Годная идея была бы - каждый пишет ИИ на своем языке и эти ИИ потом где-нибудь рубятся, выясняя кто лучше.
>>1731869 Смысл писать шашечный ИИ? Все равно ты сам не придумаешь лучше того, что уже придумано. В чем соревнование то, кто сумеет выбрать самый эффективный метод из известных?
>>1731869 >Годная идея была бы - каждый пишет ИИ на своем языке и эти ИИ потом где-нибудь рубятся Джва года такое хочу, какую-нибудь rts вроде total annihiation было бы вообще топ, а не три в ряд или убогий тетрис
>>1732093 Я просто процитирую void draw() { if (!enabled) return; noStroke(); if (mouseOver()) { fill(200); } else { fill(150); } rect(x, y, w, h, 5); fill(0); textSize(16); textAlign(CENTER, CENTER); text(text, x + w / 2, y + h / 2); }
>>1732105 А конструктор меню, я думаю, вообще из 90-х к нам пожаловал, так вроде в винде MFC было принято int bX = 20; int bW = 180; playWhiteBtn = new Button(bX, 100, bW, "Играть за белых"); playBlackBtn = new Button(bX, 140, bW, "Играть за черных"); twoPersonsBtn = new Button(bX, 180, bW, "Играть вдвоем"); twoBotsBtn = new Button(bX, 220, bW, "Игра ботов"); editorBtn = new Button(bX, 260, bW, "Редактор"); buttons.add(playWhiteBtn); buttons.add(playBlackBtn); buttons.add(twoPersonsBtn); buttons.add(twoBotsBtn); buttons.add(editorBtn); }
>>1732103 >>1732105 >>1732109 Это все код, связанный с кнопками. В тз не сказано, что надо полноценную гуи библиотеку написать. Все реализовано простейшим способом.
>>1732133 Ну даже если так, глаза не режет дублирование кода и императивщина не к месту? Ну вот почему не записать второй фрагмент как whitePlayerT = (playWhiteBtn.mouseOver() || twoPersonsBtn.mouseOver()) ? PlayerT.Person : PlayerT.Bot; blackPlayerT = (playBlackBtn.mouseOver() || twoPersonsBtn.mouseOver()) ? PlayerT.Bot : PlayerT.Person; loadScene(editorBtn.mouseOver() ? editor : game);
А третий - каким нибудь int bY = 100; for (String btnText : {"Играть за белых", "Играть за черных", "Играть вдвоем", "Игра ботов", "Редактор"}) buttons.add(new Button(bX, bY, bW, btnText)); bY += 40;
С другой стороны, если Button все равно new, почему он не сам занимается обработкой кликов?
Пытаюсь написать на крестах в том стиле, каком я хочу, и как же язык упирается, вот просто не дает реализовывать, все время какие-то коряги на пути подставляет. Более-менее моему видениб соответствует то, что получается на шаблонах, но это вводит ограничения - нельзя в рантайме задавать размер поля, количество цветов играющих и т.д.
>>1735606 Пытаться использовать темплейты для чего-то ещё, кроме кодогенерации в компайлтайме - это как с помощью эксепшенов брейкать цикл и возвращать значения из функций.
>>1735614 Тут ты неправ, темплейты в моем случае дают определенные ништяки. Например, у меня есть enum class PieceColor { WHITE, BLACKᴸⁱᵛᵉˢᴹᵃᵗᵗᵉʳ }; Шаблонами можно автоматически определить в компайл тайме количество вариантов в перечислении, не извращаясь как обычно с заведением третьего элемента ENUM_SIZE. Просто написав EnumCounter<PieceColor>::count к сожалению, используя расширение компилятора, и, как я сейчас выяснил, с C++17 там еще и UB, печаль Описание поля, на шаблонах заняло в 2 раза меньше места, как в строчках, так и символах, т.е. сами строчки понятнее и меньше бойлерплейта конструкторов. Еще отдельно пригорело с невозможности писать constexpr virtual до c++20, который у меня на компе пока не завелся. >это как с помощью эксепшенов брейкать цикл и возвращать значения из функций. Ну и тут мы вспоминаем checked/unchecked исключения, а так же всякие рантайм исключения, и понимаем что примерно в 50% случаях в реальном мире это приемлимо. Алсо, если ты захочешь возвращать значения из функций по-современному, через Maybe<T>, std::optional или через туплы std::tie(err, value)=func() поздравляю, это все работает на темплейтах.
>>1735641 Из примера мало что понял, но складывается ощущение, будто тебе хочется, чтобы темплейты брали какие-то внешние данные в райнтайме и что-то догенерировали на лету.
> checked исключения Ничего хорошего. Постоянно в джава-проекте на работе натыкаюсь на то, что их просто оборачивают в рантайм-исключения и кидают дальше, потому что красивая на бумаге идея оказалась полным пиздецом на практике.
> Алсо, если ты захочешь возвращать значения из функций по-современному, через Maybe<T>, std::optional или через туплы std::tie(err, value)=func() поздравляю, это все работает на темплейтах. Ага, это правильно, потому что это и есть непосредственно кодогенерация в компайлтайме.
>>1735651 Речь скорее про то, что во первых в крестах два языка на самом деле больше, и на шаблонах писать логику получается красивее и выразительнее (сами шаблоны при этом могут быть всратыми), но это прибьет настройки программы гвоздями. И во вторых, даже при всем этом многие казалось бы базовые вещи приходится костылить чуть ли не макросами. Пример - количество значений в enum-е. И так во многом. Ну или например хочется написать цикл, в духе for(int i=0, p : pieces; ; i++) но конечно я не могу совместить цикл foreach и обычный с переменной в одно выражение.
>>1735653 Жду, когда в кресты завезут новый препроцессор с возможностью получить текст всего файла в виде байтиков, сгенерировать на их основе любые дргуие байтики и передать компилятору (как source filters в Perl). И языков в крестах будет уже не два, а бесконечно много.
>>1735653 По последнему пункту, нагуглил вот такое, так что хотя бы в теории можно for(auto &&[i, idx]: zip(storedValues, ints(0u))){ Но это ranges v3, а когда я последний раз смотрел ее выхлоп меня смутил оверхед. Хотя может и не такой страшный. Дело в том что я считаю что такая простая игра как шашки должна укладываться примерно в 100 строк логики и в 100 байт.
>>1735660 Видимо, да. Думаю видел в каком то питоньем коде, вот и запомнилось. Вот такой вариант похоже окончательный for (auto&& [index, value] : vector | ranges::views::enumerate) { Почему первый аргумент попадает во второй, а второй в первый, оставим на совести разработчиков библиотеки. Возможно, только так получилось написать пайп оператор.
>>1735656 Ну, это довольно банально. Вот если бы над AST можно было работать, но в плюсах он какой то совсем неподъемный давно. Вот в расте макросы вроде крутые. Но я на него только в полглаза глядел, может выучить?
>>1735663 С одним только AST ничего толком не сделать. Синтаксис сильно не переделаешь, использовать можно только существующие структуры языка. А с фильтрами пиши хоть компилятор из хаскелля в кресты. Правда, синтаксис самих крестов охуеешь парсить. Короче, нужно и то, и то.
В Nim макросы, вроде, тоже навороченные, но он никому не интересен.
>>1736401 Шашка у меня обязана бить, пока есть возможность, через битых не прыгает. А с дамкой сложнее. Она, как я понял, после взятия шашки не может встать куда угодно, а должна проверить, нельзя ли еще кого на перпендикулярных диагоналях бить.
>>1746360 Я сами шашки осилил, но там такая процедурная параша получилась, что не хочется сразу под струю подставляться. Плюс всякие мелочки пока не доделал типа анимаций.
Еще вопрос по UI, если шашка по результату становиться на то же место как вы это обозначаете? У опа по скрину я не особо понял что это, промежуточное состояние хода когда одну шашку побил, а вторую еще нет?
>>1750078 Я и не говорил, что это рокет саенс. Сколько из написавших без образования? И они тупо реализовали алгоритм, или поняли его? Если попросить что-то изменить там, они смогут, или будут смотреть и хлопать глазами? Скажем, всунуть баг в альфа-бету, и попросить пофиксить.