Ключевое слово
25 | 04 | 2024
Новости Библиотеки
Шахматы Онлайн
Welcome, Guest
Username: Password: Remember me

TOPIC: Bitboard в программировании шахмат №2

Bitboard в программировании шахмат №2 11 Фев 2023 10:49 #151

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
К сожалению нет компа под рукой.
Не могу проверить для Делфи.
Посетила такая мысль.
Если спуститься на глубину 6 только строго по одной ветви в каждом дочернем узле, начиная с корневого узла.
Затем сравнить результаты.
Достаточно в исходный код добавить только одну строку, чтобы проверить идею
if (depth!=1) return;
long nodes;

// perft driver
static inline void perft_driver(int depth)
{
    // reccursion escape condition
    if (depth == 0)
    {
        // increment nodes count (count reached positions)
        nodes++;
        return;
    }
    
    // create move list instance
    moves move_list[1];
    
    // generate moves
    generate_moves(move_list);
    
        // loop over generated moves
    for (int move_count = 0; move_count < move_list->count; move_count++)
    {   
        // preserve board state
        copy_board();
        
        // make move
        if (!make_move(move_list->moves[move_count], all_moves))
            // skip to the next move
            continue;
        
        // call perft driver recursively
        perft_driver(depth - 1);
        
        // take back
        take_back();
        if (depth!=1) return;
    }
}

Warning: Spoiler! [ Click to expand ]
Last Edit: 11 Фев 2023 10:56 by alexlaw.

Bitboard в программировании шахмат №2 12 Фев 2023 03:16 #152

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Сегодня проверю критическую ветку, где присутствует шах и установлено битое поле.
Рассмотрена строго одна ветка дерева без ветвлений.

Warning: Spoiler! [ Click to expand ]


Проверил.
Разницы нет


Warning: Spoiler! [ Click to expand ]
Last Edit: 12 Фев 2023 08:13 by alexlaw.

Bitboard в программировании шахмат №2 12 Фев 2023 04:46 #153

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Искусственный интеллект рулит!
Сегодня узнал, что в Яндекс браузер встроен перевод видео.
Можно смотреть Ютуб с озвучкой на русском языке и не заморачиваться с этим)))

Warning: Spoiler! [ Click to expand ]

Bitboard в программировании шахмат №2 12 Фев 2023 14:16 #154

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Наконец то я понял методику поиска ошибки
1. Позиция, где не пройден тест perft








8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - -

2.Ищем в каком случае разница
depth=5 - нет разницы

Warning: Spoiler! [ Click to expand ]


depth=6 - есть разница


Warning: Spoiler! [ Click to expand ]


3. Делаем ход, в котором есть разница в значениях и уменьшаем глубину на 1
В данном случае я выбрал ход b4a4








8/2p5/3p4/KP5r/R4p1k/8/4P1P1/8 b - - 0 1

4.Ищем разницу при depth=5

Warning: Spoiler! [ Click to expand ]


5.Делаем ход h4g3 и уменьшаем глубину на 1








8/2p5/3p4/KP5r/R4p2/6k1/4P1P1/8 w - - 0 1

Warning: Spoiler! [ Click to expand ]


e2e3








8/2p5/3p4/KP5r/R4p2/4P1k1/6P1/8 b - - 0 1

Warning: Spoiler! [ Click to expand ]


Вот он

Warning: Spoiler! [ Click to expand ]


Теперь искать, почему?
Last Edit: 12 Фев 2023 16:11 by alexlaw.

Bitboard в программировании шахмат №2 12 Фев 2023 17:33 #155

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Нашел.

Warning: Spoiler! [ Click to expand ]

// generate king attacks
function  mask_king_attacks(square:TBoard_squares):U64;
var
attacks,bitboard:U64;
begin
// result attacks bitboard
attacks := 0;
// piece bitboard
bitboard := 0;
// set piece on board
set_bit(bitboard, square);
    // generate king attacks
    if (bitboard shr 8)>0 then  attacks:=attacks or (bitboard shr 8);
    if ((bitboard shr 9) and not_h_file)>0 then  attacks:=attacks or (bitboard shr 9);
    if ((bitboard shr 1) and not_h_file)>0 then  attacks:=attacks or (bitboard shr 1);
    if ((bitboard shr 7) and not_a_file)>0 then  attacks:=attacks or (bitboard shr 7);
    if (bitboard shl 8)>0 then  attacks:=attacks or (bitboard shl 8);
    if ((bitboard shl 9) and not_a_file)>0 then  attacks:=attacks or (bitboard shl 9);
    if ((bitboard shl 1) and not_a_file)>0 then  attacks:=attacks or (bitboard shl 1);
    if ((bitboard shl 7) and not_h_file)>0 then  attacks:=attacks or (bitboard shl 7);
// return attack map
mask_king_attacks:=attacks;
end;

Собака зарыта скорее всео здесь
bitboard shl 8
Самый старший бит должен быть установлен в 1, но он этого не происходит.
Может ли это гдето вылезти еще, большой вопрос.

Bitboard в программировании шахмат №2 12 Фев 2023 18:24 #156

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Вот и решение вопроса
if (bitboard shl 8)<>0 then  attacks:=attacks or (bitboard shl 8);

if (bitboard shl 8)<>0








8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - -

Warning: Spoiler! [ Click to expand ]



Warning: Spoiler! [ Click to expand ]


Perft=7


Warning: Spoiler! [ Click to expand ]


Все OK :)
Last Edit: 12 Фев 2023 18:31 by alexlaw.

Bitboard в программировании шахмат №2 17 Фев 2023 18:34 #157

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Уроки
44.Bitboard CHESS ENGINE in C: connecting to the GUI (parse move string)
45.Bitboard CHESS ENGINE in C: connecting to the GUI (parse "position" command)
46.Bitboard CHESS ENGINE in C: connecting to the GUI (parse "go" command)
47.Bitboard CHESS ENGINE in C: connecting to the GUI (main loop) + BONUS (TSCP vs BBC blitz game).

Warning: Spoiler! [ Click to expand ]


Удалось подключиться по протоколу UCI.
К Arena Chess GUI 1.1 и к WinBoard-4.8.0


Warning: Spoiler! [ Click to expand ]


Warning: Spoiler! [ Click to expand ]


Warning: Spoiler! [ Click to expand ]


Warning: Spoiler! [ Click to expand ]

Warning: Spoiler! [ Click to expand ]


Arena Engine Debug

Warning: Spoiler! [ Click to expand ]


PS
Изменил 2 строчки кода
Input_str:widestring;
---
FillChar(Input_str, SizeOf(Input_str), 0);
Last Edit: 19 Фев 2023 04:48 by alexlaw.

Bitboard в программировании шахмат №2 18 Фев 2023 05:34 #158

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
На самом деле еще не все моменты освещены на данном этапе.
- шах, мат, пат
- троекратное повторение
- правило 50 ходов

Еще важный момент
Если на вход bbc поступает один из видов нелегетимных ходов (ход короля под шах),
bbc игнорирует этот ход (не делает его в makemove), но не сообщает, что это illegal move.

Bitboard в программировании шахмат №2 18 Фев 2023 08:38 #159

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Кто из знатоков СИ может обЪяснить это
enum {
    a8, b8, c8, d8, e8, f8, g8, h8,
    a7, b7, c7, d7, e7, f7, g7, h7,
    a6, b6, c6, d6, e6, f6, g6, h6,
    a5, b5, c5, d5, e5, f5, g5, h5,
    a4, b4, c4, d4, e4, f4, g4, h4,
    a3, b3, c3, d3, e3, f3, g3, h3,
    a2, b2, c2, d2, e2, f2, g2, h2,
    a1, b1, c1, d1, e1, f1, g1, h1, no_sq
};
const int mirror_score[128] =
{
	a1, b1, c1, d1, e1, f1, g1, h1,
	a2, b2, c2, d2, e2, f2, g2, h2,
	a3, b3, c3, d3, e3, f3, g3, h3,
	a4, b4, c4, d4, e4, f4, g4, h4,
	a5, b5, c5, d5, e5, f5, g5, h5,
	a6, b6, c6, d6, e6, f6, g6, h6,
	a7, b7, c7, d7, e7, f7, g7, h7,
	a8, b8, c8, d8, e8, f8, g8, h8
};

Что вернет mirror_score[h8] и почему размер массива 128, а элементов 64?

