|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T m
Length: 2658 (0xa62)
Types: TextFile
Names: »minmax.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Othello/minmax.c«
/*
* minmax.c
*/
# include "reversi.h"
int maxlev, movex, movey;
/*
* this defines the order in which the board
* is searched for the best move. It is
* here to shorten the time to best move,
* this increasing the chance of hitting
* a good trimming point as well as
* increasing the possibility of making
* a reasonable move when an interrupt is
* caught.
*/
short morder[64][2] = {
1,1, 1,8, 8,1, 8,8,
1,3, 1,6, 3,1, 3,8, 6,1, 6,8, 8,3, 8,6,
3,3, 3,6, 6,3, 6,6,
1,4, 1,5, 4,1, 4,8, 5,1, 5,8, 8,4, 8,5,
3,4, 3,5, 4,3, 4,6, 5,3, 5,6, 6,4, 6,5,
2,3, 2,6, 3,2, 3,7, 6,2, 6,7, 7,3, 7,6,
2,4, 2,5, 4,2, 4,7, 5,2, 5,7, 7,4, 7,5,
1,2, 1,7, 2,1, 2,8, 7,1, 7,8, 8,2, 8,7,
2,2, 2,7, 7,2, 7,7, 4,4, 4,5, 5,4, 5,5,
};
# define NOMOVE (-32760)
# define USECOPY
# ifdef USECOPY
struct copyB {
boardT data;
};
# define copyb(next,board) (*((struct copyB *)next) = *((struct copyB *) board))
# else
# define copyb(next,board) copy(next,board)
# endif
copy(next, board)
register int *next, *board;
{
register int count;
count = sizeof (boardT) / sizeof (int);
do {
*next++ = *board++;
} while (--count);
}
computer (player, board, level)
boardT board;
{
int i;
extern int com, defcom;
maxlev = level;
movex = movey = -1;
i = seek (player, board, 0, 1, -NOMOVE);
if (movex == -1 || movey == -1)
return 0;
move (player, movex, movey, board);
return 1;
}
hint (player, board, level)
boardT board;
{
int i;
maxlev = level;
i = seek (player, board, 0, 1, -NOMOVE);
if (movex == -1 || movey == -1)
return 0;
return 1;
}
seek (player, board, level, moved, best)
register player;
register boardT board;
{
boardT next;
register int x, y;
register int s;
int max, i;
int bestx, besty;
int m, j;
extern int gotsignal;
max = NOMOVE;
m = 0;
for (j = 0; j < 60; j++) {
x = morder[j][0];
y = morder[j][1];
if (gotsignal)
return 0;
if (legal (player, x, y, board)) {
copyb (next, board);
if (level == 0 && movex == -1) {
movex = x;
movey = y;
}
move (player, x, y, next);
++m;
if (level >= maxlev)
s = score (next, player);
else
s = seek (-player, next, level+1, 1, -max);
if (s >= max) {
/*
* try to make the game appear random
* by choosing among equal moves
* randomly
*/
if (s == max && rand()&01)
goto skip;
if (s > best)
return -s;
bestx = x;
besty = y;
if (level == 0) {
movex = bestx;
movey = besty;
}
max = s;
}
skip: ;
}
}
if (m == 0)
if (moved && level)
return seek (-player, board, level + 1, 0, -best);
else
return - count (player, board) * 500;
return -max;
}