Войти
ПроектыФорумОцените

"Крестики нолики" + ИИ + [Собираю команду на шахматы] (2 стр)

Advanced: Тема повышенной сложности или важная.

Страницы: 1 2 3 Следующая »
#15
(Правка: 14:28) 14:15, 14 июня 2019

Давайте поговорим про функцию оценки для крестиков ... в случае минимакса

(вначале ликбез)
Вариант 1. Суммируются все победы (или любая линейная функция от этого) - очевидно получаем ситуации, когда ИИ в этом случае не видит, что он может проиграть ..

Пример.

В ситуации
X-O
-XX
—O

ходят нолики оценка будет неправильная (для ноликов оценка минимум, для крестиков максимум)

* - 3 - *
2 - * - *
3 - 1 - *

почему ? потому что оценка не учитывает скорость достижения победы, а только их количество (вероятность)

как исправить ситуацию ... ?

а впрочем давайте послушаем тех кто это делал? а потом я дам свой вариант

в исправленном, моем варианте, оценка будет другая

* - 8 - *
2 - * - *
7 - 5 - *

(те кто будет рассказывать прошу так же на этом примере, и показать что именно дает оценочная функция для этого состояния)

cArmius
дайте скачать вашу реализацию крестиков?

#16
0:21, 15 июня 2019

Aslan
> Смотрите AI.pas (интерфейс ИИ), DLL-ка должна лежать в папке Bot
Ммм, как всё серьезно)
Может тогда стоит конкурс запилить?)

#17
(Правка: 4:59) 4:56, 15 июня 2019

ancooper
> Ммм, как всё серьезно)
Вот весь AI.pas:

// DLL должна экспортировать функцию
// function CreateAI(width,height:integer) : TAI;stdcall;

unit ai;

{$mode objfpc}{$H+}

interface

type
  // Абстрактный базовый класс, от которого порождаешь свою реализацию АИ
  TAI=class
    constructor Create(width,height:integer);virtual; abstract;
    procedure Play(var x,y:integer);virtual; abstract;
  end;

implementation

end.
Это как раз таки не серьезно.
1. Это не интерфейс, а абстрактный класс. Оно даже на уровне разных версий FPC компиятора не может гарантировать совместимость. Я уже молчу про Delphi и тем более другие языки программирования.
2. DLL-ка с одной единственной экспортируемой функцией: CreateAI. Что за функция, с какими параметрами, какой колл конвеншн - поди еще угадай. Подозреваю что что-то в духе:
function CreateAI(width, height: Integer): TAI; fastcall;
3. А как будет освобождаться этот самый TAI? Где DestroyAI? Или хай течет?
4. А как в TAI передается состояние поля? Как передается куда походил враг, кто ходит первым? У TAI одна единственная функция Play которая что? Должна вернуть ход я полагаю?

Короче это какой-то огрызок а не API.

upd. Нашел:
> На первом ходу внутрь передаются -1,-1
> DLL получает ход соперника в var x,y, туда же помещает свой ход
Кучеряво вывернуться чтобы не делать 2 метода?

#18
5:05, 15 июня 2019

А всего то надо было сделать, чтобы dll экспортировала 4 метода:

function AICreate(width, height: Integer): Pointer; stdcall;
function AIOpponentsTurn(handle: Pointer; x, y: Integer); stdcall;
function AIMakeTurn(handle: Pointer; out x, y: Integer); stdcall;
function AIDestroy(handle: Pointer); stdcall;
Без всяких классов с наследованиями. Просто как это всегда делают в случае с dll.

#19
(Правка: 23:20) 23:18, 15 июня 2019

MrShoor
> А всего то надо было сделать, чтобы dll экспортировала 4 метода:

Запилил шаблончик для проверки работоспособности на C#
Ссылка на гдиск
Ходит в случайную пустую клетку.

#20
(Правка: 4:14) 4:06, 17 июня 2019

MrShoor
> Оно даже на уровне разных версий FPC компиятора не может гарантировать совместимость
Кто тебе сказал такое? Абстрактный класс = один указатель на VMT и все, что может быть более совместимое
> Я уже молчу про Delphi
Что не так?
> и тем более другие языки программирования
Тебя никакие языки не устраивают?

>2. DLL-ка с одной единственной экспортируемой функцией: >CreateAI
function CreateAI(width,height:integer) : TAI;stdcall;

> 3. А как будет освобождаться этот самый TAI? Где DestroyAI? >Или хай течет?
Да, так и оставил

>4. А как в TAI передается состояние поля?
> Как передается куда походил враг, кто ходит первым?
procedure Play(var x,y:integer);virtual; abstract;
Поле ненужно, передается прошлый ход соперника, на первый ход -1,-1

> Короче это какой-то огрызок а не API.
По крайней мере один программист, кроме меня, уже написал бот
Только у тебя проблемы

> А всего то надо было сделать, чтобы dll экспортировала 4 метода:
> function AICreate(width, height: Integer): Pointer; stdcall;
> function AIOpponentsTurn(handle: Pointer; x, y: Integer); stdcall;
> function AIMakeTurn(handle: Pointer; out x, y: Integer); stdcall;
> function AIDestroy(handle: Pointer); stdcall;
4 указателя на каждый бот + указатель на какуюто структуру AI на случай, если захочется в многопоточность. Некрасиво

#21
4:13, 17 июня 2019