Bitboard в программировании шахмат №2 18 Фев 2023 10:16 #160

  • Vladimirovich
  • Vladimirovich's Avatar
  • NOW ONLINE
  • Инквизитор
  • Posts: 106852
  • Thank you received: 2078
  • Karma: 105
enum это именованные последовательные константы (для полей в данном случае)
mirror_score их и пользует.
Для чего зарезервировали 128 без контекста не понять

mirror_score[h8] это извращение. Так делать никогда нельзя. Весь смысл enum в том, чтобы конкретное значение константы было неважно.
Иначе будет memory corruption при случае
Но с данным enum h8 = 7 (a8 = 0 по умолчанию)
То бишь mirror_score[h8] вернет h1
Но потом не надо огорчаться, что при таком стиле кодинга все вдруг упадет.
Каждому - своё.

Bitboard в программировании шахмат №2 18 Фев 2023 10:19 #161

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Не стал заморачиваться, сделал функцию оценки (материал и расположение).
Протестировал, результы совпадают с Максом.

Warning: Spoiler! [ Click to expand ]
Last Edit: 18 Фев 2023 10:22 by alexlaw.

Bitboard в программировании шахмат №2 18 Фев 2023 17:22 #162

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Сыграл первую игру с движком :dance:



Depth=4

1. Вылезла проблема - хода короля под шах
Движок пока еще не знает, что такое мат, пат, шах.
Посчитал лучшим ходом - ход под шах, естественно makemove ход не сделала, но очередь хода была передана.
Вобщем я доволен)))
Прошел ровно 50 уроков.

Bitboard в программировании шахмат №2 19 Фев 2023 11:03 #163

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Я думаю благодаря этому форуму у меня получились две вещи.
- Генератор ходов без ошибок (perft test пройден).
- Понял базовые принципы шахматных движков.
- Удалось подключиться по протоколу UCI к оболочке.

Кстати попробовал изменить метод подсчета бит (ссылка выше)
Мне кажется это дает неплохой результат
// https://habr.com/ru/post/276957/
// Комбинированный метод
function count_bits(bb:U64):integer;
var
n:U64;
a1,a2,a3,a4:U64;
begin
 a1:=$5555555555555555;
 a2:=$3333333333333333;
 a3:=$0F0F0F0F0F0F0F0F;
 a4:=$0101010101010101;
 n:=bb-(bb shr 1) and a1;
 n:=((n shr 2) and a2) + (n and a2);
 n:=((((n shr 4) + n) and a3) * a4) shr 56;
 result:=n;
end;

Warning: Spoiler! [ Click to expand ]


Warning: Spoiler! [ Click to expand ]


Вроде тесты прошел и скорость прибавилась, но надо еще тестить.
Попробовал даже сыграть с движком при depth=6



Сыграл вничью :)

И это еще практически не реализовано кроме negamax с alfabeta обрезкой.
Правда во время игры вылезла ошибка - код исключения 0xc0000005.
Доигрывал перезапустив движок.
Както так.
Last Edit: 19 Фев 2023 17:52 by alexlaw.

Bitboard в программировании шахмат №2 19 Фев 2023 19:09 #164

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Провел еще один perft test с функцией подсчета бит комбинированным методом, просто, чтобы быть уверенным в этом методе и его реализации в коде.
Метод однозначно лучший.

Warning: Spoiler! [ Click to expand ]


Правда сначала я был ошарашен, результат не совпал.
Потом догадался, у меня размерность - Cardinal 4294967295 беззнаковый, 32-бит, а результат вышел за пределы числа.
Короче результат ОК
Warning: Spoiler! [ Click to expand ]


Скорость порадовала, по сравнению с другими методами подсчета бит.
Вывод: Метод нужно брать на вооружение

Bitboard в программировании шахмат №2 21 Фев 2023 16:24 #165

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Нашел решение очень важного момента.
Важный момент - это утечка памяти.
Обнаружил так
//https://stackoverflow.com/questions/437683/how-to-get-the-memory-used-by-a-delphi-program?utm_source=pocket_saves
function GetMemoryUsed: UInt64;
var
  st: TMemoryManagerState;
  sb: TSmallBlockTypeState;
begin
  GetMemoryManagerState(st);
  result :=  st.TotalAllocatedMediumBlockSize
           + st.TotalAllocatedLargeBlockSize;
  for sb in st.SmallBlockTypeStates do begin
    result := result + sb.UseableBlockSize * sb.AllocatedBlockCount;
  end;
