UCI и VB60,помогите установить связь к командам АРЕНЫ

Тема в разделе "Машинное отделение", создана пользователем Macromix, 18 фев 2009.

  1. TopicStarter Overlay

    Macromix Учаcтник

    • Участник
    Рег.:
    17.02.2009
    Сообщения:
    11
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    Уважаемые авторы движков,помогите прикрутить программу к Арене.
    Насколько я знаю ALCHESS,ADAMANT,CHESSALEX(MARGINAL),и еще пара
    написаны на языке вроде VB. Мой движок тоже.



    Первое что не понятно, какие функции или API, нужны
    в моем случае для создания (связи) для получения команд. Т.е
    пример- например,и что есть наиболее быстрым.



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

    К сожалению,могу огорчить авторов этих движков и др.,поскольку
    в параллельном режиме(5сек),они уступают. Тяжело будет также
    GreKo и FreeChess, они пока немного сильнее,но тоже имеют поражения.
    Автор CHESSАLEX когда-то помогал в информации,теперь было бы интересно
    сыграть с его движком. У меня пока еще не все оптимизировано и имеются
    gлюки которые нужно исправить, но для игры это уже не критично.

    Спасибо
  2. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.492
    Симпатии:
    3.124
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Очень интересно будет взглянуть на Вашу программу. GreKo сейчас играет где-то на 2400...2500. Если Ваш движок достигнет этого уровня, будучи написанным на VB - снимаю шляпу :)
    Планируется ли публикация исходного кода?
  3. TopicStarter Overlay

    Macromix Учаcтник

    • Участник
    Рег.:
    17.02.2009
    Сообщения:
    11
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    Он написан на 99% процентов
    на Vb60,но имеется пара функций (DLL)
    откомпилированных на PWBASIC 7.1,но они дают не очень большую
    разницу,хотя дают.
  4. Chemer Максим

    • Участник
    Рег.:
    14.09.2006
    Сообщения:
    1.674
    Симпатии:
    13
    Репутация:
    0
    Адрес:
    Запорожье
    Оффлайн
  5. TopicStarter Overlay

    Macromix Учаcтник

    • Участник
    Рег.:
    17.02.2009
    Сообщения:
    11
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    Спасибо
    Я это смотрел
    Меня интересует пока как считать какую ни будь команду.
    Т.е функция которая это делает.А затем конечно если не все
    получиться то посмотреть дальше. Или например есть
    специальные быстрые API,я просто не думал над этими вопросами,
    пока не был удивлен игре движка.
  6. bankuss Александр

    • Заслуженный
    • Участник
    • Старожил
    Рег.:
    24.05.2006
    Сообщения:
    1.084
    Симпатии:
    38
    Репутация:
    6
    Оффлайн
    я свой движок писал на freebasic - он полностью бесплатный и имеет хорошую скорость (полностью 32-битный). PB тоже неплох, но стоит денег. а ms VB довольно тормозной. Хотя до С++ всем бейсикам далеко :) в плане оптимизации кода.
    А по вопросу попробуй так:
    Код:
    Option Explicit
    Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long
    Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Declare Function PeekNamedPipe Lib "kernel32" (ByVal hNamedPipe As Long, lpBuffer As Any, ByVal nBufferSize As Long, lpBytesRead As Long, lpTotalBytesAvail As Long, lpBytesLeftThisMessage As Long) As Long
    Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Any) As Long
    Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer As String, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Any) As Long
    Public Const STD_INPUT_HANDLE = -10&
    Public Const STD_OUTPUT_HANDLE = -11&
    Public hStdIn As Long
    Public hStdOut As Long
    
    Sub main()
    Dim sInput As String
    ....
    'CloseHandle hStdIn
    'CloseHandle hStdOut
    hStdIn = GetStdHandle(STD_INPUT_HANDLE)
    hStdOut = GetStdHandle(STD_OUTPUT_HANDLE)
    Do
    If PollCommand Then
    sInput = ReadCommand
    'здесь sInput содержит стринг от Winboard;
    'мы можем начать обработку команд и так далее...
    Debug.Print sInput
    End If
    DoEvents
    Loop
    
    End Sub
    
    '———————————————————————-
    'PollCommand () - Проверяет присутствие данных в
    'буфере стандартного входа
    'возвращает TRUE, если это готовые новые данные
    '———————————————————————-
    Function PollCommand() As Boolean
    Dim sBuff       As String
    Dim lBytesRead  As Long, lTotalBytes As Long, lAvailBytes As Long
    Dim ReturnCode  As Long
    sBuff = String(256, Chr$(0))
    ReturnCode = PeekNamedPipe(hStdIn, ByVal sBuff, 256, lBytesRead, lTotalBytes, lAvailBytes)
    PollCommand = CBool(ReturnCode And lBytesRead > 0)
    End Function
    
    '—————————————————————————————————————-
    'ReadCommand() - Читает стринг со стандартного входа
    '—————————————————————————————————————-
    Function ReadCommand() As String
    Dim sBuff       As String
    Dim lBytesRead  As Long
    Dim ReturnCode  As Long
    sBuff = String(256, Chr$(0))
    ReturnCode = ReadFile(hStdIn, ByVal sBuff, 256, lBytesRead, ByVal 0&)
    ReadCommand = Left$(sBuff, lBytesRead)
    End Function
    
    '—————————————————————————————————————-
    'SendCommand () - Посылает стринг на стандартный выход
    'он возвращает стринг, реально посланный
    '—————————————————————————————————————-
    Function SendCommand(ByVal sCommand As String) As String
    Dim lBytesWritten   As Long
    Dim lBytes          As Long
    Dim ReturnCode      As Long
    sCommand = vbLf & sCommand & vbLf
    lBytes = LenB(sCommand)
    ReturnCode = WriteFile(hStdOut, ByVal sCommand, lBytes, lBytesWritten, ByVal 0&)
    SendCommand = sCommand
    End Function
  7. TopicStarter Overlay

    Macromix Учаcтник

    • Участник
    Рег.:
    17.02.2009
    Сообщения:
    11
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    Спасибо
    А какая ваша программа ?
    Сегодня и ночью я нашел похожий код у ЛарссенаVb но пока не выходит разобраться,
    решил запустить FreeChess c моим движком. С начало FreeChess с треском разбомбил
    движок. Нехватило глубина. Но во второй партии получилось вот что:

    MACROMIX VB60(WHITE)

    [Event "Computer chess game"]
    [Site "CCDB9A9B8DFA4A2"]
    [Date "2009.02.18"]
    [Round "?"]
    [White "Admin"]
    [Black "FreeChess2uci"]
    [Result "*"]
    [ECO "C02"]
    [Opening "French"]
    [Time "09:01:57"]
    [Variation "Advance, 3...b6"]
    [WhiteElo "2400"]
    [TimeControl "0+5"]
    [Termination "normal"]
    [PlyCount "138"]
    [WhiteType "human"]
    [BlackType "program"]

    1. e4 e6 {(e7e6 Ng1f3 Bf8e7 d2d4 Ng8f6 e4e5 Nf6d5 c2c4 Nd5b4) -0.21/9 5} 2.
    d4 d5 {(d7d5 Bf1d3 d5xe4 Bd3xe4 f7f5 Be4f3 Bf8b4+ c2c3 Bb4e7) -0.16/9 5} 3.
    e5 Nc6 {(Nb8c6 c2c3 Bf8e7 Bf1e2 g7g5 Bc1d2 Bc8d7 Ng1f3) -0.15/8 5} 4. Nf3
    Bb4+ {(Bf8b4+ c2c3 Bb4a5 b2b4 Ba5b6 Bf1d3 Bc8d7 OO Ng8e7 Bc1b2) -0.64/9 5}
    5. c3 Ba5 {(Bb4a5 Bf1e2 Ng8e7 OO OO b2b4 Ba5b6 b4b5 Nc6a5 Bc1b2) -0.64/9 0}
    6. b4 Bb6 {(Ba5b6 Bf1e2 a7a5 b4xa5 Bb6xa5 OO Ng8e7 Bc1b2 OO) -0.15/10 5} 7.
    b5 Na5 {(Nc6a5 Bf1d3 Ng8e7 OO OO Qd1c2 h7h5 Nb1d2 Bc8d7 Bc1b2) -0.43/10 4}
    8. Bd3 Ne7 {(Ng8e7 OO Bc8d7 Nb1d2 OO Bc1b2 c7c5 d4xc5 Bb6xc5 Qd1e2)
    -0.43/10 0} 9. O-O Bd7 {(Bc8d7 Nb1d2 OO Bc1b2 c7c5 d4xc5 Bb6xc5 Qd1e2
    Kg8h8) -0.43/10 0} 10. Qc2 h5 {(h7h5 Bc1f4 OO Nb1d2 c7c6 a2a4 Qd8e8 Ra1b1
    Kg8h8) -0.27/9 4} 11. Bf4 c6 {(c7c6 a2a4 OO Nb1d2 Ra8c8 Kg1h1 c6xb5 a4xb5
    Na5c4) -0.27/9} 12. Na3 O-O {(OO Qc2e2 c6xb5 Na3xb5 Ra8c8 Ra1c1 Na5c4
    Nb5d6) -0.24/9 4} 13. Rad1 c5 {(c6c5 d4xc5 Bb6xc5 Na3b1 a7a6 a2a4 Qd8e8
    b5xa6 b7xa6) -0.01/9 5} 14. Ng5 g6 {(g7g6 d4xc5 Bb6xc5 Na3b1 a7a6 a2a4
    Qd8e8 b5xa6 b7xa6) 0.00/9 5} 15. Be2 cxd4 {(c5xd4 c3xd4 Ne7f5 Ng5f3 Qd8e7
    Qc2b2 Ra8c8 Bf4g5 Qe7e8) +0.32/10 5} 16. cxd4 Rc8 {(Ra8c8 Qc2a4 f7f6 e5xf6
    Rf8xf6 Bf4e5 Rf6f5 f2f4 Qd8f8) +0.32/10 0} 17. Qb2 Nc4 {(Na5c4 Qb2b3 Nc4a5
    Qb3b4 Ne7f5 Kg1h1 Qd8e8 f2f3 Kg8h8) +0.25/9 5} 18. Qb3 Nxa3 {(Nc4xa3 Qb3xa3
    Ne7f5 Ng5f3 f7f6 Be2d3 g6g5 Bd3xf5 e6xf5 Qa3b3 g5xf4) +0.25/9 0} 19. Qxa3
    Nf5 {(Ne7f5 Ng5f3 f7f6 Be2d3 g6g5 Bd3xf5 e6xf5 Qa3b3 g5xf4 Qb3xd5+ Kg8h8)
    +0.25/9 0} 20. Qb2 Bxd4 {(Bb6xd4 Rd1xd4 Nf5xd4 Qb2xd4 Rc8c2 Qd4d3 Rc2b2
    a2a4 Rb2b4 Ng5xf7) +0.79/10 4} 21. Rxd4 Nxd4 {(Nf5xd4 Qb2xd4 Rc8c2 Qd4d3
    Rc2b2 a2a4 Rb2b4 Ng5xf7 Kg8xf7 Bf4h6) +0.79/10 0} 22. Qxd4 Rc2 {(Rc8c2
    Qd4d3 Rc2xa2 Be2xh5 Qd8e7 Bh5g4 Rf8d8 g2g3 b7b6 Kg1h1) +0.79/10} 23. Bd3
    Rxa2 {(Rc2xa2 Ng5f3 Qd8a5 Rf1b1 b7b6 Bf4h6 Rf8e8 Kg1h1) +1.31/9 5} 24. Nf3
    Qa5 {(Qd8a5 Rf1b1 Rf8c8 h2h4 b7b6 Rb1b3 Ra2a1+ Kg1h2 Kg8h8 g2g3) +1.31/9 0}
    25. Rb1 b6 {(b7b6 Bf4h6 Rf8b8 Qd4f4 Rb8b7 Bd3xg6 Bd7xb5 Bg6xh5 a7a6)
    +1.31/9 0} 26. Kf1 Ra4 {(Ra2a4 Qd4e3 Ra4a1 Qe3e1 Qa5a4 g2g3 Ra1a3 Rb1b4
    Qa4a5) +1.97/9 5} 27. Qe3 Ra1 {(Ra4a1 Qe3e1 Ra1xb1 Qe1xb1 Qa5a4 Bf4h6 Rf8e8
    Kf1g1 Qa4g4 Qb1f1) +1.97/9 0} 28. Rxa1 Qxa1+ {(Qa5xa1+ Nf3e1 Qa1a4 Bf4h6
    Rf8c8 Qe3e2 Rc8c5 Bh6e3 d5d4 Bd3c2) +2.31/10 5} 29. Ne1 Qa4 {(Qa1a4 Bf4h6
    Rf8c8 Qe3g5 Kg8h7 Qg5d8 Kh7xh6 Qd8xd7 Rc8f8 Kf1g1 Kh6h7) +2.31/10 0} 30.
    Bh6 Rb8 {(Rf8b8 Qe3g5 Kg8h7 Qg5e7 Kh7xh6 Qe7xd7 Rb8f8 Qd7e7 Rf8c8 Kf1g1
    Qa4d1) +2.31/10 0} 31. Qe2 Rc8 {(Rb8c8 Qe2f3 Qa4h4 Kf1g1 Qh4e7 Kg1h1 Qe7b4
    Qf3e2 Qb4d4) +1.59/9 5} 32. Qf3 Qh4 {(Qa4h4 Qf3f6 Qh4xf6 e5xf6 e6e5 Ne1f3
    e5e4 Nf3e5 Bd7f5 Bd3e2) +1.59/9 0} 33. g3 Qe7 {(Qh4e7 Kf1g1 Rc8c3 Qf3e2
    Rc3a3 Kg1h1 Kg8h8 Ne1f3 Ra3a1+ Nf3e1) +1.63/9 5} 34. Be2 h4 {(h5h4 Kf1g1
    Qe7d8 Qf3g2 h4xg3 h2xg3 Qd8e8 Qg2f1 d5d4) +1.58/9 5} 35. gxh4 Qxh4 {(Qe7xh4
    Qf3f4 Qh4xf4 Bh6xf4 Rc8c3 Kf1g2 Rc3b3 Ne1f3 Bd7xb5 Nf3d4 Rb3b4) +1.84/11 5}
    36. Bf4 Rc5 {(Rc8c5 Ne1g2 Qh4h8 Qf3b3 f7f6 Qb3d3 Qh8g7 Qd3d4 Bd7xb5)
    +2.16/10 5} 37. Ng2 Qh8 {(Qh4h8 Qf3b3 f7f6 Qb3g3 Bd7e8 Kf1g1 f6xe5 Bf4xe5
    Rc5c1+ Be2f1 Qh8h5) +2.16/10 0} 38. Qb3 f6 {(f7f6 Qb3g3 f6xe5 Qg3xg6+ Kg8f8
    Bf4g5 Qh8g7 Qg6xg7+ Kf8xg7 Bg5e7 Rc5c1+ Ng2e1 Kg7f7 Be7d6) +2.16/10 0} 39.
    Qb2 fxe5 {(f6xe5 Bf4xe5 Qh8h7 Be5d6 Rc5c8 Kf1g1 Qh7f7 Bd6e5 Qf7f5) +1.88/10
    5} 40. Bxe5 Qh3 {(Qh8h3 Kf1g1 Qh3h7 Qb2d2 Qh7f7 Be5d4 Rc5c8 Kg1h1 Qf7f5)
    +1.88/10} 41. f3 Qh6 {(Qh3h6 Be5b8 Qh6c1+ Qb2xc1 Rc5xc1+ Kf1f2 Rc1c2 Kf2f1
    Rc2a2 Bb8e5 Kg8f7) +1.84/9 5} 42. Bd3 Rc1+ {(Rc5c1+ Ng2e1 Bd7e8 Qb2e2 Be8f7
    Be5b2 Rc1c8 Kf1g1 Qh6f4) +1.83/8 5} 43. Kf2 Rd1 {(Rc1d1 Be5f4 Qh6g7 Qb2xg7+
    Kg8xg7 Bf4e5+ Kg7f7 Kf2e2 Rd1g1 Ng2f4 g6g5 Be5d4) +1.57/9 4} 44. Ke2 Rh1
    {(Rd1h1 Be5g3 g6g5 Qb2e5 Rh1g1 Qe5b8+ Qh6f8 Bd3h7+ Kg8g7 Bg3e5+ Kg7f7)
    +1.71/9 5} 45. h4 Qh7 {(Qh6h7 Qb2a3 Qh7h5 Qa3d6 Rh1h3 Qd6b8+ Kg8f7 Be5g3
    Kf7f6) +1.72/8 5} 46. Qb4 Rg1 {(Rh1g1 Qb4g4 Qh7h5 Qg4xh5 g6xh5 Ng2f4 Kg8f7
    Nf4xh5 Rg1g2+ Ke2e3 Kf7e7) +0.69/9 5} 47. Ne3 Qh5 {(Qh7h5 Ne3g4 Rg1g2+
    Ke2f1 Rg2xg4 Qb4e7 Qh5xe5 Qe7d8+ Kg8h7 Qd8xd7+ Kh7h8) +0.23/8 5} 48. Qf4
    Be8 {(Bd7e8 Qf4f6 Qh5h7 h4h5 d5d4 Qf6xe6+ Qh7f7 Qe6xf7+ Be8xf7 h5xg6
    Bf7xg6) -0.94/8 5} 49. Qf6 Qh7 {(Qh5h7 Ne3g4 Rg1g2+ Ke2e3 Rg2xg4 Qf6xe6+
    Qh7f7 Qe6xf7+ Kg8xf7 f3xg4 Be8d7 g4g5 Kf7e6) -0.94/8 0} 50. h5 Qh6 {(Qh7h6
    Ke2f2 Rg1h1 Qf6xe6+ Be8f7 Qe6c8+ Qh6f8 Qc8xf8+ Kg8xf8 h5xg6 Bf7e6 g6g7+
    Kf8f7 Ne3f5 Be6xf5) -1.85/8 4} 51. Ng4 Rg2+ {(Rg1g2+ Ke2f1 Rg2xg4 f3xg4
    Qh6f8 Qf6xf8+ Kg8xf8 h5xg6 Be8d7 Be5b8 e6e5) -2.73/9 5} 52. Kf1 Rxg4
    {(Rg2xg4 f3xg4 Qh6f8 Qf6xf8+ Kg8xf8 h5xg6 Be8d7 Be5b8 e6e5 Bb8xa7 e5e4)
    -2.73/9 0} 53. Qxe6+ Bf7 {(Be8f7 Qe6xg4 Qh6c1+ Kf1e2 d5d4 Be5xd4 Qc1c7
    h5xg6 Bf7d5 g6g7 Bd5c4 Qg4g6 Bc4xd3+ Ke2xd3 Qc7d7) -4.31/10 5} 54. Qc8+ Qf8
    {(Qh6f8 Qc8xg4 Qf8e7 Be5f4 Qe7f6 Bd3xg6 Bf7xg6 Qg4xg6+ Qf6xg6 h5xg6 Kg8g7
    Bf4b8 Kg7xg6) -2.94/11 5} 55. Qxg4 Qe7 {(Qf8e7 f3f4 Bf7e8 Bd3xg6 Kg8f8
    Bg6xe8 Kf8xe8 Qg4g8+ Qe7f8 Qg8xd5 Qf8f5) -2.94/11 0} 56. f4 Qe6 {(Qe7e6
    Qg4h4 Kg8f8 h5xg6 Bf7xg6 Qh4h6+ Kf8e7 Bd3xg6 Ke7d7 Qh6g7+ Qe6e7 Bg6f7
    Kd7c8) -2.94/11 0} 57. Qxe6 Bxe6 {(Bf7xe6 h5xg6 Be6c8 f4f5 Bc8d7 Be5b8
    Kg8g7 Bb8xa7 Kg7f6 Ba7xb6 Bd7xf5) -4.62/12 5} 58. hxg6 d4 {(d5d4 Be5xd4
    Be6a2 Kf1f2 Ba2d5 g6g7 Bd5b3 Kf2e3 Bb3f7 Bd3e4 Bf7e8 Be4d5+ Be8f7 Bd5e4)
    -4.62/12 0} 59. f5 Bd5 {(Be6d5 g6g7 Bd5f7 Be5xd4 Bf7b3 Bd3e4 Kg8f7 f5f6
    Bb3c4+ Kf1e1 Kf7g8 Be4c6 Kg8f7) -5.65/11 5} 60. f6 Kf8 {(Kg8f8 g6g7+ Kf8g8
    Kf1e2 Bd5b3 Ke2f3 Bb3f7 Be5xd4 Bf7e6 Kf3e4 Kg8f7 Ke4e5 Be6g4) -5.72/11 4}
    61. Kf2 Bb3 {(Bd5b3 g6g7+ Kf8g8 Be5xd4 Bb3e6 Kf2f3 Be6d5+ Kf3f4 Bd5f7 Kf4e5
    Bf7e8 Bd3c4+ Be8f7 Bc4d3) -5.78/10 4} 62. Bb8 Kg8 {(Kf8g8 Bb8xa7 Bb3a2
    Kf2g3 Kg8f8 Ba7xb6 Ba2d5 Kg3f4 Kf8e8 f6f7+ Ke8f8 Bb6xd4 Kf8e7) -8.25/11 5}
    63. Bxa7 Be6 {(Bb3e6 f6f7+ Be6xf7 g6xf7+ Kg8xf7 Kf2f3 Kf7e6 Kf3e4 Ke6d7
    Ba7xb6 Kd7c8 Bb6xd4 Kc8b8 Bd4e5+ Kb8b7 Ke4d5 Kb7a8 b5b6) -8.25/11 0} 64.
    Bxb6 Bd5 {(Be6d5 f6f7+ Bd5xf7 g6xf7+ Kg8xf7 Bb6xd4 Kf7e6 b5b6 Ke6d5 Kf2e2
    Kd5xd4 b6b7 Kd4d5 b7b8Q Kd5e6 Qb8e8+ Ke6d6 Ke2e3) -13.05/9 5} 65. Bxd4 Kf8
    {(Kg8f8 g6g7+ Kf8e8 Bd3e4 Bd5c4 Be4g6+ Ke8d8 f6f7 Bc4xf7 Bg6xf7 Kd8d7 Kf2e3
    Kd7d8 Bd4f6+ Kd8c8) -17.35/9 5} 66. b6 Kg8 {(Kf8g8 b6b7 Bd5xb7 f6f7+ Kg8f8
    Bd4c5+ Kf8g7 f7f8Q+ Bb7d5) -M4/6 4} 67. b7 Bxb7 {(Bd5xb7 f6f7+ Kg8f8 Bd4c5+
    Kf8g7 f7f8Q+ Bb7d5) -M4/11 0} 68. f7+ Kf8 {(Kg8f8 Bd4c5+ Kf8g7 f7f8Q+
    Bb7d5) -M4/11 0 Black resigns} 69. Bc5+ Kg7 {(Kf8g7 f7f8Q+ Bb7d5) -M1/2 0
    Black resigns} *

    Что за чудеса не пойму
  8. bankuss Александр

    • Заслуженный
    • Участник
    • Старожил
    Рег.:
    24.05.2006
    Сообщения:
    1.084
    Симпатии:
    38
    Репутация:
    6
    Оффлайн
    alchess мое творение. :) пока заброшенное. не до программирования в последнее время. а код да, в "ларсене" такой. я его испытывал в VB - все работало. в freebasic все проще: там обычные print и input прекрасно работют со стандарным потоком. но конечно можно и через API сделать.
    так что советую скачать freebasic и перекомпилировать программу. плюсы: будет быстрей работать, не будет требовать внешних библиотек.
    для удобства работы в бейсике скачай редактор Fbedit.
  9. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.492
    Симпатии:
    3.124
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Опыт показывает, что для игры по протоколу Winboard сканирование ввода во время думания не обязательно. Достаточно реализовать команду ping, и оболочка прекрасно всё понимает. Хотя, конечно, с polling input удобнее - можно полноценный режим анализа сделать, и команду "move now".

    В UCI - да, там polling input требуется по спецификации протокола.
  10. TopicStarter Overlay

    Macromix Учаcтник

    • Участник
    Рег.:
    17.02.2009
    Сообщения:
    11
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    Да, этот код работает. Спасибо
    Но непоняток....

    Какая последовательность действий должна быть после 'go'
    в протоколе указано,что надо получить еще команды для
    инициализации, ponder,movetime.Меня интересует как их правильно
    считать и установить после 'go'.

    Если запущен обычный перебор,кроме stop, надо контролировать время? или
    это делает UCI и отправляет stop?
    Решение о возможности и запуске перебора во время обдумывания
    игрока(UCI),оно где принимается? После каких действий.
    Выход из этого режима принимается тогда, и только тогда, когда получена
    команда 'ponderhit?'. А что после нее делать

    Можно вообще, сложить какую-ни будь ЗАМКНУТУЮ прозрачную логику
    что после чего следует.
    Ход из UCI оппонента это 'position' или другое?


    Спасибо
  11. TopicStarter Overlay

    Macromix Учаcтник

    • Участник
    Рег.:
    17.02.2009
    Сообщения:
    11
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    Всех приветствую
    Возможно у вас имеется еще одна подсказка.
    Движок заработал в UCI но ponder не могу прикрутить.

    После команды,что я могу включать ponder UCI
    присылает: "setoption name Ponder value true"
    отвечаю: sendcommand "readyok\n" (?)

    После go movetime
    '....Время и запускаю движок
    .....Ход переходит к оппоненту

    А где команда ponder?
    Как ее можно получить

    Очень спасибо
  12. bankuss Александр

    • Заслуженный
    • Участник
    • Старожил
    Рег.:
    24.05.2006
    Сообщения:
    1.084
    Симпатии:
    38
    Репутация:
    6
    Оффлайн
    причем здесь readyok ?
    стандарт UCI есть?

    ISREADY
    Команда используется для синхронизации движка и оболочки.
    После ее посылки оболочка ждет готовность движка.
    Этой команде нужно всегда отвечать "readyok".

    SETIPTION NAME <id> [value <x>]
    Передается движку, когда пользователь хочет изменить внутренние настройки движка.

    PONDERHIT
    Пользователь делает ожидаемый ход.
  13. TopicStarter Overlay

    Macromix Учаcтник

    • Участник
    Рег.:
    17.02.2009
    Сообщения:
    11
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    А насчет публикации
    Программа не играла официально c UCI.
    Для начала хотя бы реализовать версию для проверки,которую можно просто загрузить и посмотреть.
    Если это будет интересно,то можно и опубликовать
    Я вообще не мог предположить что бейсик может побеждать Elo 2400
    У меня в поиске есть контроль интерфейса для хода игрока
    что-то



    Если Loop=32000 then
    Do events
    Loop=0
    end

    Do events вроде медленный, в Арене он не нужен. Значит должен
    работать быстрее.
    Что касается PB, то некотрые DLL могут работать медленнее sub (VB), надо просто
    тестировать конкретно.

    Спасибо
  14. TopicStarter Overlay

    Macromix Учаcтник

    • Участник
    Рег.:
    17.02.2009
    Сообщения:
    11
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    ponder
    Начать исследование в режиме ожидания хода противника. В этом случае последний ход, записанный в команде "position" должен рассматриваться, как вероятный ход противника, над которым следует подумать.
    В принципе, движок не обязан анализировать только этот ход. Однако если он будет рассматривать и другие ходы, то ему не следует их подавать на вывод, чтобы не сбивать с толку GUI.
    Если в режиме ожидания хода противника последует команда "ponderhit", это будет означать, что противник сделал тот ход, который и предполагалось.
    Движок не должен выходить из этого режима, даже если он видит мат.


    Это информация по ponder, указано что она следует в "go"
    Мне все равно что посылать, чтобы запустить второй режим нужна э (я так понял эта команда),
    а ее не выходит обнаружить
    Спасибо
  15. ChessTerminator75 Андрей

    • Участник
    Рег.:
    22.05.2007
    Сообщения:
    121
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Челябинск
    Оффлайн
    Как можно написать движок с рейтингом больше 2400 и при этом застрять на UCI – протоколе?
    "Что за чудеса не пойму" :)
  16. TopicStarter Overlay

    Macromix Учаcтник

    • Участник
    Рег.:
    17.02.2009
    Сообщения:
    11
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    О я вижу уже С+ специалисты появились
    Что-же вы специалисты маленько мне голову заморочили.

    Ведь скорее всего ваши программы с VB потому и проигрывают
    что в этом методе который, вы дали, после команды (отправить
    лучший ход) программа останавливается и ждет ответа от GUI.
    Какой же тут можно запустить (непрерывный поиск)

    А я думаю, когда же GUI пришлет команду его запустить.
    После SendCommand "bestmove...Все приехали.
    Нужен метод или параметр в функциях,который не блокирует
    выполнение последующих инструкций.
    А программы с рейтингом 2400 прекрасно были
    биты VB60 c DoEvrnts выше я одну такую партию прислал
    Лучше надо С+ изучать
  17. syrdon Учаcтник

    • Участник
    Рег.:
    21.05.2007
    Сообщения:
    78
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    А не легче ли на VB.NET переехать?
    Закончатся проблемы со стандартными потоками и некоторыми дебильными особенностями синтакса VB6.

    Про bestmove.
    Если речь об UCI, то такова его холопья доля. Он обязан ждать "go [ponder]", иначе на одной машине, Ваш высокоэффективный VB-код отжирает чужое время.

    (надел пенсне, покашлял) Так, что, молодой человек доделайте UCI, а потом уже, после машинных матчей говорите об ЭЛО.
  18. bankuss Александр

    • Заслуженный
    • Участник
    • Старожил
    Рег.:
    24.05.2006
    Сообщения:
    1.084
    Симпатии:
    38
    Репутация:
    6
    Оффлайн
    doevents в VB нужно делать обязательно, иначе все ресурсы процессора на 1 программу пойдут. поэтому все делается в цикле опроса консоли. код который я тут приводил, прекрасно работает. в чем же проблема?
    в FB с этим немного легче, там input ждет команду с потока, не тормозя комп.
  19. syrdon Учаcтник

    • Участник
    Рег.:
    21.05.2007
    Сообщения:
    78
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    Секунду, я что-то не догоняю.
    Зачем DoEvents, если у программы НЕТ очереди сообщений?
    DoEvents отрабатывает эту самую очередь и всё.
  20. bankuss Александр

    • Заслуженный
    • Участник
    • Старожил
    Рег.:
    24.05.2006
    Сообщения:
    1.084
    Симпатии:
    38
    Репутация:
    6
    Оффлайн
    syrdon если в VB сделать цикл типа
    Do
    ...
    опрос консоли
    ...
    Loop

    то загрузка проца близка к 100%
    DoEvents дает проге "выскочить" из цикла и обработать другие потоки системы.
  21. syrdon Учаcтник

    • Участник
    Рег.:
    21.05.2007
    Сообщения:
    78
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    Стоп. DoEvents обрабатывает СВОИ очереди, которых у консольного приложения нет.
    При этом слетает с выполнения свой поток, как я разумею.
    Т.е. с тем же успехом можно писать Sleep(0);

    Другие потоки системы, другие процессы - их половые трудности. Добро пожаловать в XXI век.

    Наша цель здесь именно загрузка процессора.
    100% - это хорошо. Оболочка нашего героя и запустит с пониженным приоритетом, чтобы и её досталось чуть-чуть, много и не надо.

    Опять таки я про консольку.
    Однопоточное шахматное приложение на VB с GUI - это тьма египетская. Там да, но зачем, если можно пересесть на VB.NET?
  22. bankuss Александр

    • Заслуженный
    • Участник
    • Старожил
    Рег.:
    24.05.2006
    Сообщения:
    1.084
    Симпатии:
    38
    Репутация:
    6
    Оффлайн
    Опять таки я про консольку. - нет в VB 6 консолки! :) приходится делать гуи + апи вызовы.

    поэтому я и предлагаю человеку FB или можно тот же Vb.net - там с консолью никаких проблем.
  23. bankuss Александр

    • Заслуженный
    • Участник
    • Старожил
    Рег.:
    24.05.2006
    Сообщения:
    1.084
    Симпатии:
    38
    Репутация:
    6
    Оффлайн
    DoEvents обрабатывает СВОИ очереди, которых у консольного приложения нет. - насколько я помню, doevents обрабатывает как раз очереди системы, а не свои.
  24. syrdon Учаcтник

    • Участник
    Рег.:
    21.05.2007
    Сообщения:
    78
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    Стоп!
    Я даже допускаю, что в Win 3.0 как-то так и было, но не сейчас.

    У тебя там есть получение стандартных потоков в Sub Main(). Чего уж боле? Консоля, однако!

    Чтобы не быть голословным, лезем в документацию. У меня только VS2008.
    А там:
    [q]Processes all Windows messages currently in the message queue.[/q]
    [q]Unlike Visual Basic 6.0, the DoEvents method does not call the Thread::Sleep method.[/q]

    Ты не можешь заставить другие приложения обрабатывать свои сообщения. Это их дело. Там своя очередь сообщений.

    Ты просто неявным вызовом Sleep великодушно даешь другим процессам время. В том числе и на их очереди, если им нужно.

    А зачем? Грузи проц - это твоя прямая задача.
  25. bankuss Александр

    • Заслуженный
    • Участник
    • Старожил
    Рег.:
    24.05.2006
    Сообщения:
    1.084
    Симпатии:
    38
    Репутация:
    6
    Оффлайн
    syrdon нормальный пустой цикл не должен отжирать 100% ресурсов проца! или я неправильный программист? :)
    да и кстати команды Sleep в VB6 нет.

    вот выдержка с какого-то сайта: "Здесь нужно обратить внимание на использование функции DoEvents, которая позволяет производить другие процессы параллельно с выполнением текущего цикла. (DoEvents передает управление операционной системе, а сама функция возвращает число открытых форм в данном VB-приложении.)"

    При вставке этой команды загрузка проца 0-1%, как и положено пустому (почти) циклу.
  26. syrdon Учаcтник

    • Участник
    Рег.:
    21.05.2007
    Сообщения:
    78
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    Он же не пустой, он UCI парсит, шахматки считает. Зачем пустой?

    Посмотрел код внимательно.

    А-а-аа, :lol: только до меня допёрло. У тебя там поллинг... Просто я бы написал в главной блокирующий Read, а уже в поиске морочился бы проверкой. И Flush в SendCommand, вроде, надобно.

    Или вообще выдавил бы поиск в отдельный поток и делал бы только блокирующее чтение.

    Sleep, может, в VB и нет, но делает DoEvents именно это. Спыть. Отдает свой остаток времени. "позволяет производить другие процессы ". Заменить на Sleep(0) тоже можно - эффект тот же.

    Это я, считай, к терминологии и чужим очередям прикопался. :D.
    Обожаю такой оффтоп по мелочи. Приятного вечера.
  27. bankuss Александр

    • Заслуженный
    • Участник
    • Старожил
    Рег.:
    24.05.2006
    Сообщения:
    1.084
    Симпатии:
    38
    Репутация:
    6
    Оффлайн
    это и есть 0-1% загрузки. шахматки считает совсем другой цикл :lol:
  28. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    Вообще-то отбор процессорного времени при отключенном пондере и ходе соперника - это дисквалификация...
  29. syrdon Учаcтник

    • Участник
    Рег.:
    21.05.2007
    Сообщения:
    78
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    [q]Вообще-то отбор процессорного времени при отключенном пондере и ходе соперника - это дисквалификация...[/q]
    Обчитался в коде. Смотри выше.
    У нас тут завершённый терминологический спор.

    Я всё не мог понять, почему так плохо при анализе грузить проц. :)
  30. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.492
    Симпатии:
    3.124
    Репутация:
    95
    Адрес:
    Москва
    Оффлайн
    Возможно, я слегка потерял нить дискуссии, но вот такой простой вопрос: насколько я понимаю, из VB можно вызвать любую функцию Win32 API. Что мешает сделать на функциях GetStdHandle / PeekNamedPipe такую же конструкцию, как в Греке и миллионе других программ? Будет стандартный однопоточный проверяльщик ввода...

    Код:
    void init_input()
    {
        DWORD dw;
        input_handle = GetStdHandle(STD_INPUT_HANDLE);
        is_pipe = !GetConsoleMode(input_handle, &dw);
    
        if (is_pipe)
            g_uci = 1;
    
        setbuf(stdout, NULL);
    }
    ////////////////////////////////////////////////////////////////////////////////
    
    int input_available()
    {
        DWORD nchars;
    
        /* When using Standard C input functions, also check if there
        is anything in the buffer. After a call to such functions,
        the input waiting in the pipe will be copied to the buffer,
        and the call to PeekNamedPipe can indicate no input available.
        Setting stdin to unbuffered was not enough, IIRC */
    
        if (stdin->_cnt > 0)
            return 1;
    
        if (is_pipe)
        {
            /* When running under a GUI, you will end here. */
    
            if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
    
                /* Something went wrong. Probably the parent program exited.
                    Could call exit() here. Returning 1 will make the next call
                    to the input function return EOF, where this should be
                    catched then. */
    
                return 1;
    
            return (nchars != 0);
        }
        else
            return _kbhit() != 0; /* In "text-mode" without GUI */
    }
    ////////////////////////////////////////////////////////////////////////////////
    Какая из приведённых строчек не переводится на VB один-в-один?
    Или у программ на VB нет stdin? (готов предположить и такое, никогда ничего серьёзного на VB не писал) :)
  31. NS Нефёдов Сергей

    • Заслуженный
    • Ветеран
    • Старожил
    Рег.:
    02.05.2006
    Сообщения:
    6.811
    Симпатии:
    96
    Репутация:
    3
    Адрес:
    Санкт-Петербург
    Оффлайн
    У меня в Анечке код анализа (выбора хода) разбавлен sleep-ами, так как на медленных компах возникали проблемы - система не отвечала.
  32. syrdon Учаcтник

    • Участник
    Рег.:
    21.05.2007
    Сообщения:
    78
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    "Однопоточное шахматное приложение на VB с GUI".
    Это я про GUI. У автора исходного поста, наверное, что-то такое. CreateThread нельзя толком вызвать. Можно исхитриться и написать C-обёртку, но это уже тонкий изврат.

    Sleep внутри анализа представляю только в каком-нибудь пустом цикле. Скажем, ponder нашел мат в два хода, а выйти нельзя. Вот дурью и мается.
  33. bankuss Александр

    • Заслуженный
    • Участник
    • Старожил
    Рег.:
    24.05.2006
    Сообщения:
    1.084
    Симпатии:
    38
    Репутация:
    6
    Оффлайн
    вот поэтому VB6 не годится для серьезных программ. ну и скорость кода невысокая.
    вот это куда круче: http://freebasic.net/ только х64 еще нет прямой поддержки.
  34. ChessTerminator75 Андрей

    • Участник
    Рег.:
    22.05.2007
    Сообщения:
    121
    Симпатии:
    0
    Репутация:
    0
    Адрес:
    Челябинск
    Оффлайн
    Совершенно правильно! С++ просто неисчерпаем.

    В этой короткой дискуссии по одной проблеме тем не менее очень точно подмечена эволюция VB программистов.
    В начале программирование в VB идет на уровне визуального т.е. схватил компонент перетащил на форму написал обработчик из трех строчек. Это как бы и не программирование но программки работают.
    Потом объем кода обработчиков растет и со временем завязка на формы начинает напрягать и количество модулей стремительно умножается.
    Дальше когда программы становятся более менее серьезные приходится постоянно работать с Win API а там как ни крути сплошной Си. Получается парадоксальная ситуация. Невозможно писать профессиональные программы на VB не зная Си.
    Так что Си обертка в VB программе это не "тонкий изврат" а признак профессионала. :)

    Через некоторое время понимаешь что проще сразу писать на Си.
    Такая вот диалектика получается начинаешь с VB а заканчиваешь Си :)

    Есть класс офисных задач для которых VB просто идеален но я бы не стал в них включать шахматное движкописательство.
  35. TopicStarter Overlay

    Macromix Учаcтник

    • Участник
    Рег.:
    17.02.2009
    Сообщения:
    11
    Симпатии:
    0
    Репутация:
    0
    Оффлайн
    Спасибо
    Заработало.

    Проблема была в жучке,который я забыл,
    просто было условие в коде


    Оператор ...Sendbest

    If ....

    '...Пусто

    Попадало сюда а смотрел на else внизу
    Получалось, после команды не было выполнения последующих
    инструкций и возможности запустить непрерывный поиск.
    Отсюда все непонятки

    Так что код ваш работает, поэтому, насчет кода я не прав
    приношу ИЗВИНЕНИЯ.
    У меня ошибок бывает много

    else
    Оператор Sendbest ..........
    end if

    А интересует еще вопрос,если можно, насчет
    немедленного ответа движка. Некоторые программы умеют
    отвечать таким ходом.
    Какая последовательность логики при принятии такого решения?
    т.е,что гарантирует,что перебор не требуется.

    Спасибо

Поделиться этой страницей