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

📄 itc.h

📁 这是一个关于智能算法的简单实例!人工智能本科生实验的第一次试验
💻 H
字号:
#include "state.h"
#include <iostream>
using namespace std;

#define  MAX_NUM 1000  //计算机获胜的标志
#define  NO_BLANK -1001//人获胜的标志
#define  TREE_DEPTH 3  //递归深度
#define  NIL 1001    //根节点的函数走步评估值
class Tic
{
public:
	int tmpQP[4][4]; //用于3层递归的临时棋盘
	
	static int s_count;//叶子节点的静态总数
	State States[MAX_NUM];//棋盘状态节点数组
	
	Tic()
	{

	}

	void init() //初始化棋盘,将各个位置的棋盘都置为0
	{
	
		s_count=0;  
		for(int i=0;i<4;i++)
			for(int j=0;j<4;j++)
			{
				States[0].QP[i][j] = 0;
			} 
		States[0].parent = NIL;
	}

	void PrintQP()//打印棋盘  
	{
		for(int i=0;i<4;i++)
		{
			for(int j=0;j<4;j++)
			{
				cout<<States[0].QP[i][j]<<'\t';
			}
			cout<<endl;
		}
	}

	int IsWin(State s) //判断当前的棋盘状态是否有令任何一方获胜
	{
		for(int i=0;i<4;i++)
		{
			if(s.QP[i][0]==1&&s.QP[i][1]==1&&s.QP[i][2]==1&&s.QP[i][3]==1)return 1;
			if(s.QP[i][0]==-1&&s.QP[i][1]==-1&&s.QP[i][2]==-1&&s.QP[i][3]==-1)return -1;
		}
		for(i=0;i<4;i++)
		{
			if(s.QP[0][i]==1&&s.QP[1][i]==1&&s.QP[2][i]==1&&s.QP[3][i]==1)return 1;
			if(s.QP[0][i]==-1&&s.QP[1][i]==-1&&s.QP[2][i]==-1&&s.QP[3][i]==-1)return -1;
		}
		if((s.QP[0][0]==1&&s.QP[1][1]==1&&s.QP[2][2]==1&&s.QP[3][3]==1)||(s.QP[3][0]==1&&s.QP[2][1]==1&&s.QP[1][2]==1&&s.QP[0][3]==1))return 1;
		if((s.QP[0][0]==-1&&s.QP[1][1]==-1&&s.QP[2][2]==-1&&s.QP[3][3]==-1)||(s.QP[3][0]==-1&&s.QP[2][1]==-1&&s.QP[1][2]==-1&&s.QP[0][3]==-1))return -1;
		return 0;
	}

	int e_fun(State s)//机器走步评价函数
	{
		bool flag=true;
		for(int i=0;i<4;i++)
			for(int j=0;j<4;j++)
				if(s.QP[i][j]==0)flag=false;
		if(flag)return NO_BLANK;
		if(IsWin(s)==-1)return -MAX_NUM;
		if(IsWin(s)==1)return MAX_NUM;
		int count=0;
		for(i=0;i<4;i++)
			for(int j=0;j<4;j++)
				if(s.QP[i][j]==0)tmpQP[i][j]=1;
				else tmpQP[i][j]=s.QP[i][j];
		for(i=0;i<4;i++)
			count+=(tmpQP[i][0]+tmpQP[i][1]+tmpQP[i][2]+tmpQP[i][3])/4;
		for(i=0;i<4;i++)
			count+=(tmpQP[0][i]+tmpQP[1][i]+tmpQP[2][i]+tmpQP[3][i])/4;
 
		count+=(tmpQP[0][0]+tmpQP[1][1]+tmpQP[2][2]+tmpQP[3][3])/4;
		count+=(tmpQP[3][0]+tmpQP[2][1]+tmpQP[1][2]+tmpQP[0][3])/4;
 
 
		for( i=0;i<4;i++)
			for(int j=0;j<4;j++)
				if(s.QP[i][j]==0)tmpQP[i][j]=-1;
				else tmpQP[i][j]=s.QP[i][j];

 
		for(i=0;i<4;i++)
			count+=(tmpQP[i][0]+tmpQP[i][1]+tmpQP[i][2]+tmpQP[i][3])/4;
 
		for(i=0;i<3;i++)
			count+=(tmpQP[0][i]+tmpQP[1][i]+tmpQP[2][i]+tmpQP[3][i])/4;
 
		count+=(tmpQP[0][0]+tmpQP[1][1]+tmpQP[2][2]+tmpQP[3][3])/3;
		count+=(tmpQP[3][0]+tmpQP[2][1]+tmpQP[1][2]+tmpQP[0][3])/3;
		return count;
	}

	virtual bool AutoDone() //机器走步虚函数,需要学生在派生类里定义实现
	{
		return false;
	}

	void UserInput()//获取用户的输入
	{
		int pos,x,y;
		L1: cout<<"请输入棋子的坐标 (xy): "; 
		cin>>pos;
		x=pos/10,y=pos%10;
		if(x>0&&x<5&&y>0&&y<5&&States[0].QP[x-1][y-1]==0)
			States[0].QP[x-1][y-1]=-1;
		else
		{
			cout<<"非法输入!";
			goto L1;
		}
	}
};

int Tic::s_count = 0;//初始化棋盘状态节点总数,刚开始置为0

⌨️ 快捷键说明

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