Google
 

Шашисту на заметку

Login





 


 Забыли пароль?
 или новый пользователь? Зарегистрируйся!

Кто с нами

Пользователей:  Зарегистрированные
подключено  retepka  

В записную книжку


Новая тема   Ответить
Предыдущая тема Версия для печати Войти и проверить личные сообщения Следующая тема
Автор Сообщение
NS
Тема сообщения:   СообщениеОтправлено: Авг 24, 2006 - 10:11 AM



Зарегистрирован: Авг 22, 2006
Сообщений: 614
Откуда : Санкт-Петербург
Почти тоже самое, но не совсем Smile У меня без ошибки.
 
 Профиль пользователя отправить личное сообщение  
Ответить с цитатой Наверх
Kallisto
Тема сообщения:   СообщениеОтправлено: Авг 24, 2006 - 10:10 AM



Зарегистрирован: Авг 18, 2003
Сообщений: 731

NS писал(а):
Нашел на сайте Каллисто исходники SiDra...
Там ошибки в генераторе ходов!
Хотя бы - съев шашку, вместо того чтоб поставить препятствие (через это поле больше бить/проходить нельзя) - зачем-то сразу снимается съеденная шашка с доски...


Почти то же самое, что и у тебя, только у тебя переворачивается, а у меня снимается.
Видимо, у меня дамка рано или поздно сможет пройтись через уже сбитую шашку, что неправильно. Но это очень исключительный случай.
Надо будет исправить.
 
 Профиль пользователя отправить личное сообщение Послать e-mail WWW  
Ответить с цитатой Наверх
NS
Тема сообщения:   СообщениеОтправлено: Авг 24, 2006 - 09:59 AM



Зарегистрирован: Авг 22, 2006
Сообщений: 614
Откуда : Санкт-Петербург
Нашел на сайте Каллисто исходники SiDra...
Там ошибки в генераторе ходов!
Хотя бы - съев шашку, вместо того чтоб поставить препятствие (через это поле больше бить/проходить нельзя) - зачем-то сразу снимается съеденная шашка с доски...
Практически единственное место в генераторе где возможно сделать ошибку - и она сделана! Smile
Хотя генератор очень похожий на мой. Неужели у всех мысль в одном направлении работает? Smile
 
 Профиль пользователя отправить личное сообщение  
Ответить с цитатой Наверх
NS
Тема сообщения:   СообщениеОтправлено: Авг 24, 2006 - 09:18 AM



Зарегистрирован: Авг 22, 2006
Сообщений: 614
Откуда : Санкт-Петербург
Я, чтоб не плодить протоколов - сразу сделаю её под протокол Каллисто. Ты ведь не против? Smile
 
 Профиль пользователя отправить личное сообщение  
Ответить с цитатой Наверх
Kallisto
Тема сообщения:   СообщениеОтправлено: Авг 24, 2006 - 09:11 AM



Зарегистрирован: Авг 18, 2003
Сообщений: 731

Вот результаты Каллисто на Sempron 3000+ (реальная частота 2340):
Код:

 1 -          7    time: 0    speed: Infinity
 2 -         49    time: 0    speed: Infinity
 3 -        302    time: 0    speed: Infinity
 4 -       1469    time: 0    speed: Infinity
 5 -       7482    time: 0    speed: Infinity
 6 -      37986    time: 0    speed: Infinity
 7 -     190146    time: 16    speed: 11884 Kn / sec
 8 -     929905    time: 62    speed: 14998 Kn / sec
 9 -    4570667    time: 281    speed: 16266 Kn / sec
10 -   22450628    time: 1422    speed: 15788 Kn / sec
11 -  110961169    time: 7047    speed: 15746 Kn / sec
12 -  545059387    time: 34328    speed: 15878 Kn / sec


Кстати, ты прогу делай так, чтобы ее легко было пристроить к интерфейсу Каллисто. Получишь сразу несколько соперников для тестировния.
 
 Профиль пользователя отправить личное сообщение Послать e-mail WWW  
Ответить с цитатой Наверх
Kallisto
Тема сообщения:   СообщениеОтправлено: Авг 24, 2006 - 08:29 AM



Зарегистрирован: Авг 18, 2003
Сообщений: 731

NS писал(а):

Так этож 0x88 Smile 136! Smile
Я перед генерацией взятий снимаю шашку (которая совершает взятия), а после ставлю обратно. Это правильно?

Да.

Про 0х88 может я и пойму. Но это все равно некрасиво. Лучше сделать макрос IS_ON_BOARD(x). И сразу станет понятно что ты проверяешь.
Т.е. программы лучше делать читаемыми.
 
 Профиль пользователя отправить личное сообщение Послать e-mail WWW  
