Tic Tac Toe Applet
This applet is distributed with Sun's JDK 1.1 Java development kit. I have reprogrammed the applet in HolonJ for a comparison of Java and Forth source text.
| Java version | HolonJ version |
| Java source | Forth source |
/**
* Compute the best move for white.
* @return the square to take
*/
int bestMove(int white, int black) {
int bestmove = -1;
loop:
for (int i = 0 ; i < 9 ; i++) {
int mw = moves[i];
if (((white & (1 << mw)) == 0) && ((black & (1 << mw)) == 0)) {
int pw = white | (1 << mw);
if (won[pw]) {
// white wins, take it!
return mw;
}
for (int mb = 0 ; mb < 9 ; mb++) {
if (((pw & (1 << mb)) == 0) && ((black & (1 << mb)) == 0)) {
int pb = black | (1 << mb);
if (won[pb]) {
// black wins, take another
continue loop;
}
}
}
// Neither white nor black can win in one move, this will do.
if (bestmove == -1) {
bestmove = mw;
}
}
}
if (bestmove != -1) {
return bestmove;
}
// No move is totally satisfactory, try the first one that is open
for (int i = 0 ; i < 9 ; i++) {
int mw = moves[i];
if (((white & (1 << mw)) == 0) && ((black & (1 << mw)) == 0)) {
return mw;
}
}
// No more moves
return -1;
}
: bitpos ( int b -- int )
1 b << ;
i: isFree ( int m -- boolean )
m bitpos white and 0 = m bitpos black and 0 = and ;
\ Returns true if move m makes white win.
i: whiteWins ( int m -- boolean )
m bitpos white or won ;
\ Returns true if move m gives black a chance to win.
i: blackWins ( int m -- boolean )
int pw m bitpos white or =: pw
9 0 do
i bitpos pw and 0 = i bitpos black and 0 = and
if i bitpos black or won if true return then then
loop
false ;
\ Computes the best move for white. If there is no winning move, and if
\ all moves let black win, returns the first free move.
i: bestMove ( -- int )
9 0 do i isFree i whiteWins and if i return then
loop
9 0 do i moves isFree i moves blackWins not and
if i moves return then
loop
9 0 do i moves isFree if i moves return then
loop
DONE ;
1998-2013 Wolf Wejgaard