end;

Решение такое, на каждое New(add_move);

Dispose(add_move); и вместо

FillChar(Input_str, SizeOf(Input_str), 0);

просто Input_str:='';

Warning: Spoiler! [ Click to expand ]


Warning: Spoiler! [ Click to expand ]

Bitboard в программировании шахмат №2 21 Фев 2023 16:31 #166

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Движок сыграл сам с собой.
Глубина перебора всего 4


Неплохо :glasses:

Bitboard в программировании шахмат №2 22 Фев 2023 05:50 #167

  • Andralex
  • Andralex's Avatar
  • OFFLINE
  • Боярин
  • на уровне 2 разряда
  • Posts: 2542
  • Thank you received: 67
  • Karma: 17
Какие-то симметричные построения с конями к центру. 8... Be7
...не мы первые, не мы последние...

Bitboard в программировании шахмат №2 23 Фев 2023 19:30 #168

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Хотел подвести какой то итог шагов разработки шахматного движка

1. Атаки прыгающих фигур (король,конь,пешка)
2. Атаки скользящих фигур (слон,ладья,ферзь)
3. Представление данных о позиции в памяти компа.
- 12 битбоардов (тип и цвет фигур)
- 3 битбоарда (белые, черные, все)
- сторона хода
- состояние рокеровки
- поле взятия на проходе
4. Интерфейс (взаимодействие с человеком) для наглядного представления работы движка.
5. Функции
- подсчет битов в числе
- нахождение первого установленного бита в числе
- проверка установлен ли бит в любой позиции числа
- сброс любого бита в числе
- нахождение для каждого поля доски всех атак на это поле со стороны фигур, принадлежащих белым или черным
6. Генератор ходов
- тихие ходы пешек
- ходы взятие пешек
- рокеровка
- ходы прыгающих и скользящих фигур с помощью таблиц атак
- сформировать список ходов в соответствии с алгоритмом сжатия инфы о ходе
7.Сжатие информации о ходе в одно число
- откуда
- куда
- кто
- превращение пешки
- ? взятие
- ? ход пешки на 2 поля
- битое поле
- рокеровка
8.Сделать ход
- запомнить позицию из п.3
- проверить короля на предмет атаки
- восстановить поз при атаке на короля или применить ход
9. проверить все с помощью теста perft
Last Edit: 23 Фев 2023 19:32 by alexlaw.

Bitboard в программировании шахмат №2 24 Фев 2023 05:52 #169

  • Andralex
  • Andralex's Avatar
  • OFFLINE
  • Боярин
  • на уровне 2 разряда
  • Posts: 2542
  • Thank you received: 67
  • Karma: 17
- сторона хода
- состояние рокеровки
- поле взятия на проходе
Так и есть. Это прописывается в формате FEN.
Ещё есть число ходов, прошедших без взятия пешки, или движения пешки.

- превращение пешки
Всегда в ферзя, или также выборочно в другие фигуры?
...не мы первые, не мы последние...

Bitboard в программировании шахмат №2 24 Фев 2023 06:31 #170

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Итак, после если тесты perft пройдены без ошибок, это значит можно работать над силой движка, используя накопленные за десятилетия алгоритмы.
В основе всего используется алгоритм nega max.
nega max основан на методе минимакс, который ищет лучший ход, учитывая, что оппонент будет делать свой лучший ответ на каждый ход. Однако, в отличие от минимакса, который рассматривает только собственные ходы, nega max рассматривает ходы обоих игроков, при этом считая, что оппонент всегда будет делать наилучший ход

alphabeta
function integer alphabeta (node,player,alpha,beta,depth)
      if depth <= 0 :
            return the heuritic value of node for player A
      if (player is A)
            for child in node
             alpha = max(alpha,alphabeta(child,not(player),alpha,beta,depth −1))
             if (beta<=alpha)
               return beta
      next for
              return alpha
    end
    if (player is B)
           for child in node
           beta = min(beta,alphabeta(child,not(player),alpha,beta,depth −1))
           if (beta<=alpha)
              return alpha
    next for
             return beta
    end
end function