Ответить с цитатой Наверх
NS
Тема сообщения:   СообщениеОтправлено: Авг 24, 2006 - 08:26 AM



Зарегистрирован: Авг 22, 2006
Сообщений: 614
Откуда : Санкт-Петербург
А неоптимального много - навсикдку - после превращения в дамку можно продлжить взятие только в одном направлении (если угол - тогда вообще невозможно) - а у меня вызывается процедура взятий дамки по четырем (ошибки не будет, остальные три направления заблокированы), в структуре хода хранятся отдельно координаты откуда ход и куда - нужно конечно хранить в одном элементе (просто сдвинуть "откуда") и т.д.
Направление взятия можно убрать из параметра (Для простой, для дамки нужно оставить)
Зачем-то при каждом взятии в структуру списка ходов пишу что это взятия (а не простые ходы), Хотя можно это сделать в основной процедуре генерации, проверив что вернула ненулевое количество взятий.
Можно еще чего-нибудь придумать...
//
А есть данные perft-а, с указанием потраченного времени, и компа на котором производилось тестирование?
 
 Профиль пользователя отправить личное сообщение  
Ответить с цитатой Наверх
NS
Тема сообщения:   СообщениеОтправлено: Авг 24, 2006 - 08:13 AM



Зарегистрирован: Авг 22, 2006
Сообщений: 614
Откуда : Санкт-Петербург
Kallisto писал(а):
// поменям шашку противникак на нашу, чтоб не взять повторно.

прикольно

if (kuda and 136)=0 then - так некрасиво (магические числа), смысл не очевиден такой конструкции

А так вроде нормально. Что ты видишь здесь неоптимального?

Как с генератором? Успел за вечер?


Так этож 0x88 Smile 136! Smile
За вечер не получилось - смог начать писать только в полночь...
К Двум часам ночи дописал, проверил на нескольких тестовых позиций.
Дальше писать уже не мог - хотелось спать Smile
Сейчас нужно бежать на работу - нужно немного подправить генератор взятий дамки (работает вроде правильно (правда не уверен), но совсем кривой) и у меня вопрос по правилам - меня переклинило - шашка которой совершаем взятие тоже снимается только по окончании взятия? (может ли шашка в процессе взятия вернутся на изначальное место, либо пройти через него?)
Я перед генерацией взятий снимаю шашку (которая совершает взятия), а после ставлю обратно. Это правильно?
 
 Профиль пользователя отправить личное сообщение  
Ответить с цитатой Наверх
Kallisto
Тема сообщения:   СообщениеОтправлено: Авг 24, 2006 - 08:06 AM



Зарегистрирован: Авг 18, 2003
Сообщений: 731

// поменям шашку противникак на нашу, чтоб не взять повторно.

прикольно

if (kuda and 136)=0 then - так некрасиво (магические числа), смысл такой конструкции не очевиден

А так вроде нормально. Что ты видишь здесь неоптимального?

Как с генератором? Успел за вечер?
 
 Профиль пользователя отправить личное сообщение Послать e-mail WWW  
Ответить с цитатой Наверх
NS
Тема сообщения:   СообщениеОтправлено: Авг 24, 2006 - 07:17 AM



Зарегистрирован: Авг 22, 2006
Сообщений: 614
Откуда : Санкт-Петербург
Код:
Function addmove(izot:byte;otkuda:byte;nap:shortint;var cap:capture;var mov:moves):Byte;
var kuda,kuda1,kolvz,nomMoves,i:byte;
Begin
  kolvz:=0;
  kuda:=otkuda+nap;
  if (kuda and 136)=0 then
    if pole[kuda]<0 then
      Begin
        kuda1:=kuda+nap;
        if (kuda1 and 136)=0 then
          if pole[kuda1]=0 then
          if kuda1<112 then
          Begin
            // взятие
            pole[kuda]:=-pole[kuda];
            // поменям шашку противникак на нашу, чтоб не взять повторно.
            cap[0]:=cap[0]+1;
            cap[cap[0]]:=kuda;
            kolvz:=kolvz+addmove(izot,kuda1,15,cap,mov);
            kolvz:=kolvz+addmove(izot,kuda1,-15,cap,mov);
            kolvz:=kolvz+addmove(izot,kuda1,17,cap,mov);
            kolvz:=kolvz+addmove(izot,kuda1,-17,cap,mov);
            pole[kuda]:=-pole[kuda];
            if kolvz=0 then
              Begin
                kolvz:=1;
                NomMoves:=mov.kolMoves+1;
                mov.kolMoves:=NomMoves;
                mov.moveOt[NomMoves]:=izot;
                mov.moveKu[NomMoves]:=kuda1;
                mov.dam[NomMoves]:=false;
                mov.Vzatie:=true;
                for i:=0 to cap[0] do mov.Cap[NomMoves][i]:=cap[i];
              end;
              cap[0]:=cap[0]-1;
          end
          Else
          Begin
               // взятие с превращением
            pole[kuda]:=-pole[kuda];
            cap[0]:=cap[0]+1;
            cap[cap[0]]:=kuda;
            kolvz:=kolvz+addmoveD(izot,kuda1,15,cap,mov);
            kolvz:=kolvz+addmoveD(izot,kuda1,-15,cap,mov);
            kolvz:=kolvz+addmoveD(izot,kuda1,17,cap,mov);
            kolvz:=kolvz+addmoveD(izot,kuda1,-17,cap,mov);
            pole[kuda]:=-pole[kuda];
            if kolvz=0 then
              Begin
                kolvz:=1;
                NomMoves:=mov.kolMoves+1;
                mov.kolMoves:=NomMoves;
                mov.moveOt[NomMoves]:=izot;
                mov.moveKu[NomMoves]:=kuda1;
                mov.dam[NomMoves]:=True;
                mov.Vzatie:=true;
                for i:=0 to cap[0] do mov.Cap[NomMoves][i]:=cap[i];
              end;
              cap[0]:=cap[0]-1;
          end;
      end;
      addmove:=kolvz;
