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

📄 alphabeta1.cpp

📁 用VC实现的
💻 CPP
字号:
// AlphaBeta1.cpp: implementation of the CAlphaBeta class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "alphabeta.h"
#include "AlphaBeta1.h"
#pragma warning(disable:4786)
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CAlphaBeta::CAlphaBeta()
{
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<3;j++)
		{
			this->status[i][j] = 'Y';
		}
	}
	(this->position).first = -10;
	(this->position).second.first = -1;
	(this->position).second.second = -1;
	flag = 0;
}

CAlphaBeta::~CAlphaBeta()
{

}

void CAlphaBeta::extend(char a[3][3])
{
	char** temp = new char*[3];
	char** tmp = new char*[3];
	for(int t=0;t<3;t++)
	{
		temp[t] = new char[3];
		tmp[t] = new char[3];
	}
	for(int m=0;m<3;m++)
	{
		for(int n=0;n<3;n++)
		{
			temp[m][n] = a[m][n];
			tmp[m][n] = a[m][n];
		}
	}
	for(int i=0;i<3;i++)
	{
		for(int j=0;j<3;j++)
		{
			if('Y'==temp[i][j])
			{
				temp[i][j] = '*';
				pair<pair<pair<char**,int>,pair<int,int> >,queue<pair<pair<char**,int>,pair<int,int> > > >p;
				p.first.first.first = new char*[3];
				for(int c=0;c<3;c++)
				{
					p.first.first.first[c] = new char[3];
				}
				for(int i1=0;i1<3;i1++)
				{
					for(int j1=0;j1<3;j1++)
					{
						p.first.first.first[i1][j1] = temp[i1][j1];
					}
				}
				p.first.first.second = 10;
				p.first.second.first = i;
				p.first.second.second = j;
				queue<pair<pair<char**,int>,pair<int,int> > > q;
				if(q.empty())
				{
					p.second = q;
					tree.push_back(p);
					for(int i1=0;i1<3;i1++)
					{
						for(int j1=0;j1<3;j1++)
						{
							temp[i1][j1] = tmp[i1][j1];
						}
					}
				}
			}
		}
	}

}

void CAlphaBeta::extend_first()
{
	char** temp = new char*[3];
	char** tmp = new char*[3];
	for(int t=0;t<3;t++)
	{
		temp[t] = new char[3];
		tmp[t] = new char[3];
	}
	if(!tree.empty())
	{
		pair<pair<pair<char**,int>,pair<int,int> >,queue<pair<pair<char**,int>,pair<int,int> > > > first = tree.front();
		tree.pop_front();
		queue<pair<pair<char**,int>,pair<int,int> > > q;
		for(int i=0;i<3;i++)
		{
			for(int j=0;j<3;j++)
			{
				temp[i][j] = first.first.first.first[i][j];
				tmp[i][j] = first.first.first.first[i][j];
			}
		}
		for(int x=0;x<3;x++)
		{
			for(int y=0;y<3;y++)
			{
				if('Y'!=temp[x][y])
				{
					y++;
				}
				else
				{
					temp[x][y] = 'o';
				}
				int max = 0;
				int min = 0;
				for(int m=0;m<3;m++)
				{
					for(int n=0;n<3;n++)
					{
						if('Y'==temp[m][n])
						{
							temp[m][n] = '*';
						}
					}
				}
				max = this->get_value(temp);
				for(int i1=0;i1<3;i1++)
				{
					for(int j1=0;j1<3;j1++)
					{
						temp[i1][j1] = tmp[i1][j1];
					}
				}
				for(int m1=0;m1<3;m1++)
				{
					for(int n1=0;n1<3;n1++)
					{
						if('Y'==temp[m1][n1])
						{
							temp[m1][n1] = 'o';
						}
					}
				}
				min = this->get_value(temp);
				for(int i2=0;i2<3;i2++)
				{
					for(int j2=0;j2<3;j2++)
					{
						temp[i2][j2] = tmp[i2][j2];
					}
				}
//pair<pair<pair<char**,int>,pair<int,int> >,queue<pair<pair<char**,int>,pair<int,int> > > > first
				pair<pair<char**,int>,pair<int,int> > child;
				child.first.first = tmp;
				child.first.second = max-min;
				child.second.first = x;
				child.second.second = y;
				q.push(child);
			}
		}
		first.second = q;
		tree.push_front(first);
	}
	for(int ii=0;ii<3;ii++)
	{
		delete[] temp[ii];
		delete[] tmp[ii];
	}
	delete[] temp;
	delete[] tmp;
}

