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

📄 connect6.cpp

📁 这个程序是一个六子棋对弈引擎
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "stdafx.h"
#include "stdio.h"
#include "Define.h"
#include "chList.h"
#include "PointStrs.h"
#include "windows.h"

char position[GRID_NUM][GRID_NUM];		//棋盘
STONEMOVE m_cmBestMove;

int FirststepFlag = 1;
INCDEC myInc[6], adverDec[6];
int best_myInc[6], best_adverDec[6];
bool spJugde(chList &myList,PointStrs &myStr,int idOfThree)	//判断这个三是否属于我们的某个四,是则true,否则false
{
	int Coordsan[6][2],Statussan[6],sanx=0,sany=0;
	int Coordsi[6][2],Statussi[6],six=0,siy=0;
	int out[1000],count=0;
	int i=0,j=0,k=0,sign=0,find=0;

	myStr.SearchFour(out,count);//存储所有的四线到out中,count为四线的个数

	myList.GetCoor(idOfThree,Coordsan);//获得该三线各子的坐标
	myList.GetStr(idOfThree,Statussan);//获得该三线各子的状态

	for (i=0; i<count; i++)//在count条四线逐条寻找,是否包含该三线
	{
		myList.GetCoor(out[i],Coordsi);
		myList.GetStr(out[i],Statussi);

		find=1;//在第i条四线中寻找,先默认find为1,若不包含将find置为0
		for (j=0; j<6; j++)//三线中逐个点的寻找,看在四线中是否有该三线所有的点
		{
			if (Statussan[j]==-1)//空子跳过
			{
				continue;
			}

			sanx=Coordsan[j][0];
			sany=Coordsan[j][1];

			//对三线中的第j个点,看在第i个四线中寻找
			sign=0;//代表第j个点在该四线中能否找到
			for (k=0; k<6; k++)
			{
				if (Statussi[k]==-1)
				{
					continue;
				}
				if (Coordsi[k][0]==sanx&&Coordsi[k][1]==sany)//第i条四线的第k个点与三线的第j个点相同
				{
					sign=1;
				}
			}
			if (sign==0)//在第i个四线中没找到该三线的第j个点
			{
				find=0;
				break;
			}
		}

		if (find==1)//六个点都有,表明它属于该四线
		{
			return true;
		}

	}

	return false;
}
bool Judge( int myInc[], int adverDec[], int order)
{
	if (order == 1)
	{
		if ( adverDec[3] > best_adverDec[3] )  //敌人减少的四线
			return true;
		if ( adverDec[3] < best_adverDec[3] ) 
			return false;
		if (myInc[3] >= 2 || best_myInc[3] >= 2)  //我们的三的交点或者活三
		{
			if (myInc[3] > best_myInc[3])
				return true;
			if (myInc[3] < best_myInc[3])
				return false;
		}
		if (myInc[2] >= 3 || best_myInc[2] >= 3)  //我们的活二
		{
			if (myInc[2] > best_myInc[2])
				return true;
			if (myInc[2] < best_myInc[2])
				return false;
		}
		if (adverDec[2] >= 2 || best_adverDec[2] >= 2 )  //敌人的三的交点
		{
			if( adverDec[2] > best_adverDec[2] )
				return true;
			if( adverDec[2] < best_adverDec[2] )
				return false;
		}
		if (myInc[1] >= 3 || best_myInc[1] >= 3)  //我们的活一
		{
			if (myInc[1] > best_myInc[1])
				return true;
			if (myInc[1] < best_myInc[1])
				return false;
		}
		if (adverDec[1] >= 2 || best_adverDec[1] >= 2)  //敌人的活二或者二线交点
		{
			if (best_adverDec[2] == 0)
			{
				if (adverDec[2] >= 1)
				{
					if (adverDec[1] >= 2)
						return true;
				}
				else{
					if(adverDec[1] > best_adverDec[1] )
						return true;
					else if(adverDec[1] < best_adverDec[1] )
						return false;
				}
			}
			else
			{
				if (adverDec[2] >= 1)
				{
					if(adverDec[1] > best_adverDec[1] )
						return true;
					else if(adverDec[1] < best_adverDec[1] )
						return false;
				}
				else
				{
					if (best_adverDec[1] >= 2)
						return false;
				}
			}
		}
		if (myInc[2] >= 1 || best_myInc[2] >= 1)  //我们的二
		{
			if (myInc[2] > best_myInc[2])
				return true;
			if (myInc[2] < best_myInc[2])
				return false;
		}
		if (adverDec[1] >= 1 || best_adverDec[1] >= 1) //敌人的二
		{
			if (adverDec[1] > best_adverDec[1])
			{
				return true;
			}
			if (adverDec[1] < best_adverDec[1])
			{
				return false;
			}
		}		
		if (myInc[3] >= 1 || best_myInc[3] >= 1 )  //我们增加了一个四线,即单三
		{
			if(myInc[3] > best_myInc[3])
				return true;
			if(myInc[3] < best_myInc[3])
				return false;
		}
		if (adverDec[0] >= 1 || best_adverDec[0] >= 1)   // 敌人减少的一
		{
			if (adverDec[0] > best_adverDec[0])
				return true;
			if(adverDec[0] < best_adverDec[0])
				return false;
		}
		if (myInc[0] >= 1 || best_myInc[0] >= 1)   //我们增加的一
		{
			if (myInc[0] > best_myInc[0])
			{
				return true;
			}
			if (myInc[0] < best_myInc[0])
			{
				return false;
			}
		}	
	}
	else
	{
		if ( adverDec[3] > best_adverDec[3] ) //敌人减少的四线
			return true;
		if ( adverDec[3] < best_adverDec[3] )
			return false;
		if (myInc[3] >= 2 || best_myInc[3] >= 2)  //我们增加的四线,即三线的交点
		{
			if (myInc[3] > best_myInc[3])
				return true;
			if (myInc[3] < best_myInc[3])
				return false;
		}
		if (adverDec[2] >= 2 || best_adverDec[2] >= 2 )//敌人减少的三的交点,活三
		{

			if( adverDec[2] > best_adverDec[2] )
				return true;
			if( adverDec[2] < best_adverDec[2] )
				return false;
		}
		if (adverDec[1] >= 2 || best_adverDec[1] >= 2)//敌人减少了多个二,活二
		{
			if (best_adverDec[2] == 0)
			{
				if (adverDec[2] >= 1)
				{
					if (adverDec[1] >= 2)
						return true;
				}
				else{
					if(adverDec[1] > best_adverDec[1] )
						return true;
					else if(adverDec[1] < best_adverDec[1] )
						return false;
				}
			}
			else
			{
				if (adverDec[2] >= 1)
				{
					if(adverDec[1] > best_adverDec[1] )
						return true;
					else if(adverDec[1] < best_adverDec[1] )
						return false;
				}
				else
				{
					if (best_adverDec[1] >= 2)
						return false;
				}
			}
		}
		if (myInc[1] >= 3 || best_myInc[1] >= 3)  //我们增加了多个二,即一线的交点
		{
			if (myInc[1] > best_myInc[1])
				return true;
			if (myInc[1] < best_myInc[1])
				return false;
		}
		if (myInc[2] >= 3 || best_myInc[2] >=3)  //我们增加的三线,即二线的交点
		{
			if (myInc[2] > best_myInc[2])
				return true;
			if (myInc[2] < best_myInc[2])
				return false;
		}
		if (adverDec[2] >= 1 || best_adverDec[2] >= 1 )   //敌人减少的三
		{

			if( adverDec[2] > best_adverDec[2] )
				return true;
			if( adverDec[2] < best_adverDec[2] )
				return false;
		}
		
		if (myInc[3] >= 1 || best_myInc[3] >= 1 )  //我们增加一个四,单三
		{
			if(myInc[3] > best_myInc[3])
				return true;
			if(myInc[3] < best_myInc[3])
				return false;
		}
		if (myInc[2] >= 1 || best_myInc[2] >=1)   //我们增加的三线
		{
			if (myInc[2] > best_myInc[2])
				return true;
			if (myInc[2] < best_myInc[2])
				return false;
		}
		if (adverDec[1] >= 1 || best_adverDec[1] >= 1) //敌人减少的二
		{
			if (adverDec[1] > best_adverDec[1])
			{
				return true;
			}
			if (adverDec[1] < best_adverDec[1])
			{
				return false;
			}
		}
		if (myInc[1] >= 1 || best_myInc[1] >= 1) //我们增加的二
		{
			if (myInc[1] > best_myInc[1])
			{
				return true;
			}
			if (myInc[1] < best_myInc[1])
			{
				return false;
			}
		}
		if (myInc[0] >= 1 || best_myInc[0] >= 1) //我们增加的一
		{
			if (myInc[0] > best_myInc[0])
			{
				return true;
			}
			if (myInc[0] < best_myInc[0])
			{
				return false;
			}
		}
		if (adverDec[0] >= 1 || best_adverDec[0] >= 1)
		{
			if (adverDec[0] > best_adverDec[0])
			{
				return true;
			}
			if (adverDec[0] < best_adverDec[0])
			{
				return false;
			}
		}
	}
	return false;
}
void Initialize_value()
{
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			best_myInc[i] = -1;
			best_adverDec[i] = -1;
		}
	}
}
//Value函数用于判定某一个特定的走法atemPos对局势产生的效果,即返回myInc和adverDec数组,
//myInc[0]表示我方“一”的个数增加,myInc[1]表示“二”的个数的增加,以此类推
//adverDec[0]表示对手“一”的个数减少,adverDec[1]表示对手“二”的个数的减少,以此类推
void Value(STONEPOS atemPos,INCDEC myInc[],INCDEC adverDec[],chList &myList,chList &adverList,PointStrs &myStr,PointStrs &adverStr)
{	
	int searchResultFor[11][924],searchResultLat[11][924];												//用于暂存结果
	int countFor[11];														
	int countLat[11];
	int i,j,k;
	bool alreadyIn,stillInNow;	//alreadyIn用于标记新增的线是否本来就有,notInNow用于标记本来就有的某个线现在是否还有
	myStr.SearchOne(searchResultFor[1],countFor[1]);							//记录下在试探性的放入这颗特定的棋子前,敌我的状态
	myStr.SearchTwo(searchResultFor[2],countFor[2]);
	myStr.SearchThree(searchResultFor[3],countFor[3]);
	myStr.SearchFour(searchResultFor[4],countFor[4]);
	myStr.SearchFive(searchResultFor[5],countFor[5]);
	adverStr.SearchOne(searchResultFor[6],countFor[6]);
	adverStr.SearchTwo(searchResultFor[7],countFor[7]);
	adverStr.SearchThree(searchResultFor[8],countFor[8]);
	adverStr.SearchFour(searchResultFor[9],countFor[9]);
	adverStr.SearchFive(searchResultFor[10],countFor[10]);
	position[atemPos.x][atemPos.y] = myStr.KnowType();						//试探性的放入一颗棋子
	myStr.UpDate(myList,atemPos);											//更新敌我的活棋表,以便求改变量
	adverStr.UpDate(adverList,atemPos);
	myStr.SearchOne(searchResultLat[1],countLat[1]);							//记录下在试探性的放入这颗特定的棋子后,敌我的状态
	myStr.SearchTwo(searchResultLat[2],countLat[2]);
	myStr.SearchThree(searchResultLat[3],countLat[3]);
	myStr.SearchFour(searchResultLat[4],countLat[4]);
	myStr.SearchFive(searchResultLat[5],countLat[5]);
	adverStr.SearchOne(searchResultLat[6],countLat[6]);
	adverStr.SearchTwo(searchResultLat[7],countLat[7]);
	adverStr.SearchThree(searchResultLat[8],countLat[8]);
	adverStr.SearchFour(searchResultLat[9],countLat[9]);
	adverStr.SearchFive(searchResultLat[10],countLat[10]);
	position[atemPos.x][atemPos.y] = NOSTONE;								//还原
	myStr.UpDate(myList,atemPos);
	adverStr.UpDate(adverList,atemPos);

	for(i=0;i<5;i++)														//把这颗棋子的状态计算出来,存进相应的数组里面
	{
		//先处理了我们的myInc,把我们的myInc里面的一切都搞定
		myInc[i].count = 0;
		myInc[i].containLive = false;
		for(j=0;j<countLat[i+1];j++)
		{
			alreadyIn = false;
			for(k=0;k<countFor[i+1];k++)
			{
				if(searchResultLat[i+1][j]==searchResultFor[i+1][k])
					alreadyIn = true;
			}
			if(!alreadyIn)
			{
				myInc[i].id[myInc[i].count] = searchResultLat[i+1][j];
				myInc[i].count++;
			}
		}
		for(j=0;j<=myInc[i].count-3;i++)
		{
			if(myInc[i].id[j]==myInc[i].id[j+1]+1 && myInc[i].id[j]==myInc[i].id[j+2]+2)
				myInc[i].containLive = true;
		}
		
		//哈哈,下面要来搞定对手减少的东西了,就是要把adverDec数组里面的东东都计算出来
		adverDec[i].count = 0;
		adverDec[i].containLive = false;
		for(j=0;j<countFor[i+6];j++)
		{
			stillInNow = false;
			for(k=0;k<countLat[i+6];k++)
			{
				if(searchResultFor[i+6][j] == searchResultLat[i+6][k])
					stillInNow = true;
			}
			if(!stillInNow)
			{
				adverDec[i].id[adverDec[i].count] = searchResultFor[i+6][j];
				adverDec[i].count++;
			}
		}
		for(j=0;j<=adverDec[i].count-3;i++)
		{
			if(adverDec[i].id[j]==adverDec[i].id[j+1]+1 && adverDec[i].id[j]==adverDec[i].id[j+2]+2)
				adverDec[i].containLive = true;
		}			
	}
}

