www.pudn.com > newwzq.rar > renju.cpp
// renju.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
int MakeMove(STONEMOVE* move,int type);
void UnMakeMove(STONEMOVE* move);
int IsGameOver(int *cc,int py);
int Eveluate(int *cc,int py,int cx,int cy);
void InitChessBoard(int position[225]);
void DispChess(int position[225]);
int Eveluate2(int *cc,int py);
int AddMove(int cc,int nToX, int nToY,int nPly,int go);
int CreatePossibleMove(int position[225], int nPly,int go);
int AlphaBeta(int depth, int alpha, int beta,int go);
void SearchAGoodMove(int position[225], int Type);
void SearchAGoodMove2(int position[225], int Type);
int PosValue[15*15]=
{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
0,1,2,2,2,2,2,2,2,2,2,2,2,1,0,
0,1,2,3,3,3,3,3,3,3,3,3,2,1,0,
0,1,2,3,4,4,4,4,4,4,4,3,2,1,0,
0,1,2,3,4,5,5,5,5,5,4,3,2,1,0,
0,1,2,3,4,5,6,6,6,5,4,3,2,1,0,
0,1,2,3,4,5,6,7,6,5,4,3,2,1,0,
0,1,2,3,4,5,6,6,6,5,4,3,2,1,0,
0,1,2,3,4,5,5,5,5,5,4,3,2,1,0,
0,1,2,3,4,4,4,4,4,4,4,3,2,1,0,
0,1,2,3,3,3,3,3,3,3,3,3,2,1,0,
0,1,2,2,2,2,2,2,2,2,2,2,2,1,0,
0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
bool m_bGameOver;
int m_nMoveCount;
STONEMOVE m_cmBestMove;
STONEMOVE m_MoveList[100][225];
//STONEMOVE Move;
//
int chess[225],CurChess[225];
int m_nMaxDepth,turn=11,cx,cy;
// c1 h1 c2 h2 c3 h3 c4 h4 c5
int cent[]={0,0,1, 2, 4, 10, 20, 500, 1000, 5000,10000};
int cent2[11],cent3[11];
int sline[72][16];
int score,player,tcount;
int History[225][8],MCount,GCount,Player=2,Style=2,Score=0;
char str[100];
int selfgo(int *cc,int p,int depth);
void SortMove(int *cc,int p,int depth,int count)
{
int i,j,tmp;
for(i=0;imove[j].Score)
{
tmp=move[i].StonePos.x;
move[i].StonePos.x=move[j].StonePos.x;
move[j].StonePos.x=tmp;
tmp=move[i].StonePos.y;
move[i].StonePos.y=move[j].StonePos.y;
move[j].StonePos.y=tmp;
tmp=move[i].Score;
move[i].Score=move[j].Score;
move[j].Score=tmp;
}
}
}
}
for(i=0;i0)
{
//中途退出不要搜索
i = IsGameOver(CurChess, go);
if (i != 0)
{
if(go==Player)return -30000;
else return 30000;
}
}
if (depth <= 0)
{
side=(m_nMaxDepth-depth)%2;
score=Eveluate2(CurChess,side);
return score;//叶子节点取估值
}
CreatePossibleMove(CurChess,go, depth);
for ( i = 0; i < m_nMoveCount; i++ )
{
MakeMove(&m_MoveList[depth][i], go);
//记录当前x,y坐标
cx=m_MoveList[depth][i].StonePos.x;
cy=m_MoveList[depth][i].StonePos.y;
val = -AlphaBeta(depth-1 , -beta, -alpha ,p2);
wsprintf(str,"AlphaBeta(%d,%d,%d),player=%d,score=%d,val=%d\n",depth,alpha,beta,go,m_MoveList[depth][i].Score,val);
OutputDebugString(str);
UnMakeMove(&m_MoveList[depth][i]);
if ( val > alpha )
{
alpha=val;
if(depth == m_nMaxDepth)
{
m_cmBestMove = m_MoveList[depth][i];
}
}
if ( alpha >= beta )
{
break;
}
}
return alpha;
}
int AddMove(int *cc,int nToX, int nToY,int nPly,int go)
{
int i;
m_MoveList[nPly][m_nMoveCount].StonePos.x = nToX;
m_MoveList[nPly][m_nMoveCount].StonePos.y = nToY;
m_MoveList[nPly][m_nMoveCount].Score = PosValue[nToY*15+nToX]+Eveluate(cc,go,nToX,nToY);
i=m_nMoveCount;
//wsprintf(str,"AddMove[%d],depth=%d,(%d,%d),score=%d\n",i,nPly,m_MoveList[nPly][m_nMoveCount].StonePos.x,m_MoveList[nPly][m_nMoveCount].StonePos.y,m_MoveList[nPly][m_nMoveCount].Score);
//OutputDebugString(str);
m_nMoveCount++;
//OutputDebugString("Create 失败 - in CDIJoystick::Initialise\n");
return m_nMoveCount;
}
int CreatePossibleMove(int *cc, int nPly,int go)
{
int i,j,h,k;
m_nMoveCount = 0;
//生成可以下的点位
//wsprintf(str,"CreatePossibleMovedepth=%d\n",nPly);
//OutputDebugString(str);
for (k=0;k<225;k++)
{
if (cc[k] == 0)
{
h=0;
i=k/15;
j=k%15;
if(i-1>=0&&cc[(i-1)*15+j])h++;
if(i-1>=0&&j-1>=0&&cc[(i-1)*15+j-1])h++;
if(j-1>=0&&cc[i*15+j-1])h++;
if(j+1<=14&&cc[i*15+j+1])h++;
if(i+1<=14&&cc[(i+1)*15+j])h++;
if(i+1<=14&&j+1<=14&&cc[(i+1)*15+j+1])h++;
if(i+1<=14&&j-1>=0&&cc[(i+1)*15+j-1])h++;
if(i-1>=0&&j+1<=14&&cc[(i-1)*15+j+1])h++;
if(h>0)AddMove(cc,j, i, nPly,go);
}
}
if(m_nMoveCount==0)AddMove(cc,7,7,nPly,go);//如果盘上无子,则下在7,7处
//printf("CreatePossibleMove(%d),player=%d,nply=%d\n",m_nMoveCount,player,nPly);
return m_nMoveCount;
}
//
int MakeMove(STONEMOVE* move, int type)
{
int idx=move->StonePos.y*15+move->StonePos.x;
CurChess[idx] = type;
History[MCount][0]=move->StonePos.x;
History[MCount][1]=move->StonePos.y;
MCount++;
return idx;
}
void UnMakeMove(STONEMOVE* move)
{
int idx=move->StonePos.y*15+move->StonePos.x;
CurChess[idx] = NOSTONE;
MCount--;
History[MCount][0]=0;
History[MCount][1]=0;
}
void SearchAGoodMove1(int *cc, int Type)
{
int Score,idx;
player=Type;
memcpy(CurChess, cc, 225*4);
Score = AlphaBeta(m_nMaxDepth, -20000, 20000,player);
//printf(" SearchAGoodMove(%d,%d),score=%d,player=%d\n",m_cmBestMove.StonePos.x,m_cmBestMove.StonePos.y,Score,player);
idx=m_cmBestMove.StonePos.y*15+m_cmBestMove.StonePos.x;
if (CurChess[idx] != NOSTONE)
{
//if (Score < 0)printf("You Win!\n");
//else printf("You Loss!\n");
//m_bGameOver = true;
}
MakeMove(&m_cmBestMove, Type);
//memcpy(&Move,&m_cmBestMove,sizeof(Move));
memcpy(cc, CurChess, 225*4);
}
void SearchAGoodMove2(int *cc, int Type)
{
int score,idx,i,x,y,emery,maxval,dk[225],g,s;
char str[100];
player=Type;
if(m_bGameOver)return;
memcpy(CurChess, cc, 225*4);
//Score = AlphaBeta(m_nMaxDepth, -20000, 20000);
CreatePossibleMove(CurChess,0,player);
emery=(player==WHITE)?BLACK:WHITE;
maxval=0;
//选出最佳点
for(i=0;i=g)s--;
i=dk[s];
m_cmBestMove.StonePos.y=m_MoveList[0][i].StonePos.y;
m_cmBestMove.StonePos.x=m_MoveList[0][i].StonePos.x;
Score=maxval;
//printf(" SearchAGoodMove(%d,%d),score=%d,player=%d\n",m_cmBestMove.StonePos.x,m_cmBestMove.StonePos.y,score,player);
idx=m_cmBestMove.StonePos.y*15+m_cmBestMove.StonePos.x;
if(IsGameOver(CurChess,player))
{
//if(player==BLACK)printf("BLACK Win!\n");
//else printf("WHITE Win!\n");
m_bGameOver = true;
return;
}
MakeMove(&m_cmBestMove, Type);
//memcpy(&Move,&m_cmBestMove,sizeof(Move));
memcpy(cc, CurChess, 225*4);
}
void DispChess(int *cc)
{
int x,y;
for(y=0;y<15;y++)
{
for(x=0;x<15;x++)
;
//printf("%2x ",cc[y*15+x]);
//printf("\n");
}
}
//
void InitChessBoard(int *cc)
{
int x,y;
for(y=0;y<15;y++)
for(x=0;x<15;x++)
cc[y*15+x]=0;
}
int LineScore(int *aa,int py,int d2)
{
int *sline;
int a,d,e,f,g,h;
int x,length,cent1;
int p1,p2;
if(py==BLACK)
{
p1=BLACK;
p2=WHITE;
}
if(py==WHITE)
{
p1=WHITE;
p2=BLACK;
}
length=aa[0];//数据长度
sline=&aa[1];//数据地址
cent1=0;
a=0;d=0;e=0;f=0;g=0;h=0;
for(x=0;x0)d=a*2+1;
}
else if(a+g==5)d=a*2;
else if(g==0&&a>5)d=10;
else if(a+g>5)d=3;
if(d>9)d=10;
// 0 1 2 3 4 5 6 7 8 9 10
// c1 h1 c2 h2 c3 h3 c4 h4 c5 c6
//int cent[]={0,0, 1, 2, 4, 10, 20, 500, 1000, 5000,10000};
if(d2)cent2[d]++;//每种棋型的个数
else cent3[d]++;
cent1+=cent[d];
while(x=4)
//for(y=4;y<15;y++)//向左上
{
sline[k][0]=y+1;
for(x=0;x<=y;x++)
{
idx=(y-x)*15+x;
sline[k][x+1]=cc[idx];
//printf("%2d ",sline[k][x+1]);
}
//printf("=%2d cy+cx\n",sline[k][0]);
k++;
}
y=cy+cx-14;
if(y<=10&&y>=1)
//for(y=1;y<=10;y++)//向左下
{
sline[k][0]=14-y+1;
for(x=y;x<=14;x++)
{
idx=(14+y-x)*15+x;
sline[k][x+1-y]=cc[idx];
//printf("%2d ",sline[k][x+1-y]);
}
//printf("=%2d cy+cx-14\n",sline[k][0]);
k++;
}
y=cy-cx;
if(y<=10&&y>=1)
//for(y=4;y<15;y++)//向右上
{
sline[k][0]=14-y+1;
for(x=0;x<=14-y;x++)
{
idx=(y+x)*15+x;
sline[k][x+1]=cc[idx];
//printf("%2d ",sline[k][x+1]);
}
//printf("=%2d,cy-cx \n",sline[k][0]);
k++;
}
y=cx-cy;
if(y<=10&&y>=0)
//for(y=1;y<=10;y++)//向左下
{
sline[k][0]=14-y+1;
for(x=y;x<=14;x++)
{
idx=(-y+x)*15+x;
sline[k][x+1-y]=cc[idx];
//printf("%2d ",sline[k][x+1-y]);
}
//printf("=%2d cx-cy\n",sline[k][0]);
k++;
}
idx=cy*15+cx;
cc[idx]=old;
//sline=&cc[idx];
score=0;
//执行四个方向棋型统计
for(x=0;x<11;x++)cent2[x]=0;
for(k=0;k<4;k++)
{
LineScore(&sline[k][0],py,1);
}
// 测试对方形势
idx=cy*15+cx;
old=cc[idx];
py=(py==BLACK)?WHITE:BLACK;
cc[idx]=py;
k=0;
//for(y=0;y<15;y++)//横向
y=cy;
{
sline[k][0]=15;
for(x=0;x<15;x++)
{
idx=y*15+x;
sline[k][x+1]=cc[idx];
//printf("%2d ",sline[k][x+1]);
}
//printf("=%2d \n",sline[k][0]);
k++;
}
x=cx;
//for(x=0;x<15;x++)//纵向
{
sline[k][0]=15;
for(y=0;y<15;y++)
{
idx=y*15+x;
sline[k][y+1]=cc[idx];
//printf("%2d ",sline[k][y+1]);
}
//printf("=%2d \n",sline[k][0]);
k++;
}
y=cy+cx;
if(y<=14&&y>=4)
//for(y=4;y<15;y++)//向左上
{
sline[k][0]=y+1;
for(x=0;x<=y;x++)
{
idx=(y-x)*15+x;
sline[k][x+1]=cc[idx];
//printf("%2d ",sline[k][x+1]);
}
//printf("=%2d cy+cx\n",sline[k][0]);
k++;
}
y=cy+cx-14;
if(y<=10&&y>=1)
//for(y=1;y<=10;y++)//向左下
{
sline[k][0]=14-y+1;
for(x=y;x<=14;x++)
{
idx=(14+y-x)*15+x;
sline[k][x+1-y]=cc[idx];
//printf("%2d ",sline[k][x+1-y]);
}
//printf("=%2d cy+cx-14\n",sline[k][0]);
k++;
}
y=cy-cx;
if(y<=10&&y>=1)
//for(y=4;y<15;y++)//向右上
{
sline[k][0]=14-y+1;
for(x=0;x<=14-y;x++)
{
idx=(y+x)*15+x;
sline[k][x+1]=cc[idx];
//printf("%2d ",sline[k][x+1]);
}
//printf("=%2d,cy-cx \n",sline[k][0]);
k++;
}
y=cx-cy;
if(y<=10&&y>=0)
//for(y=1;y<=10;y++)//向左下
{
sline[k][0]=14-y+1;
for(x=y;x<=14;x++)
{
idx=(-y+x)*15+x;
sline[k][x+1-y]=cc[idx];
//printf("%2d ",sline[k][x+1-y]);
}
//printf("=%2d cx-cy\n",sline[k][0]);
k++;
}
idx=cy*15+cx;
cc[idx]=old;
//sline=&cc[idx];
score=0;
//执行四个方向棋型统计
for(x=0;x<11;x++)cent3[x]=0;
for(k=0;k<4;k++)
{
LineScore(&sline[k][0],py,0);
}
//
score=0;
if(cent2[10])score=10000;//已方活5
if(!score&¢3[10])score=9500;//对方活5
if(!score&¢2[8]>1)score=9000;//已方双4,C4C4
if(!score&¢2[8]&¢2[7])score=8500;//已方冲4活3,C4H3
if(!score&¢2[9])score=7000;//已方活4
if(!score&¢3[8]>1)score=6500;//对方双4,C4C4
if(!score&¢3[8]&¢3[7])score=6000;//对方冲4活3,C4H3
if(!score&¢3[9])score=5500;//对方活4
if(!score&¢2[7]>1)score=5000;//已方双活3,H3H3
if(!score&¢2[8])score=4500;//已方冲4,C4
if(!score&¢3[7]>1)score=4000;//对方双活3,H3H3
if(!score&¢3[8])score=3500;//对方冲4,C4
if(!score)//其它情况根据公式计算
{
// h3 c3 h2 c2 h1 c1
//已方 1000 300 200 100 50 20
//对方 800 200 150 80 30 10
int temp=cent2[7]*1000+cent2[6]*300+cent2[5]*200+cent2[4]*100+cent2[3]*50+cent2[2]*20;
score=cent3[7]*800+cent2[6]*200+cent2[5]*150+cent2[4]*80+cent2[3]*30+cent2[2]*10;
if(temp>score)score=temp;
}
score=score+PosValue[cy*15+cx];
//printf("\n");
return score;
}
void MakeMove2(int x,int y,int c,int *cc)
{
int idx;
idx=y*15+x;
cc[idx]=c;
}
int IsGameOver(int *cc,int py)
{
int k,idx,x,y,score;
//int sline[16]={8,2,1,0,1,1,1,0,2,0,0};
k=0;
for(y=0;y<15;y++)//横向
{
sline[k][0]=15;
for(x=0;x<15;x++)
{
idx=y*15+x;
sline[k][x+1]=cc[idx];
//printf("%2d ",sline[k][x+1]);
}
//printf("=%2d \n",sline[k][0]);
k++;
}
for(x=0;x<15;x++)//纵向
{
sline[k][0]=15;
for(y=0;y<15;y++)
{
idx=y*15+x;
sline[k][y+1]=cc[idx];
//printf("%2d ",sline[k][y+1]);
}
//printf("=%2d \n",sline[k][0]);
k++;
}
for(y=4;y<15;y++)//向左上
{
sline[k][0]=y+1;
for(x=0;x<=y;x++)
{
idx=(y-x)*15+x;
sline[k][x+1]=cc[idx];
//printf("%2d ",sline[k][x+1]);
}
//printf("=%2d \n",sline[k][0]);
k++;
}
for(y=1;y<=10;y++)//向左下
{
sline[k][0]=14-y+1;
for(x=y;x<=14;x++)
{
idx=(14+y-x)*15+x;
sline[k][x+1]=cc[idx];
//printf("%2d ",sline[k][x+1]);
}
//printf("=%2d \n",sline[k][0]);
k++;
}
for(y=4;y<15;y++)//向右上
{
sline[k][0]=y+1;
for(x=0;x<=y;x++)
{
idx=(14-y+x)*15+x;
sline[k][x+1]=cc[idx];
//printf("%2d ",sline[k][x+1]);
}
//printf("=%2d \n",sline[k][0]);
k++;
}
for(y=1;y<=10;y++)//向左下
{
sline[k][0]=14-y+1;
for(x=y;x<=14;x++)
{
idx=(-y+x)*15+x;
sline[k][x+1]=cc[idx];
//printf("%2d ",sline[k][x+1]);
}
//printf("=%2d \n",sline[k][0]);
k++;
}
//sline=&cc[idx];
score=0;
for(x=0;x<11;x++)cent2[x]=0;
for(k=0;k<72;k++)
{
LineScore(&sline[k][0],py,1);
}
for(k=0;k<8;k++);
//printf("%d,",cent2[10-k]);
if(cent2[10])score=1;
else score=0;
return score;
}
int Eveluate2(int *cc,int py)
{
int k,idx,x,y,score,temp;
//int sline[16]={8,2,1,0,1,1,1,0,2,0,0};
k=0;
for(y=0;y<15;y++)//横向
{
sline[k][0]=15;
for(x=0;x<15;x++)
{
idx=y*15+x;
sline[k][x+1]=cc[idx];
//printf("%2d ",sline[k][x+1]);
}
//printf("=%2d \n",sline[k][0]);
k++;
}
for(x=0;x<15;x++)//纵向
{
sline[k][0]=15;
for(y=0;y<15;y++)
{
idx=y*15+x;
sline[k][y+1]=cc[idx];
//printf("%2d ",sline[k][y+1]);
}
//printf("=%2d \n",sline[k][0]);
k++;
}
for(y=4;y<15;y++)//向左上
{
sline[k][0]=y+1;
for(x=0;x<=y;x++)
{
idx=(y-x)*15+x;
sline[k][x+1]=cc[idx];
//printf("%2d ",sline[k][x+1]);
}
//printf("=%2d \n",sline[k][0]);
k++;
}
for(y=1;y<=10;y++)//向左下
{
sline[k][0]=14-y+1;
for(x=y;x<=14;x++)
{
idx=(14+y-x)*15+x;
sline[k][x+1]=cc[idx];
//printf("%2d ",sline[k][x+1]);
}
//printf("=%2d \n",sline[k][0]);
k++;
}
for(y=4;y<15;y++)//向右上
{
sline[k][0]=y+1;
for(x=0;x<=y;x++)
{
idx=(14-y+x)*15+x;
sline[k][x+1]=cc[idx];
//printf("%2d ",sline[k][x+1]);
}
//printf("=%2d \n",sline[k][0]);
k++;
}
for(y=1;y<=10;y++)//向左下
{
sline[k][0]=14-y+1;
for(x=y;x<=14;x++)
{
idx=(-y+x)*15+x;
sline[k][x+1]=cc[idx];
//printf("%2d ",sline[k][x+1]);
}
//printf("=%2d \n",sline[k][0]);
k++;
}
//sline=&cc[idx];
score=0;
for(x=0;x<11;x++)cent2[x]=0;
for(k=0;k<72;k++)
{
LineScore(&sline[k][0],py,1);
}
//for(k=0;k<8;k++);
//printf("%d,",cent2[10-k]);
score=0;
if(cent2[10])score=10000;//已方活5
if(!score&¢2[8]>1)score=9000;//已方双4,C4C4
if(!score&¢2[8]&¢2[7])score=8500;//已方冲4活3,C4H3
if(!score&¢2[9])score=7000;//已方活4
if(!score&¢2[7]>1)score=5000;//已方双活3,H3H3
if(!score&¢2[8])score=4500;//已方冲4,C4
if(!score)//其它情况根据公式计算
{
// h3 c3 h2 c2 h1 c1
//已方 1000 300 200 100 50 20
//对方 800 200 150 80 30 10
score=cent2[7]*1000+cent2[6]*300+cent2[5]*200+cent2[4]*100+cent2[3]*50+cent2[2]*20;
}
temp=score;
//
k=0;
for(y=0;y<15;y++)//横向
{
sline[k][0]=15;
for(x=0;x<15;x++)
{
idx=y*15+x;
sline[k][x+1]=cc[idx];
//printf("%2d ",sline[k][x+1]);
}
//printf("=%2d \n",sline[k][0]);
k++;
}
for(x=0;x<15;x++)//纵向
{
sline[k][0]=15;
for(y=0;y<15;y++)
{
idx=y*15+x;
sline[k][y+1]=cc[idx];
//printf("%2d ",sline[k][y+1]);
}
//printf("=%2d \n",sline[k][0]);
k++;
}
for(y=4;y<15;y++)//向左上
{
sline[k][0]=y+1;
for(x=0;x<=y;x++)
{
idx=(y-x)*15+x;
sline[k][x+1]=cc[idx];
//printf("%2d ",sline[k][x+1]);
}
//printf("=%2d \n",sline[k][0]);
k++;
}
for(y=1;y<=10;y++)//向左下
{
sline[k][0]=14-y+1;
for(x=y;x<=14;x++)
{
idx=(14+y-x)*15+x;
sline[k][x+1]=cc[idx];
//printf("%2d ",sline[k][x+1]);
}
//printf("=%2d \n",sline[k][0]);
k++;
}
for(y=4;y<15;y++)//向右上
{
sline[k][0]=y+1;
for(x=0;x<=y;x++)
{
idx=(14-y+x)*15+x;
sline[k][x+1]=cc[idx];
//printf("%2d ",sline[k][x+1]);
}
//printf("=%2d \n",sline[k][0]);
k++;
}
for(y=1;y<=10;y++)//向左下
{
sline[k][0]=14-y+1;
for(x=y;x<=14;x++)
{
idx=(-y+x)*15+x;
sline[k][x+1]=cc[idx];
//printf("%2d ",sline[k][x+1]);
}
//printf("=%2d \n",sline[k][0]);
k++;
}
//sline=&cc[idx];
for(x=0;x<11;x++)cent2[x]=0;
for(k=0;k<72;k++)
{
LineScore(&sline[k][0],py%2+1,1);
}
//
score=0;
if(cent2[10])score=10000;//已方活5
if(!score&¢2[8]>1)score=9000;//已方双4,C4C4
if(!score&¢2[8]&¢2[7])score=8500;//已方冲4活3,C4H3
if(!score&¢2[9])score=7000;//已方活4
if(!score&¢2[7]>1)score=5000;//已方双活3,H3H3
if(!score&¢2[8])score=4500;//已方冲4,C4
if(!score)//其它情况根据公式计算
{
// h3 c3 h2 c2 h1 c1
//已方 1000 300 200 100 50 20
//对方 800 200 150 80 30 10
score=cent2[7]*1000+cent2[6]*300+cent2[5]*200+cent2[4]*100+cent2[3]*50+cent2[2]*20;
}
int i;
for(i=0;i<225;i++)
{
if(chess[i]==py)temp+=PosValue[i];
if(chess[i]==(py%2+1))score+=PosValue[i];
}
score=temp-score;
//score=score+PosValue[cy*15+cx];
//printf("\n");
return -score;
}
//主程序开始
int main(int argc, char* argv[])
{
int i;
InitChessBoard(chess);
turn=19;
for(i=0;i