void CAlphaBeta::extend_other()
{
	tree.pop_front();
	char** Temp = new char*[3];
	char** tmp = new char*[3];
	for(int t=0;t<3;t++)
	{
		Temp[t] = new char[3];
		tmp[t] = new char[3];
	}
	while(!tree.empty())
	{
		pair<pair<pair<char**,int>,pair<int,int> >,queue<pair<pair<char**,int>,pair<int,int> > > > first = tree.front();

		queue<pair<pair<char**,int>,pair<int,int> > > q;
		for(int i=0;i<3;i++)
		{
			for(int j=0;j<3;j++)
			{
				tmp[i][j] = first.first.first.first[i][j];
				Temp[i][j] = first.first.first.first[i][j];
			}
		}	

		for(int x=0;x<3;x++)
		{
			if(1==flag)
			{
				break;
			}
			for(int y=0;y<3;y++)
			{
				flag = 0;
				if('Y'!=Temp[x][y])
				{
					y++;
				}
				else
				{
					Temp[x][y] = 'o';
				}
				int max = 0;
				int min = 0;
				for(int m=0;m<3;m++)
				{
					for(int n=0;n<3;n++)
					{
						if('Y'==Temp[m][n])
						{
							Temp[m][n] = '*';
						}
					}
				}
				max = this->get_value(Temp);
				for(int i1=0;i1<3;i1++)
				{
					for(int j1=0;j1<3;j1++)
					{
						Temp[i1][j1] = tmp[i1][j1];
					}
				}
				for(int m1=0;m1<3;m1++)
				{
					for(int n1=0;n1<3;n1++)
					{
						if('Y'==Temp[m1][n1])
						{
							Temp[m1][n1] = 'o';
						}
					}
				}
				min = this->get_value(Temp);
				if((max-min)<=(this->position.first))
				{
					flag = 1;
					pair<pair<char**,int>,pair<int,int> > child;
					child.first.first = tmp;
					child.first.second = max-min;
					child.second.first = x;
					child.second.second = y;
					q.push(child);
					break;
				}
				for(int i2=0;i2<3;i2++)
				{
					for(int j2=0;j2<3;j2++)
					{
						Temp[i2][j2] = tmp[i2][j2];
					}
				}
				pair<pair<char**,int>,pair<int,int> > child;
				child.first.first = tmp;
				child.first.second = max-min;
				child.second.first = x;
				child.second.second = y;
				q.push(child);
			}
		}
		first.second = q;
		
		int temp = 10;
		flag = 0;
		while(!first.second.empty())
		{
			pair<pair<char**,int>,pair<int,int> > p = first.second.front();
			if(p.first.second<temp)
			{
				temp = p.first.second;
			}
			first.second.pop();
		}
		
		if((this->position.first)<temp)
		{
			this->position.first = temp;
			this->position.second.first = tree.front().first.second.first;
			this->position.second.second = tree.front().first.second.second;
		}
		

		tree.pop_front();
	}
	for(int i=0;i<3;i++)
	{
		if((this->status[i][0]==this->status[i][1])&((this->status[i][0])=='o')&(this->status[i][2]=='Y'))
		{
			this->position.first = 100;
			this->position.second.first = i;
			this->position.second.second = 2;
		}
		if((this->status[i][1]==this->status[i][2])&((this->status[i][1])=='o')&(this->status[i][0]=='Y'))
		{
			this->position.first = 100;
			this->position.second.first = i;
			this->position.second.second = 0;
		}
		if((this->status[i][0]==this->status[i][2])&((this->status[i][0])=='o')&(this->status[i][1]=='Y'))
		{
			this->position.first = 100;
			this->position.second.first = i;
			this->position.second.second = 1;
		}

		if((this->status[0][i]==this->status[1][i])&((this->status[0][i])=='o')&(this->status[2][i]=='Y'))
		{
			this->position.first = 100;
			this->position.second.first = 2;
			this->position.second.second = i;
		}
		if((this->status[1][i]==this->status[2][i])&((this->status[1][i])=='o')&(this->status[0][i]=='Y'))
		{
			this->position.first = 100;
			this->position.second.first = 0;
			this->position.second.second = i;
		}
		if((this->status[0][i]==this->status[2][i])&((this->status[0][i])=='o')&(this->status[1][i]=='Y'))
		{
			this->position.first = 100;
			this->position.second.first = 1;
			this->position.second.second = i;
		}
	}
	if((this->status[0][0]==this->status[1][1])&(this->status[0][0]=='o')&(this->status[2][2]=='Y'))
	{
		this->position.first = 100;
		this->position.second.first = 2;
		this->position.second.second = 2;
	}
	if((this->status[0][0]==this->status[2][2])&(this->status[2][2]=='o')&(this->status[1][1]=='Y'))
	{
		this->position.first = 100;
		this->position.second.first = 1;
		this->position.second.second = 1;
	}
	if((this->status[2][2]==this->status[1][1])&(this->status[1][1]=='o')&(this->status[0][0]=='Y'))
	{
		this->position.first = 100;
		this->position.second.first = 0;
		this->position.second.second = 0;
	}
	if((this->status[2][0]==this->status[1][1])&(this->status[1][1]=='o')&(this->status[0][2]=='Y'))
	{
		this->position.first = 100;
		this->position.second.first = 0;
		this->position.second.second = 2;
	}
	if((this->status[0][2]==this->status[1][1])&(this->status[1][1]=='o')&(this->status[2][0]=='Y'))
	{
		this->position.first = 100;
		this->position.second.first = 2;
		this->position.second.second = 0;
	}
	if((this->status[2][0]==this->status[0][2])&(this->status[0][2]=='o')&(this->status[1][1]=='Y'))
	{
		this->position.first = 100;
		this->position.second.first = 1;
		this->position.second.second = 1;
	}

	for(i=0;i<3;i++)
	{
		if((this->status[i][0]==this->status[i][1])&((this->status[i][0])=='*')&(this->status[i][2]=='Y'))
		{
			this->position.first = 100;
			this->position.second.first = i;
			this->position.second.second = 2;
		}
		if((this->status[i][1]==this->status[i][2])&((this->status[i][1])=='*')&(this->status[i][0]=='Y'))
		{
			this->position.first = 100;
			this->position.second.first = i;
			this->position.second.second = 0;
		}
		if((this->status[i][0]==this->status[i][2])&((this->status[i][0])=='*')&(this->status[i][1]=='Y'))
		{
			this->position.first = 100;
			this->position.second.first = i;
			this->position.second.second = 1;
		}

		if((this->status[0][i]==this->status[1][i])&((this->status[0][i])=='*')&(this->status[2][i]=='Y'))
		{
			this->position.first = 100;
			this->position.second.first = 2;
			this->position.second.second = i;
		}
		if((this->status[1][i]==this->status[2][i])&((this->status[1][i])=='*')&(this->status[0][i]=='Y'))
		{
			this->position.first = 100;
			this->position.second.first = 0;
			this->position.second.second = i;
		}
		if((this->status[0][i]==this->status[2][i])&((this->status[0][i])=='*')&(this->status[1][i]=='Y'))
		{
			this->position.first = 100;
			this->position.second.first = 1;
			this->position.second.second = i;
		}
	}
	if((this->status[0][0]==this->status[1][1])&(this->status[0][0]=='*')&(this->status[2][2]=='Y'))
	{
		this->position.first = 100;
		this->position.second.first = 2;
		this->position.second.second = 2;
	}
	if((this->status[0][0]==this->status[2][2])&(this->status[2][2]=='*')&(this->status[1][1]=='Y'))
	{
		this->position.first = 100;
		this->position.second.first = 1;
		this->position.second.second = 1;
	}
	if((this->status[2][2]==this->status[1][1])&(this->status[1][1]=='*')&(this->status[0][0]=='Y'))
	{
		this->position.first = 100;
		this->position.second.first = 0;
		this->position.second.second = 0;
	}
	if((this->status[2][0]==this->status[1][1])&(this->status[1][1]=='*')&(this->status[0][2]=='Y'))
	{
		this->position.first = 100;
		this->position.second.first = 0;
		this->position.second.second = 2;
	}
	if((this->status[0][2]==this->status[1][1])&(this->status[1][1]=='*')&(this->status[2][0]=='Y'))
	{
		this->position.first = 100;
		this->position.second.first = 2;
		this->position.second.second = 0;
	}
	if((this->status[2][0]==this->status[0][2])&(this->status[0][2]=='*')&(this->status[1][1]=='Y'))
	{
		this->position.first = 100;
		this->position.second.first = 1;
		this->position.second.second = 1;
	}

}

