best.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 143 行
C
143 行
/* alpha beta search
(c) 1992 John Tromp
*/
#include "c4.h"
#define BONUS 1
int window; /* 0 = [-,+] 1 = [=,+] 2 = [-,=] */
static uint8 alp[] = {WIN2, DRAW, WIN2},
bet[] = {WIN1, WIN1, DRAW};
static uint8 xkiller[64], okiller[64];
extern B8 r, columns, height;
extern uint8 xthrcnt[], othrcnt[], colthr[], *moves;
extern int plycnt;
extern u_int posed;
extern void makemovx(),makemovo(),backmovx(),backmovo();
extern int transpose();
extern void transtore(),transrestore(),emptyht();
u_int nodes;
void initbest()
{
}
static FILE *BOOKFILE;
int bookin()
{
static int buf5 = 1;
static int nrle;
int score;
if (buf5 == 1) {
if (nrle) {
buf5 = 242;
nrle--;
} else if ((buf5 = getc(BOOKFILE)) > 242) {
nrle = buf5 - 242;
buf5 = 242;
}
buf5 += 243;
}
score = 3 + 2 * (buf5 % 3);
buf5 /= 3;
return score;
}
#define ME 1
#define OPP 2
#define BOOKME bookx
#define BOOKOPP booko
#define ABME abx
#define ABOPP abo
#define THRME xthrcnt
#define THROPP othrcnt
#define IWIN WIN2
#define ILOSE WIN1
#define MAKEMOV makemovx
#define BACKMOV backmovx
#define WORST 8
#define KILLER xkiller
#define WRSTBND beta
#define BESTBND alpha
#define IMPRVS <
#define NOWORSE <=
#define NOLOSE DRIN2
#include "best.h"
#define ME 2
#define OPP 1
#define BOOKME booko
#define BOOKOPP bookx
#define ABME abo
#define ABOPP abx
#define THRME othrcnt
#define THROPP xthrcnt
#define IWIN WIN1
#define ILOSE WIN2
#define MAKEMOV makemovo
#define BACKMOV backmovo
#define WORST 0
#define KILLER okiller
#define WRSTBND alpha
#define BESTBND beta
#define IMPRVS >
#define NOWORSE >=
#define NOLOSE DRIN1
#include "best.h"
void loadbook()
{
BOOKFILE = fopen("book.8", "r");
if (BOOKFILE == NULL) {
printf("File book.8 not found.\n");
exit(0);
}
nodes = 0;
booko();
if (getc(BOOKFILE) != EOF) {
printf("File book.8 corrupt.\n");
exit(0);
}
fclose(BOOKFILE);
}
int best()
{
int i,(*myab)();
uint8 *mythrcnt;
int me,x,work,score;
u_int poscnt;
nodes = 0;
if (plycnt & 1) {
mythrcnt = xthrcnt;
myab = abx;
me = 1;
} else {
mythrcnt = othrcnt;
myab = abo;
me = 2;
}
for (i = 0; i = r[i]; ) {
if (mythrcnt[height[i]] || colthr[columns[i]] == me)
return (plycnt&1) ? WIN2 : WIN1;
}
if (x = transpose(columns)) {
score = SCORE(x);
if (EXACT(score))
return score;
}
for (i=0; i<64; i++)
okiller[i] = xkiller[i] = 0x80;
emptyht();
score = myab(alp[window], bet[window]);
poscnt = posed;
for (work=1; poscnt>>=1; work++) ; /* work = log of #positions stored */
return work << 3 | score; /* normally bestofall */
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?