Playing against people
Chess without a board is not as much fun as chess with an actual board.
If we really want to claim that dbacl can play chess, then we need to
make it work with something like
GNU XBoard so it
can play against people. Before we go on, you'll have to make sure
this program is installed. It comes standard with most GNU/Linux distributions,
for example on Debian you can type
as root:
% apt-get install xboard
A real chess engine that works with XBoard must implement the
Chess Engine
Communication Protocol. This is a bit tedious, so I prepared one earlier.
Save it as a file named dce-basic.sh in your chess
directory, or type it yourself from the listing below.
Note that I've just created enough code to play a simple game
without undo, force, switch sides or board setup. In other words, the only
thing you can do is start a new game, and play the moves, and dbacl must play Black.
% cat > dce-basic.sh
#!/bin/bash
# This script functions as an incomplete chess engine for XBoard.
DBACL=./dbacl/src/dbacl
SAN=./SAN/SAN_SRC/san
TMP=.
DCE=dce-basic
SANOK="no"
PGN="$TMP/$DCE.current.pgn"
GAMELINE="$TMP/$DCE.current.gameline"
SCORES="$TMP/$DCE.current.scores"
ENGINEMOVE="$TMP/$DCE.current.emove"
SANOUT="$TMP/$DCE.current.stdout"
SANERR="$TMP/$DCE.current.stderr"
SIDE="black"
MOVENOW="no"
CATFILE="./BlackWinDraw"
trap "" SIGTERM
trap "" SIGINT
function exec_san() {
rm -rf $PGN.new $SANOUT $SANERR
echo -ne "svop namd nabd napr\nlfer $PGN\n$1\nsfer $PGN.new" \
| "$SAN" > "$SANOUT" 2> "$SANERR"
if grep Error "$SANOUT" > /dev/null; then
echo "Error (illegal move): $cmd"
return 1
else
mv $PGN.new $PGN
fi
return 0
}
function do_engine_move() {
if exec_san "enum 1"; then
# legal moves are in $SANOUT
cat "$PGN" \
| sed -e 's/\r//g' \
| sed -e :a -e '$!N;s/\n\([a-hKQNBRO0-9]\)/ \1/;ta' -e 'P;D' \
| sed -e 's/^ *//' \
| grep '^1\.' \
| sed 's/[0-9]*\.[ ]*//g' \
| sed 's/ \*.*$//' \
> "$GAMELINE"
# make all completions and let dbacl decide
cat "$SANOUT" \
| grep '.* : 1$' \
| cut -f 1 -d ' ' \
| while read move; do
echo "`cat $GAMELINE` $move"
done \
| "$DBACL" -n -c "$CATFILE" -f 1 \
> "$SCORES"
if [ `cat "$SCORES"| wc -l` = "0" ]; then
# no moves left, game over!
# the gameline contains the result
echo "`cat $GAMELINE | sed 's/^.* //'` {Play again?}"
return 0
else
# pick best scoring move
cat "$SCORES" \
| sort -k 2 -n \
| head -1 \
| sed -e 's/^.* //' \
> "$ENGINEMOVE"
if exec_san "`cat $ENGINEMOVE`"; then
echo "move `cat $ENGINEMOVE`"
return 0
fi
fi
fi
return 1
}
function do_reset() {
rm -f $PGN
touch $PGN
exec_san ""
}
function do_move() {
if [ "$SANOK" != "yes" ]; then
echo "Illegal move (you must use SAN): $1"
echo "Error (cannot play): $1"
fi
if exec_san "$1"; then
MOVENOW="yes"
fi
}
while read cmd; do
case "$cmd" in
xboard)
echo "feature san=1 done=1"
;;
"accepted san")
SANOK="yes"
;;
quit)
exit 0
;;
new)
do_reset
;;
variant*)
echo "Error (only standard chess please): $cmd"
;;
[a-h][x1-8]*)
do_move "$cmd"
;;
[KQBNRP][xa-h]*)
do_move "$cmd"
;;
O-O*)
do_move "$cmd"
;;
analyze)
echo "Error (unknown command): $cmd"
;;
*)
# ignore other commands
echo "Error (command not implemented): $cmd"
;;
esac
if [ "$MOVENOW" = "yes" ]; then
if do_engine_move; then
MOVENOW="no"
else
echo "Error (engine blew up): kaboom"
exit 1
fi
fi
done
The source code above is not very complex. The last part reads commands one
line at a time and calls various functions depending on the command.
Then, if it is Black's turn, it calls the do_engine_move function.
The current state of the game is constantly updated in the dce-basic.current.pgn file which is created in your chess directory, the list
of scores computed by dbacl is in the file dce-basic.current.scores, and the final best engine move is saved in the file dce-basic.current.emove.
Once you have this engine script in your chess directory, make sure it has
execute permissions, and then you can try it out with XBoard.
% chmod +x ./dce-basic.sh
% xboard -fcp ./dce-basic.sh
It's much more fun to read this account if you actually try this out
with XBoard yourself, so I won't say what happens next or how well
dbacl does as a chess player. The discussion with answers continues
in the next section so consider this a spoiler warning. Don't peek!
When playing chess on XBoard, don't forget that dce-basic.sh is
incomplete. All you can do is play White, and restart the game whenever
you want. No fancy menu choices. However, you can follow what's going
on at any time by looking at the temporary files named
dce-basic.current.* which are placed in your chess directory.
|