1
实现原理:
扫描棋盘上所有位置,得出最关键位置,(即计分后分值最高的点位)
具体细节:
遍历棋盘所有点,识别每个点位局势,剖析活二,活三,冲四,眠二,眠三等基本形势,计算得到分值,分值最高位置即为人机下一步走棋位置。
/*头文件*/
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
/*宏定义*/
#define MAXIMUS 15 //定义棋盘大小
/*函数声明*/
void Auto(int p[MAXIMUS][MAXIMUS],int *k,int *l);
int AICheck(int Cx,int Cy,int now);
int Scoring(int w,int x,int y,int z);
int Statistics(int w,int x,int y,int z,int num);
int Compare(int k,int l);
int Judge(int a[]);
int standard(int a[10]);
int AliveTwo[4][10] = {2,2,0,0,1,1,0,2,2,2, // 1
2,2,0,1,1,0,2,2,2,2,
2,2,0,1,0,1,0,2,2,2,
2,0,1,1,0,0,2,2,2,2
};
int AliveThree[2][10]={2,0,1,1,1,0,2,2,2,2, // 2
2,2,0,1,1,1,0,2,2,2
};
int DangeFour[3][10]= {2,2,1,1,1,1,2,2,2,2, // 3
2,2,2,1,1,1,1,2,2,2,
2,1,1,1,1,2,2,2,2,2
};
int AsleepTwo[5][10]= {2,-1,0,0,1,1,-1,2,2,2, // 4
2,0,0,0,1,1,-1,2,2,2,
2,2,2,0,0,1,1,-1,2,2,
2,0,0,1,1,-1,2,2,2,2,
2,0,1,1,0,-1,2,2,2,2
};
int AsleepThree[10][10]={2,0,1,1,1,-1,2,2,2,2, // 5
2,1,1,0,1,-1,2,2,2,2,
2,1,1,1,0,-1,2,2,2,2,
2,1,0,1,1,-1,2,2,2,2,
2,2,0,1,1,1,-1,2,2,2,
2,2,1,0,1,1,2,2,2,2,
2,2,1,1,0,1,-1,2,2,2,
2,2,2,0,1,1,1,-1,2,2,
2,2,2,2,0,1,1,1,-1,2,
2,2,2,2,2,0,1,1,1,-1
};
int OnlyOne[3][10] = {2,2,2,2,1,2,2,2,2,2, // 6
0,0,0,0,1,0,0,0,0,0,
0,0,0,0,-1,0,0,0,0,0
};
int OnlyTwo[1][10] = {0,0,0,1,0,0,0,0,0,0 // 7
};
void Auto(int p[MAXIMUS][MAXIMUS],int *k,int *l,int Now){
//Now代表当前走子的玩家,1代表黑,2代表白
//p[MAXIMUS][MAXIMUS]存储对局信息
//k,l为指针,保存下棋位置
int q[15][15]={};
int m=7;
int n=7;
int MAX=0;
for(int i = 0; i < MAXIMUS; i++){
for(int j = 0; j < MAXIMUS; j ++){
if(p[i][j] != 0)
continue;
q[i][j]=AICheck(i,j,Now);
if(q[i][j]>MAX){
m = i;
n = j;
MAX=q[i][j];
}
}
}
*k=m;
*l=n;
}
int AICheck(int Cx,int Cy,int now){ // 检测该位置八个方向上的棋子并统计该点分数
int w=0,x=0,y=0,z=0,i; //记录横竖正斜反斜四个方向上属于哪类情况
/
int W[10]={};
for(i=1;i<=5;i++){ //向下检查
// if(i==1)
// now == p[Cx][Cy+i];
if(Cy+i<MAXIMUS&&p[Cx][Cy+i]==now){
W[5-i]=1;
}else if(Cy+i<MAXIMUS&&p[Cx][Cy+i]==0){
W[5-i]=0;
}else if(Cy+i<MAXIMUS&&p[Cx][Cy+i]==(3-now)){
W[5-i]=-1;
}
}
for(i=1;i<=5;i++){ //向上检查
if(Cy-i>0&&p[Cx][Cy-i]==now)
W[4+i]=1;
else if(Cy-i>0&&p[Cx][Cy-i]==0){
W[4+i]=0;
}else if(Cy-i>0&&p[Cx][Cy-i]==(3-now)){
W[4+i]=-1;
}
}
w = Judge(W);
standard(W);
w = Judge(W);
/
int X[10]={};
for(i=1;i<=5;i++){ //向右检查
// if(i==1)
// now == p[Cx+i][Cy];
if(Cx+i<MAXIMUS&&p[Cx+i][Cy]==now){
X[5-i]=1;
}else if(Cx+i<MAXIMUS&&p[Cx+i][Cy]==0){
X[5-i]=0;
}else if(Cx+i<MAXIMUS&&p[Cx+i][Cy]==(3-now)){
X[5-i]=-1;
}
}
项目原地址
我的github项目地址 https://github.com/OutlierStar/GobangAI