nega max
function integer alphabeta (node,alpha,beta,depth)
    if depth <= 0 :
         return the heuristic value of node for current player
    for child in node :
        alpha = max(alpha,−alphabeta(child,−beta,−alpha,depth −1))
           if (alpha>=beta)
             return beta;
   next for
             return alpha
end function

Главное новшество этого алгоритма это полная симметрия кода для каждой из сторон, что позволяет исключить лишние проверки. Оценочная функция вызывается на любой глубине не с точки зрения игрока А, а со стороны игрока,чья очередь ходить на данной глубине.
Предположим, функция на определенной глубине вернула оценку для своей стороны.
Вернувшись на уровень выше, этой оценке будет добавлен «минус» и будет найден максимум всех этих «минусовых» позиций, что эквивалентно нахождению минимума для оценок без «минуса» таких какие были получены на следующей глубине. Мы все еще неявно проводим чередования поиска.
максимума с поиском минимума, но делаем это более элегантно.
Таким образом nega max полностью эквивалентен минимаксу и это ясно из следующего математического тождества.

max(a,b) = −min(−a,−b)

В результате выполнения nega max, мы получаем наилучший ход для текущего игрока, который, как предполагается, позволит ему выиграть при оптимальной игре оппонента.

Ну а дальше идут различные эвристики, чтобы сократить дерево перебора, т.е. как можно раньше и больше отрезать не нужных ветвей дерева.
Человечество накопило большой опыт в этом.

Bitboard в программировании шахмат №2 24 Фев 2023 06:46 #171

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Andralex wrote:
- сторона хода
- состояние рокеровки
- поле взятия на проходе
Так и есть. Это прописывается в формате FEN.
Ещё есть число ходов, прошедших без взятия пешки, или движения пешки.

- превращение пешки
Всегда в ферзя, или также выборочно в другие фигуры?
parse_fen('rnbqkb1r/pp1p1pPp/8/2p1pP2/1P1P4/3P3P/P1P1P3/RNBQKBNR w KQkq e6 0 1');
    print_board();
    New(add_move);
    generate_moves(add_move);
    print_move_list();

Генератор ходов - генерирует все возможные ходы, в том числе и превращения пешек во все фигуры








rnbqkb1r/pp1p1pPp/8/2p1pP2/1P1P4/3P3P/P1P1P3/RNBQKBNR w KQkq e6 0 1

Warning: Spoiler! [ Click to expand ]


Затем нужно просто выбрать лучший ход

PS к сожалению табличка не получилась :unsure:
Last Edit: 24 Фев 2023 06:55 by alexlaw.

Bitboard в программировании шахмат №2 01 Март 2023 20:21 #172

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Пришлось повозится с уроком
66.Bitboard CHESS ENGINE in C: handling TIME CONTROLS (forked from VICE by BluefeverSoftware)
Дальнейшая реализация протокола UCI
Пришлось привлечь интеллект :dontknow: искуственный :P

77.jpg


78.jpg


Он помог :writing:
 function input_waiting(): boolean;
var
  ReadFds: TFDSet;
  TimeVal: TTimeVal;
  InputHandle: THandle;
  BytesAvail: DWORD;
begin
  FD_ZERO(ReadFds);
  InputHandle := GetStdHandle(STD_INPUT_HANDLE);
  FD_SET(InputHandle, ReadFds);
  TimeVal.tv_sec := 0;
  TimeVal.tv_usec := 0;
  if PeekNamedPipe(InputHandle, nil, 0, nil, @BytesAvail, nil) then
     Result := (BytesAvail > 0);
end;
// read GUI/user input
procedure read_input;
var
  Bytes: DWORD;
  Input: array[0..255] of Char;
  EndChar: PChar;