ancooper
Сори, вот последняя версия (2012)
https://gamedev.ru/files/?id=77757

Могу переписать на C++
Незнаю как в C# с DLL

#22
5:51, 17 июня 2019

Aslan
> Кто тебе сказал такое?
Опыт мне такое сказал.

> Абстрактный класс = один указатель на VMT и все, что может быть более
> совместимое
Только вот по каким оффсетом там что живет в абстрактном классе - одному компилятору известно

На вот держи:
AI
Сможешь рассказать, почему DLL, собранная с помощью Delphi 10.2 падает? Исходный код там же, в архиве. Продублирую под спойлер:

+ Показать

DLL собранная из под FreePascal работает, из под Delphi - падает. Один и тот же код.

> По крайней мере один программист, кроме меня, уже написал бот
> Только у тебя проблемы
Везучий программист, чо. А кто-то может просидеть, продолбаться и не понять, почему его dll крешится.

> 4 указателя на каждый бот + указатель на какуюто структуру AI на случай, если
> захочется в многопоточность. Некрасиво
Это не указатель на какую-то структуру, а хендл на данные, созданные на стороне DLL. Создается хендл в AICreate, а потом передается внутрь AIOpponentsTurn, AIMakeTurn, AIDestroy. Так делают все нормальные люди, которые хотят реализовать API без интерфейсов.

#23
13:53, 17 июня 2019

MrShoor
>> Абстрактный класс = один указатель на VMT и все, что может быть более совместимое
> Только вот по каким оффсетом там что живет в абстрактном классе - одному компилятору известно
По 0-му офсету указатель на VMT и все, даже выравнивания тут никак не влияют

> Сможешь рассказать, почему DLL, собранная с помощью Delphi 10.2 падает?
Вероятно, разные модели вызовов ф-ций - fastcall, stdcall итд и настройках компилятора по умолчанию

> Это не указатель на какую-то структуру, а хендл на данные, созданные на стороне DLL. Так делают все нормальные люди, которые хотят реализовать API без интерфейсов
В чем проблема с интерфейсами, в C на них построили COM

#24
(Правка: 19:06) 18:52, 17 июня 2019

Aslan
> По 0-му офсету указатель на VMT и все, даже выравнивания тут никак не влияют
Это не гарантируется. А почему например не по -4 оффсету?
Однако да, в данном конкретном случае и в Delphi и в FPC таблица виртуальных методов лежит по нулевому смещению. Но где гарантии, что завтра она не станет лежать по отрицательному смещению?

> Вероятно, разные модели вызовов ф-ций - fastcall, stdcall итд и настройках
> компилятора по умолчанию
Мимо. fastcall и там и там насколько мне известно. Даже если это не так, то явное указание stdcall не решит проблемы креша. Есть еще версии? :)
upd. Проверил. Соглашение о вызовах совпадает и в Delphi и в FreePascal. Хотя конечно отсутствие соглашения нужно было записать пятым пунктом в #17 посте.

> В чем проблема с интерфейсами, в C на них построили COM
Вот с интерфейсами как раз проблемы нет, в отличие от твоего "API". Можно сделать на интерфейсах. Из недостатков - если использовать COM интерфейсы, то придется реализовывать AddRef Release и QueryInterface. Можно использовать CORBA, что более экзотично, но по крайней мере работает. А твой интерфейс не работает. В этом его особенность. Сможешь написать dll скажем на плюсах к своим крестикам-ноликам?

#25
(Правка: 23:05) 23:04, 18 июня 2019

MrShoor
> Сможешь написать dll скажем на плюсах к своим крестикам-ноликам?
ну вот хотя бы, я на дельфи даже серьезно этот коммент про бота не рассматривал .. а вы тут развернули ..

впрочем все от лукавого .. те кто серьезно решат написать бота, я дам вам исходный код .. пишите, не хочу простыми исходниками на c# .. желание других языков? серьезно есть программисты кто не знает c#?

P.S. на мой последний вопрос никто не ответит?

#26
(Правка: 8:57) 8:55, 19 июня 2019

MrShoor
> function AICreate(width, height: Integer): Pointer; stdcall;
> function AIOpponentsTurn(handle: Pointer; x, y: Integer); stdcall;
> function AIMakeTurn(handle: Pointer; out x, y: Integer); stdcall;
> function AIDestroy(handle: Pointer); stdcall;
В dll'ке реализованы эти методы. Что делать то, чтоб заработало?)
А то вы тут умными непонятными словами разговариваете)))

#27
10:13, 19 июня 2019

ancooper
У Aslan-а спроси. Он же выкладывал тут UI. А у меня даже исходников нет, чтобы это починить.

#28
12:35, 19 июня 2019

В шахматах, если чо, взаимодействие с GUI идет через stdin/stdout. Как бонус, движок можно использовать без GUI:

+ Показать

Aslan
Похоже на правду?
http://prboom-plus.sourceforge.net/aslan_tictactoe.html

#29
21:10, 19 июня 2019

tac
> дайте скачать вашу реализацию крестиков?

нууу, это непросто, мсье знает толк в извращениях, я писал своих на GDScript )

ну, он по синтаксису очень похож на Питон. Код выкладываю в файликах.
TTT_AI_main - основная часть программы
TTT_AI_leafs - работает с "листьями" - в данном случае это лишь обработка самого верхнего слоя - то бишь просто 9 клеток

Страницы: 1 2 3 Следующая »
ПроектыФорумОцените