Joker IT

From Chessprogramming wiki
Jump to: navigation, search

Home * Engines * Joker IT

A Joker card [1]

Joker,
a Chess Engine Communication Protocol compliant chess engine by Manlio Morini, developed from 1998 until 2001, written in C++ with some conditional x86 inline assembly concerning population count and bitscan of bitboards. Joker runs under BSD, Linux and Windows, and was in 2017 published on GitHub as open source as "historical" artifact, under the terms of the MIT license [2].

Description

During its lifetime, around Version 0.6.7 in 1999, Joker used MTD(f) along with ETC [3], but finally stuck with PVS and aspiration [4]. It initially used the 0x88 board representation but evolved to bitboards. Quiet move generation of sliding pieces is still done with a nested loop over directions with pre-increments of origin until target squares are empty [5].

  // Mosse di Alfiere, Torre, Donna.
  for (pezzo pz(alfiere); pz <= donna; ++pz) {
    bb = mappa(c,pz);
    while (bb) {
      const posizione pos(bb.firstone());
      for (const direzione *d = dir[pz]; *d; d++) {
        for (posizione arrivo(pos + *d);
             !arrivo.fuori() && libere[arrivo];
             arrivo += *d) {
          lm->push_back(pos,arrivo,pz,vuoto);
        }
      }
      bb.elimina(pos);
    }
  }

However, the more time critical capture generation is implemented more in the set-wise bitboard fashion similar to the Tinker approach, traversing the intersection of sliding piece attacks on the otherwise empty board with opponent pieces, and looking whether the squares inbetween the sliding origin and potential capture target are empty .

  // Catture di Alfiere, Torre, Donna.
  for (pezzo pz(alfiere); pz <= donna; ++pz) {
    bb = mappa(c,pz);
    while (bb) {
      const posizione pos(bb.firstone());
      const bitboard *const a = bitboard::raggio[pos];
      bitboard prede(mosse[pz][pos] & nemici);
      while (prede) {
        const posizione p_preda(prede.firstone());
        if ( !(a[p_preda] & pezzi) ) {
          const pezzo preda(t_preda(!c,p_preda));
          lm->push_back(pos,p_preda,pz,preda,cattura);
        }
        prede.elimina(p_preda);
      }
      bb.elimina(pos);
    }
  }

Features

Board Representation

Search

Evaluation

Misc

Namesake

See also

Forum Posts

External Links

Chess Engine

Misc

References

Up one Level