五子棋ai人机对战函数

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现五子棋AI,需要用到搜索算法,如Minimax算法、Alpha-Beta剪枝算法、蒙特卡罗树搜索算法等。 以下是一个基于Minimax算法的五子棋AI函数的示例代码: ```c #define DEPTH 3 //搜索深度 #define INF 0x3f3f3f3f //无穷大值 //估值函数,用于评估当前局面的得分 int evaluate(char board[][15], char player) { int score = 0; //TODO: 实现估值函数 return score; } //Minimax算法 int minimax(char board[][15], int depth, char player, int alpha, int beta) { if (depth == 0) { return evaluate(board, player); } int bestScore = player == 'X' ? -INF : INF; for (int i = 0; i < 15; i++) { for (int j = 0; j < 15; j++) { if (board[i][j] == '.') { board[i][j] = player; int score = minimax(board, depth - 1, player == 'X' ? 'O' : 'X', alpha, beta); board[i][j] = '.'; if (player == 'X') { //MAX if (score > bestScore) { bestScore = score; alpha = score; } } else { //MIN if (score < bestScore) { bestScore = score; beta = score; } } if (alpha >= beta) { return bestScore; } } } } return bestScore; } //AI函数,返回AI下的最佳位置 int ai(char board[][15]) { int bestScore = -INF; int bestRow = -1, bestCol = -1; for (int i = 0; i < 15; i++) { for (int j = 0; j < 15; j++) { if (board[i][j] == '.') { board[i][j] = 'X'; int score = minimax(board, DEPTH - 1, 'O', -INF, INF); board[i][j] = '.'; if (score > bestScore) { bestScore = score; bestRow = i; bestCol = j; } } } } return bestRow * 15 + bestCol; } ``` 该AI函数实现了Minimax算法,使用evaluate函数评估当前局面的得分,搜索深度为3,使用alpha-beta剪枝加速搜索。使用ai函数可以得到AI下的最佳位置。 需要注意的是,在估值函数的实现中,需要考虑当前局面的开局、中盘和残局不同阶段的特点,并结合五子棋的规则进行评估。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值