// FiveStoneProcess.cpp: implementation of the FiveStoneProcess class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ms5.h"
#include "FiveStoneProcess.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
BOOL debugqian = false;//是否察看牵制子匹配的详细内容
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
FiveStoneProcess::FiveStoneProcess()
{
is_low = false;
level = 0;
notshowinfo = false;
thinkpos = 0;
}
FiveStoneProcess::~FiveStoneProcess()
{
}
BOOL FiveStoneProcess::has_five(int color)
{
//color = 1表示黑子,color = 2表示白子
//判断是否出现了5个子想连的情况
int i,j;
for(i=1;i<=15;i++)
for(j=1;j<=15;j++)
{
if (points[i][j]==color)
{
points[i][j] = 0;
if (is_five(color,i,j))
{
points[i][j] = color;
return true;
}
points[i][j] = color;
}
}
return false;
/*
int i,j;
for(i=1;i<=15;i++)
for(j=1;j<=15;j++)
{
if (points[i][j]==color)
{
if ((i>=5)&&(points[i-1][j]==color)&&(points[i-2][j]==color)&&(points[i-3][j]==color)&&(points[i-4][j]==color))
{
//左,右
return true;
}
if ((i>=5)&&(j>=5)&&(points[i-1][j-1]==color)&&(points[i-2][j-2]==color)&&(points[i-3][j-3]==color)&&(points[i-4][j-4]==color))
{
//斜左上,斜右下
return true;
}
if ((j>=5)&&(points[i][j-1]==color)&&(points[i][j-2]==color)&&(points[i][j-3]==color)&&(points[i][j-4]==color))
{
//上,下
return true;
}
if ((i>=5)&&(j<=11)&&(points[i-1][j+1]==color)&&(points[i-2][j+2]==color)&&(points[i-3][j+3]==color)&&(points[i-4][j+4]==color))
{
//斜左下,斜右上
return true;
}
}
}
return false;
*/
}
BOOL FiveStoneProcess::is_alive(int x, int y,int color)
{
if (points[x][y]!=0) return false;//已经有子了
int model[][9]={//此数组表示各种模式,包括此子前四个和后四个子的排列
//-1表示任意,1表示相同颜色,0表示空,2表示(x,y)所在位置
{-1,-1,0,1,2,1,1,0,-1},//_1*11_
{-1,-1,-1,0,2,1,1,1,0},//_*111_
};
int model_num = 2;
int point_num = 9;
BOOL flag;
for (int i=0;i<4;i++)
{
//四个方向遍历
for (int j=0;j<model_num;j++)//model_num种模式遍历,每种模式遍历两次,正反各一次
{
flag = true;
for(int k=0;k<point_num;k++)//point_num个子遍历,正遍历
{
if (model[j][k]==0)
{
if (getcolor(x,i,k-4,y)!=0)
{
//不匹配此模式
flag = false;
break;
}
}
else if (model[j][k]==1)
{
if (getcolor(x,i,k-4,y)!=color)
{
//不匹配此模式
flag = false;
break;
}
}
}
if (flag) return true;//匹配上某种模式
flag = true;
for(k=0;k<point_num;k++)//point_num个子遍历,反遍历
{
if (model[j][k]==0)
{
if (getcolor(x,i,4-k,y)!=0)
{
//不匹配此模式
flag = false;
break;
}
}
else if (model[j][k]==1)
{
if (getcolor(x,i,4-k,y)!=color)
{
//不匹配此模式
flag = false;
break;
}
}
}
if (flag) return true;//匹配上某种模式
}
}
return false;
}
BOOL FiveStoneProcess::is_twoqianmodel(int color,int x, int y,POINT tempresult[],int n)
{
//此处判断是否有两个牵制子连在一起,主要为了防止对方造势
if (points[x][y]!=0) return false;//已经有子了
int model[][9]={//此数组表示各种模式,包括此子前四个和后四个子的排列
//-1表示任意,1表示相同颜色,0表示空,2表示(x,y)所在位置
//3表示不是牵制子的相同颜色子
/*
{-1,0,0,1,2,0,0,-1,-1},//__1*__ 0
{-1,-1,0,1,2,0,0,0,-1},//_1*___ 1
{0,0,1,0,2,0,-1,-1,-1},//__1_*_ 2
{-1,-1,1,0,2,0,0,0,-1},//1_*___ 3
*/
{-1,0,0,3,2,0,0,-1,-1},//__3*__ 4
{-1,-1,0,3,2,0,0,0,-1},//_3*___ 5
{0,0,0,3,2,0,-1,-1,-1},//___3*_ 6
{0,0,3,0,2,0,-1,-1,-1},//__3_*_ 7
{-1,0,3,0,2,0,0,-1,-1},//_3_*__ 8
{-1,-1,3,0,2,0,0,0,-1},//3_*___ 9
};
int model_num = 6;
int point_num = 9;
BOOL flag;
for (int i=0;i<4;i++)
{
//四个方向遍历
for (int j=0;j<model_num;j++)//model_num种模式遍历,每种模式遍历两次,正反各一次
{
flag = true;
for(int k=0;k<point_num;k++)//point_num个子遍历,正遍历
{
if (model[j][k]==0)
{
if (getcolor(color,x,y,i,k-4,tempresult,n)!=0)
{
//不匹配此模式
flag = false;
break;
}
}
else if (model[j][k]==1)
{
if (getcolor(color,x,y,i,k-4,tempresult,n)!=1)
{
//不匹配此模式
flag = false;
break;
}
}
else if (model[j][k]==3)
{
if (getcolor(color,x,y,i,k-4,tempresult,n)!=3)
{
//不匹配此模式
flag = false;
break;
}
}
}
if (flag) return true;//匹配上某种模式
flag = true;
for(k=0;k<point_num;k++)//point_num个子遍历,反遍历
{
if (model[j][k]==0)
{
if (getcolor(color,x,y,i,4-k,tempresult,n)!=0)
{
//不匹配此模式
flag = false;
break;
}
}
else if (model[j][k]==1)
{
if (getcolor(color,x,y,i,4-k,tempresult,n)!=1)
{
//不匹配此模式
flag = false;
break;
}
}
else if (model[j][k]==3)
{
if (getcolor(color,x,y,i,4-k,tempresult,n)!=3)
{
//不匹配此模式
flag = false;
break;
}
}
}
if (flag) return true;//匹配上某种模式
}
}
return false;
}
BOOL FiveStoneProcess::is_alive_old(int x, int y,int color)
{
//这是一个根据定义直接做的老方法,比较慢,被取代,待仍然保留
//判断一个子是不是一个活子
//即自己下一子后,对方不论走什么子,都会存在5子相连
if (points[x][y]!=0) return false;//已经有子了,不可能是活子
int i;
points[x][y] = color;//假设走了此子
int anticolor;//对方的color
if (color==1) anticolor = 2;
else anticolor = 1;
BOOL flag = true;//表明是否对方每次走子时,自己都可以连成5子
POINT roundpoints[8];//一个子周围8个方向上离它最近的空子位置
getroundpoints(x,y,color,roundpoints);//此处,为了避免全盘搜索,采用了近似手法,只计算它周围的8个空子即可
for(i=0;i<8;i++)
{
if (roundpoints[i].x!=0)//即是有效的位置
{
points[roundpoints[i].x][roundpoints[i].y] = anticolor;//走对方的子
if (!can_five(color))
{
//如果存在一种情况不能连成5子,那么失败
points[roundpoints[i].x][roundpoints[i].y] = 0;
flag = false;
break;
}
points[roundpoints[i].x][roundpoints[i].y] = 0;
}
}
if (flag)
{
points[x][y] = 0;
return true;//必然是活子
}
points[x][y] = 0;
return false;
}
BOOL FiveStoneProcess::can_five(int color,int &x,int &y)
{
//得到能够得到5连子的点
POINT closepoints[225];
int count = 0;
getclose(color,count,closepoints);
for(int i=0;i<count;i++)
{
if (closepoints[i].x!=0)
{
if (is_five(color,closepoints[i].x,closepoints[i].y))
{
x = closepoints[i].x;
y = closepoints[i].y;
return true;//存在一个可以得到5子
}
}
}
return false;
}
BOOL FiveStoneProcess::can_five(int color)
{
POINT closepoints[225];
int count = 0;
getclose(color,count,closepoints);
for(int i=0;i<count;i++)
{
if (closepoints[i].x!=0)
{
if (is_five(color,closepoints[i].x,closepoints[i].y))
{
return true;//存在一个可以得到5子
}
}
}
return false;
}
BOOL FiveStoneProcess::has_alive(int color,int &counter,POINT tempresult[])
{
//判断一个棋盘有没有活子
//counter为候选结果的计数,tempresult为候选结果集
counter = 0;
//if (c
评论1