⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fivestoneprocess.cpp

📁 java程序五子棋源代码。 java程序五子棋源代码。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// FiveStoneProcess.cpp: implementation of the FiveStoneProcess class.

//

//////////////////////////////////////////////////////////////////////



#include "stdafx.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 (can_five(color)) return false;//已经存在可以连5的子,不必再判断一阶活子

	BOOL flag = false;	//返回值

	POINT closepoints[225];

	int count = 0;

	getclose(color,count,closepoints);			

	for(int i=0;i<count;i++)

	{

		if (closepoints[i].x!=0)

		{

			if (is_alive(closepoints[i].x,closepoints[i].y,color)) 

			{

				tempresult[counter].x = closepoints[i].x;

				tempresult[counter].y = closepoints[i].y;

				counter++;

				flag = true;

			}

		}

	}

	return flag;

	 

}

BOOL FiveStoneProcess::has_chongtwo(int color,int &counter,POINT tempresult[])

{
	
	//判断一个棋盘有没有冲二子
	
	//counter为候选结果的计数,tempresult为候选结果集
	
	counter = 0;
	
	BOOL flag = false;	//返回值
	
	POINT closepoints[225];
	
	int count = 0;
	
	getclose(color,count,closepoints);			
	
	for(int i=0;i<count;i++)
		
	{
		
		if (closepoints[i].x!=0)
			
		{
			

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -