Шахматы на JavaScript

Тема в разделе "Машинное отделение", создана пользователем ProstoTak, 18 янв 2011.

  1. TopicStarter Overlay

    ProstoTak Ветеран

    • Ветеран
    Рег.:
    11.02.2006
    Сообщения:
    5.487
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Народ, а что если забульбенить именно такой вариант? Поскольку скорость будет сильно ограничена всё усилие мысли придётся направить на оценочную функцию и оптимизацию перебора. Да и у людей будет шанс с такими движками потягаться. И очень легко создать сайт через который можно такими движками играть. Просто в отдельные фреймы загружаешь по движку и пусть рубятся.
  2. krey Михаил Кройтор

    • Команда форума
    Рег.:
    10.04.2006
    Сообщения:
    3.693
    Симпатии:
    41
    Репутация:
    1
    Адрес:
    Кишинев
    Оффлайн
    есть такие. дай на поиск по сурсфорж.
    у меня вообще другая идея в муках - написать решательскую программу на js. впрочем, можно попробовать просто перенести опенсурсные.
  3. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.250
    Симпатии:
    2.559
    Репутация:
    90
    Адрес:
    Москва
    Оффлайн
    Я правильно понимаю, что от обычной игровой она будет отличаться только умением решать кооперативные и обратные маты?
  4. krey Михаил Кройтор

    • Команда форума
    Рег.:
    10.04.2006
    Сообщения:
    3.693
    Симпатии:
    41
    Репутация:
    1
    Адрес:
    Кишинев
    Оффлайн
    в общем правильно. в решении задач на прямой мат она не должна отсекать дерево перебора. да и вообще, должно строится полное дерево на определённую глубину. плюс некоторые решательские тонкости (касательно сортировок ходов).
  5. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.250
    Симпатии:
    2.559
    Репутация:
    90
    Адрес:
    Москва
    Оффлайн
    Зато оценку можно очень простую сделать, даже без материала :)
  6. krey Михаил Кройтор

    • Команда форума
    Рег.:
    10.04.2006
    Сообщения:
    3.693
    Симпатии:
    41
    Репутация:
    1
    Адрес:
    Кишинев
    Оффлайн
    вот-вот :)
  7. TopicStarter Overlay

    ProstoTak Ветеран

    • Ветеран
    Рег.:
    11.02.2006
    Сообщения:
    5.487
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Может и есть да не совсем такие. Я говорю о наших собственных движках. Я могу сделать сайт на который каждый желающий сможет выложить свой движок на JS. А потом также каждый желающий сможет стравить любые движки между собой прямо через этот сайт. Можно и турниры будет организовывать между движками. Тоесть сделать эдакий полигон для JS движков нашего собственного производства.
  8. krey Михаил Кройтор

    • Команда форума
    Рег.:
    10.04.2006
    Сообщения:
    3.693
    Симпатии:
    41
    Репутация:
    1
    Адрес:
    Кишинев
    Оффлайн
    Вспомнилась хорошая тема. Предлагаю разработать UCI.JS для будущих баталий. и, соответственно, площадку для этих самых баталий.
  9. TopicStarter Overlay

    ProstoTak Ветеран

    • Ветеран
    Рег.:
    11.02.2006
    Сообщения:
    5.487
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    Жаль я с UCI не работал. Нада Пуха привлечь. :)
  10. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.250
    Симпатии:
    2.559
    Репутация:
    90
    Адрес:
    Москва
    Оффлайн
    Основные команды протокола UCI (то, что в Греке есть):

    Код:
        ON_CMD (go,        2, OnGo(s))
        ON_CMD (setoption, 8, OnSetoption(s))
        ON_CMD (uci,       3, OnUCI())
    
    На удивление немного :)
  11. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.250
    Симпатии:
    2.559
    Репутация:
    90
    Адрес:
    Москва
    Оффлайн
    Код:
    void OnGo(char* s)
    {
      char *token = strtok(s, " ");
      while (token)
      {
        if (!strcmp(token, "infinite"))
        {
          g_search.SetLimits(0, 0, 0, 0, 0);
          break;
        }
        else if(!strcmp(token, "nodes"))
        {
          token = strtok(NULL, " ");
          if (token)
            g_search.SetLimits(0, 0, atol(token), 0, 0);
        }
        else if(!strcmp(token, "movetime"))
        {
          token = strtok(NULL, " ");
          if (token)
            g_search.SetLimits(atol(token), 0, 0, atol(token), atol(token));
        }
        else if(!strcmp(token, "wtime") && g_pos.Side() == WHITE)
        {
          token = strtok(NULL, " ");
          if (token)
            SetTimeLimits(atoi(token));
        }
        else if(!strcmp(token, "btime") && g_pos.Side() == BLACK)
        {
          token = strtok(NULL, " ");
          if (token)
            SetTimeLimits(atoi(token));
        }
        else if(!strcmp(token, "winc") && g_pos.Side() == WHITE)
        {
          // in UCI time comes in milliseconds
          token = strtok(NULL, " ");
          if (token)
            g_search.SetIncrement(atoi(token));
        }
        else if(!strcmp(token, "binc") && g_pos.Side() == BLACK)
        {
          // in UCI time comes in milliseconds
          token = strtok(NULL, " ");
          if (token)
            g_search.SetIncrement(atoi(token));
        }
        token = strtok(NULL, " ");
      }
    
      g_force = false;
      g_search.StartThinking(g_pos);
    }
    ////////////////////////////////////////////////////////////////////////////////
    
  12. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.250
    Симпатии:
    2.559
    Репутация:
    90
    Адрес:
    Москва
    Оффлайн
    Код:
    void OnSetoption(char* s)
    {
      char *token = strtok(s, " ");
    
      token = strtok(NULL, " ");
      token = strtok(NULL, " ");
      if (!token) return;
    
      if (!strcmp(token, "MultiPV"))
      {
        token = strtok(NULL, " ");
        token = strtok(NULL, " ");
        if (token) g_search.SetMultiPV(atoi(token));
      }
      else if (!strcmp(token, "Hash"))
      {
        token = strtok(NULL, " ");
        token = strtok(NULL, " ");
        if (token) g_search.SetHashMB(atof(token));
      }
      else if (!strcmp(token, "UCI_LimitStrength"))
      {
        token = strtok(NULL, " ");
        token = strtok(NULL, " ");
        if (token)
        {
          if (!strcmp(token, "false") || !strcmp(token, "0"))
            g_search.LimitStrength(false);
          else
            g_search.LimitStrength(true);
        }
      }
      else if (!strcmp(token, "UCI_Elo"))
      {
        token = strtok(NULL, " ");
        token = strtok(NULL, " ");
        if (token) g_search.SetElo(atoi(token));
      }
      else if (!strcmp(token, "LimitKNPS"))
      {
        token = strtok(NULL, " ");
        token = strtok(NULL, " ");
        if (token)
        {
          int knps = atoi(token);
          if (knps != 9999)
          {
            g_search.LimitStrength(true);
            g_search.SetNPS(1000 * knps);
          }
        }
      }
    }
    ////////////////////////////////////////////////////////////////////////////////
    
  13. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.250
    Симпатии:
    2.559
    Репутация:
    90
    Адрес:
    Москва
    Оффлайн
    Код:
    void OnUCI()
    {
      g_protocol = UCI;
    
      out("id name ");
      out(VERSION);
      out("\n");
      out("id author Vladimir Medvedev\n");
      out("option name Hash type spin default 1 min 1 max 1024\n");
      out("option name MultiPV type spin default 1 min 1 max 64\n");
      out("option name UCI_LimitStrength type check default false\n");
      out("option name UCI_Elo type spin default 2100 min 1200 max 2400\n");
      out("option name LimitKNPS type spin default 9999 min 1 max 9999\n");
      out("uciok\n");
    }
    ////////////////////////////////////////////////////////////////////////////////
    
  14. WinPooh В.М.

    • Команда форума
    Рег.:
    13.02.2006
    Сообщения:
    9.250
    Симпатии:
    2.559
    Репутация:
    90
    Адрес:
    Москва
    Оффлайн
    Собственно, это весь UCI-код из Греки.
  15. krey Михаил Кройтор

    • Команда форума
    Рег.:
    10.04.2006
    Сообщения:
    3.693
    Симпатии:
    41
    Репутация:
    1
    Адрес:
    Кишинев
    Оффлайн
    Вижу, что UCI, как таковой, и не нужен.
    предлагаю следующий базовый объект для движков:
    Код:
    function AbstractChessEngine(){
        this.engineName = "Abstract Chess Engine";
        this.engineVersion = "1.0";
        this.author = "Cool Author";
        this.fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w - qQkK 0 1";
        this.move = "white"; // or black
        this.ply = 4;
        this.timePerMove = 1000;
        this.timePerGame = 60*1000;
        this.mode = "ply"; // ply, permove or pergame
        this.currentTime = 0;
        
        // interface
        this.Init = function(configGame){  // set game mode and other configs
            if(configGame.mode) this.mode = configGame.mode;
            if(configGame.move) this.move = configGame.move; // engine's side
            if(configGame.fen) this.fen = configGame.fen; // set up initial position, chess960(?!)
            if(configGame.timePerMove) this.timePerMove = configGame.timePerMove;
            if(configGame.timePerGame) this.timePerGame = configGame.timePerGame;
        }
        
        this.MakeMove = function(fen){} // obtain fen, return fen
    }
  16. krey Михаил Кройтор

    • Команда форума
    Рег.:
    10.04.2006
    Сообщения:
    3.693
    Симпатии:
    41
    Репутация:
    1
    Адрес:
    Кишинев
    Оффлайн
    начал переводить TSCP в javascript. Всё сделано, осталось исправить ряд ошибок:
    1) проблемы с совместимостью типов
    2) указанные TODO
    http://kasparovchess.crestbook.com/krey/WebArena.zip
    Может, кто хочет посмотреть и помочь...
    Один из TODO занимателен: используется сохранение состояния программы и востановление этого состояния с помощью setjmp/longjmp. Можно, конечно, переписать код таким образом, что обойдется всё бриками, но иинтересно, есть ли решение покрасивей. В принципе, на это можно пока не обращать внимание, так как сохранение состояния используется при игре на время, а по умолчанию стоит фиксированная глубина перебора.
  17. krey Михаил Кройтор

    • Команда форума
    Рег.:
    10.04.2006
    Сообщения:
    3.693
    Симпатии:
    41
    Репутация:
    1
    Адрес:
    Кишинев
    Оффлайн
    Торможу - ткните носом, где именно. Пытаюсь, при резком скачке оценочной функции (то есть при взятии короля) обрубать дальнейший перебор. Я попробовал вставить в первый иф проверку на этот скачок, но как сделать откат назад - не доходит
    Код:
    function minimax(depth){
        var _tmp, moveIndex = 0;
        var max = -INFINITY;
        var moveList = [];
        if(depth <= 0 ){ // забрали короля?
            // 
            return eval();    
        }
        if(side_move*eval()>INFINITY/2){ // забрали короля
            // откат на 2 хода назад.  
        }
        moveList = genMoves();
        
        while(moveIndex < moveList.length){
            makeMove(moveList[moveIndex]);
            
            _tmp = -minimax(depth-1);
            unMakeMove(moveList[moveIndex]);
    
            if(_tmp > max){
                max = _tmp;
            }
            moveIndex++;
        }
        return max;
    }
  18. TopicStarter Overlay

    ProstoTak Ветеран

    • Ветеран
    Рег.:
    11.02.2006
    Сообщения:
    5.487
    Симпатии:
    123
    Репутация:
    1
    Оффлайн
    А вот интересно шахматы на JS на современном ПК будут играть круче той самой Каиссы на том её железе? Как считаете?

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