begin
// "listen" to STDIN
if input_waiting then begin
    // tell engine to stop calculating
    stopped := 1;
    repeat
      Bytes := 0;
      if not ReadFile(GetStdHandle(STD_INPUT_HANDLE), Input, SizeOf(Input), Bytes, nil) then
        Break;
    until Bytes > 0;
    EndChar := StrScan(Input, #10);
    if Assigned(EndChar) then
      EndChar^ := #0;
    if StrLen(Input) > 0 then
    begin
      if StrLIComp(Input, 'quit', 4) = 0 then begin
        Writeln('Quit OK');
        // tell engine to terminate exacution
        quit := 1;
      end
      else if StrLIComp(Input, 'stop', 4) = 0 then begin
        Writeln('Stop OK');
        // tell engine to terminate exacution
        quit := 1;
      end;
    end;
end;
end; 
// a bridge function to interact between search and GUI input
procedure communicate();
begin
 	  // if time is up break here
    if((timeset = 1) and (get_time_ms() > stoptime)) then begin
      		// tell engine to stop calculating
	        stopped := 1;
    end;
    // read GUI input
	  read_input();
end;

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

Вот сам с собой сыграл в блиц



Машины уже играют в шахматы лучше человека. Скоро они будут играть лучше него в футбол, бильярд и теннис... И это правильно, пусть играют, а человек должен работать!
Last Edit: 01 Март 2023 20:42 by alexlaw.
The following user(s) said Thank You: Vladimirovich

Bitboard в программировании шахмат №2 04 Март 2023 20:54 #173

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Попытка создать алгоритм текущей реализации движка

Warning: Spoiler! [ Click to expand ]


Warning: Spoiler! [ Click to expand ]


Warning: Spoiler! [ Click to expand ]


Warning: Spoiler! [ Click to expand ]


Warning: Spoiler! [ Click to expand ]


Warning: Spoiler! [ Click to expand ]

Bitboard в программировании шахмат №2 15 Апр 2023 07:03 #174

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Наконец то мне удался генератор легальных ходов полностью на реализации битбоард.

Warning: Spoiler! [ Click to expand ]


perft тесты прошел все

Warning: Spoiler! [ Click to expand ]


Правда мне не очень нравится реализация пары функций.

Какой алгоритм есть для нахождения связок?

Bitboard в программировании шахмат №2 15 Апр 2023 07:07 #175

  • Vladimirovich
  • Vladimirovich's Avatar
  • NOW ONLINE
  • Инквизитор
  • Posts: 106852
  • Thank you received: 2078
  • Karma: 105
alexlaw wrote:
Какой алгоритм есть для нахождения связок?
Хммм...
Формально, связка это три фигуры по диагонали или горизонтали.
Но не любые :)
Каждому - своё.

Bitboard в программировании шахмат №2 15 Апр 2023 07:16 #176

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Вот интересная связка







8/8/6k1/8/3pP2K/2P5/2B5/8 b - e3 0 1

Bitboard в программировании шахмат №2 15 Апр 2023 07:21 #177

  • Vladimirovich
  • Vladimirovich's Avatar
  • NOW ONLINE
  • Инквизитор
  • Posts: 106852
  • Thank you received: 2078
  • Karma: 105
alexlaw wrote:
Вот интересная связка
Ну не...
Пешка на е4 должна быть черной для связки.
Связывающая фигура одного цвета, первая в тройке.
За ней связанная и объект связки. Оба противоположного
Каждому - своё.

Bitboard в программировании шахмат №2 15 Апр 2023 07:25 #178

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Сейчас я использую такой алгоритм
1. Убираем свои фигуры
2. Ставим ферзя на место своего короля
3. Находим атаки этого ферзя (из таблиц атак)
4. Находим атакуемых врагов.
5. Подставляем на место своего ферзя (короля) тип врага
6. Находим его атаки
7. Пересечение атак - это луч атаки между врагом и своим королем
8. Ставим свои фигуры на место
9. Если на зтом луче есть одна своя фигура, то она связана

Bitboard в программировании шахмат №2 15 Апр 2023 07:28 #179

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Vladimirovich wrote:
alexlaw wrote:
Вот интересная связка
Ну не...
Пешка на е4 должна быть черной для связки.
Связывающая фигура одного цвета, первая в тройке.
За ней связанная и объект связки. Оба противоположного
А как назвать такую позицию, если это не связка?
PS ход черных тут
Last Edit: 15 Апр 2023 07:29 by alexlaw.

Bitboard в программировании шахмат №2 15 Апр 2023 07:32 #180

  • alexlaw
  • alexlaw's Avatar
  • OFFLINE
  • Дьяк
  • Posts: 183
  • Thank you received: 8
  • Karma: 1
Еще позиция







8/8/8/r2pP2K/8/4k3/8/8 w - d6 0 1
Last Edit: 15 Апр 2023 07:34 by alexlaw.
Moderators: Grigoriy
Рейтинг@Mail.ru

Научно-шахматный клуб КвантоФорум