void CAlphaBeta::choose_worst()
{
	if(!tree.empty())
	{
		int temp = 10;
		pair<pair<pair<char**,int>,pair<int,int> >,queue<pair<pair<char**,int>,pair<int,int> > > > first = tree.front();
		while(!first.second.empty())
		{
			pair<pair<char**,int>,pair<int,int> > p = first.second.front();
			if(p.first.second<temp)
			{
				temp = p.first.second;
			}
			first.second.pop();
		}
		tree.front().first.first.second = temp;
		this->position.first = temp;
		this->position.second.first = tree.front().first.second.first;
		this->position.second.second = tree.front().first.second.second;
	}
}

int CAlphaBeta::get_value(char** a)const
{
	int value = 0;
	for(int j=0;j<3;j++)
	{
		if((a[0][j]==a[1][j])&(a[1][j]==a[2][j])&(a[0][j]!='Y'))
		{
			value++;
		}
		if((a[j][0]==a[j][1])&(a[j][1]==a[j][2])&(a[j][0]!='Y'))
		{
			value++;
		}
	}
	if((a[0][0]==a[1][1])&(a[1][1]==a[2][2])&(a[0][0]!='Y'))
	{
		value++;
	}
	if((a[2][0]==a[1][1])&(a[1][1]==a[0][2])&(a[1][1]!='Y'))
	{
		value++;
	}
	return value;
}

⌨️ 快捷键说明

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