bool SearchGoodMove(STONEMOVE &newMove,chList &myList,chList &adverList,PointStrs &myStr,PointStrs &adverStr)
{
	int searchResult[924],count,result[924], group[924], flag;
	STONEPOS atemPos1,atemPos2,bestAtem;
	int id,strxy[6][2];
	int i,j;
	int countFor,countLat,weight1,weight2,bestWeight;
	bool put1 = false,put2 = false;				//用于标记第一颗第二颗子是否放下
	adverStr.UpDate(adverList,newMove);
	myStr.UpDate(myList,newMove);
	 //第一种开局
	/*if(newMove.StonePos[1].x==-1 && newMove.StonePos[1].y==-1 )
	{
		if( newMove.StonePos[0].x >= 2 && newMove.StonePos[0].x <= 16&& newMove.StonePos[0].y>= 2 && newMove.StonePos[0].y <= 16)
		{
			if(newMove.StonePos[0].x+newMove.StonePos[0].y<=18  && newMove.StonePos[0].x>=newMove.StonePos[0].y)
			{
				m_cmBestMove.StonePos[0].x = newMove.StonePos[0].x - 1;
				m_cmBestMove.StonePos[0].y = newMove.StonePos[0].y + 1;
				m_cmBestMove.StonePos[1].x = newMove.StonePos[0].x + 1;
				m_cmBestMove.StonePos[1].y = newMove.StonePos[0].y + 1;
			}
		
			if(newMove.StonePos[0].x+newMove.StonePos[0].y > 18 && newMove.StonePos[0].x < newMove.StonePos[0].y)
			{
				m_cmBestMove.StonePos[0].x = newMove.StonePos[0].x-1;
				m_cmBestMove.StonePos[0].y = newMove.StonePos[0].y-1;
				m_cmBestMove.StonePos[1].x = newMove.StonePos[0].x+1;
				m_cmBestMove.StonePos[1].y = newMove.StonePos[0].y-1;
			}

			if(newMove.StonePos[0].x+newMove.StonePos[0].y<=18 && newMove.StonePos[0].x < newMove.StonePos[0].y)
			{
				m_cmBestMove.StonePos[0].x = newMove.StonePos[0].x + 1;
				m_cmBestMove.StonePos[0].y = newMove.StonePos[0].y-1;
				m_cmBestMove.StonePos[1].x = newMove.StonePos[0].x+1;
				m_cmBestMove.StonePos[1].y = newMove.StonePos[0].y+1;
			}

			if(newMove.StonePos[0].x+newMove.StonePos[0].y>18 && newMove.StonePos[0].x >= newMove.StonePos[0].y)
			{
				m_cmBestMove.StonePos[0].x = newMove.StonePos[0].x - 1;
				m_cmBestMove.StonePos[0].y = newMove.StonePos[0].y - 1;
				m_cmBestMove.StonePos[1].x = newMove.StonePos[0].x-1;
				m_cmBestMove.StonePos[1].y = newMove.StonePos[0].y +1;
			}
		}
		else
		{
			m_cmBestMove.StonePos[0].x = 8;
			m_cmBestMove.StonePos[0].y = 10;
			m_cmBestMove.StonePos[1].x = 10;
			m_cmBestMove.StonePos[1].y = 10;
		}
		position[m_cmBestMove.StonePos[0].x][m_cmBestMove.StonePos[0].y] = myStr.KnowType();
		position[m_cmBestMove.StonePos[1].x][m_cmBestMove.StonePos[1].y] = myStr.KnowType();
		myStr.UpDate(myList,m_cmBestMove);
		adverStr.UpDate(adverList,m_cmBestMove);
		FirststepFlag = 0;
		return true;
	}
	*/
	//第二种开局
	if(newMove.StonePos[1].x==-1 && newMove.StonePos[1].y==-1 &&  newMove.StonePos[0].x >= 1  && newMove.StonePos[0].y >= 2 )
	{
		m_cmBestMove.StonePos[0].x = newMove.StonePos[0].x-1;
		m_cmBestMove.StonePos[0].y = newMove.StonePos[0].y-1;
		m_cmBestMove.StonePos[1].x = newMove.StonePos[0].x;
		m_cmBestMove.StonePos[1].y = newMove.StonePos[0].y-2;

		position[m_cmBestMove.StonePos[0].x][m_cmBestMove.StonePos[0].y] = myStr.KnowType();
		position[m_cmBestMove.StonePos[1].x][m_cmBestMove.StonePos[1].y] = myStr.KnowType();

		myStr.UpDate(myList,m_cmBestMove);
		adverStr.UpDate(adverList,m_cmBestMove);
		FirststepFlag = 0;
		return true;
	}

	//第三种开局,脱离战局
	/*if(newMove.StonePos[1].x==-1 && newMove.StonePos[1].y==-1 )
	{
		m_cmBestMove.StonePos[0].x = 4;
		m_cmBestMove.StonePos[0].y = 5;
		m_cmBestMove.StonePos[1].x = 5;
		m_cmBestMove.StonePos[1].y = 4;
		position[m_cmBestMove.StonePos[0].x][m_cmBestMove.StonePos[0].y] = myStr.KnowType();
		position[m_cmBestMove.StonePos[1].x][m_cmBestMove.StonePos[1].y] = myStr.KnowType();
		myStr.UpDate(myList,m_cmBestMove);
		adverStr.UpDate(adverList,m_cmBestMove);
		FirststepFlag = 0;
		return true;
	}*/

	if (FirststepFlag == 1)
	{
		if ( ( newMove.StonePos[0].x  < 7 || newMove.StonePos[0].y < 7 || newMove.StonePos[0].x  > 11 || newMove.StonePos[0].y > 11 ) &&
			( newMove.StonePos[1].x  < 7 || newMove.StonePos[1].y < 7 || newMove.StonePos[1].x  > 11 || newMove.StonePos[1].y > 11 ))
		{
			if(newMove.StonePos[0].x+newMove.StonePos[0].y<=18  && newMove.StonePos[0].x>=newMove.StonePos[0].y)
			{
				m_cmBestMove.StonePos[0].x =9 - 1;
				m_cmBestMove.StonePos[0].y = 9 + 1;
				m_cmBestMove.StonePos[1].x = 9 + 1;
				m_cmBestMove.StonePos[1].y = 9 + 1;
			}

⌨️ 快捷键说明

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