end;


Вот такая вспомогательная функция получилась для генерации взятий простой... Или это очень неоптимально? (все переменные модуля компилятор хранит в регистрах)
ЗЫ. Прошу извинить за такое название переменных - но мне так удобней. Smile
 
 Профиль пользователя отправить личное сообщение  
Ответить с цитатой Наверх
Kallisto
Тема сообщения:   СообщениеОтправлено: Авг 24, 2006 - 06:45 AM



Зарегистрирован: Авг 18, 2003
Сообщений: 731

значит будет. после первого же просмотра.
почему perfit, не perft?
 
 Профиль пользователя отправить личное сообщение Послать e-mail WWW  
Ответить с цитатой Наверх
NS
Тема сообщения:   СообщениеОтправлено: Авг 24, 2006 - 12:40 AM



Зарегистрирован: Авг 22, 2006
Сообщений: 614
Откуда : Санкт-Петербург
alemo писал(а):
skoree vsego Avrora zapisivayet xod kak: a1xc3xh8 ili a1xd4xh8 ... nu i tak dalee. Voobshe-to pravilno, ved dobav chernim eshe jdnu shahku na b6, i togda mozhno a1xd4xa7 Laughing

Kazhdy programmiruyet po svoemu


Зачем понапрасну раширять дерево перебора,
И смотреть четыре одинаковых хода?
А если позиции после этого хода нет в хеше?
 
 Профиль пользователя отправить личное сообщение  
Ответить с цитатой Наверх
alemo
Тема сообщения:   СообщениеОтправлено: Авг 24, 2006 - 12:35 AM



Зарегистрирован: Апр 04, 2003
Сообщений: 3772

skoree vsego Avrora zapisivayet xod kak: a1xc3xh8 ili a1xd4xh8 ... nu i tak dalee. Voobshe-to pravilno, ved dobav chernim eshe jdnu shahku na b6, i togda mozhno a1xd4xa7 Laughing

Kazhdy programmiruyet po svoemu
 
 Профиль пользователя отправить личное сообщение  
Ответить с цитатой Наверх
NS
Тема сообщения:   СообщениеОтправлено: Авг 23, 2006 - 11:30 PM



Зарегистрирован: Авг 22, 2006
Сообщений: 614
Откуда : Санкт-Петербург
Аврора считает, что дамкой a1 можно сбить простые b2 и g7 4-мя способами.
У меня один способ.
 
 Профиль пользователя отправить личное сообщение  
Ответить с цитатой Наверх
NS
Тема сообщения:   СообщениеОтправлено: Авг 23, 2006 - 11:28 PM



Зарегистрирован: Авг 22, 2006
Сообщений: 614
Откуда : Санкт-Петербург
Я конечно идиот, но я уже час мучаюсь, как бы их (одинаковые) исключить, и притом быстро Smile)))
Написал генератор (0x88) Сейчас передохну, и начну пробовать perfit.
 
 Профиль пользователя отправить личное сообщение  
Ответить с цитатой Наверх
Показать:     
Перейти к:  
Время в формате GMT - 12
Новая тема   Ответить
Предыдущая тема Версия для печати Войти и проверить личные сообщения Следующая тема
PNphpBB2 © 2003-2007 
 
Page created in 1.5642888546 seconds.