www.pudn.com > newwzq.rar > renju.cpp, change:2006-07-01,size:23583b


// 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