📄 itc.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 + -