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

📄 200630690214.cpp

📁 关于五子棋的人工智能
💻 CPP
字号:
#include"stdio.h"

int board[15][15]={0};    //假设1为己方的棋子,-1是对手下的棋子,未下子的地方为0
int max[8]={0};           //分别存储我方和对方棋形表4个方向的权值
int a[8]={0},b[8]={0};    //a[8]存储双方4个方向权值最大的点的横坐标,b[8]为纵坐标                     
int maxm[3]={0};          //数组maxm分别存储权值最大的点的权值、横坐标以及纵坐标    
int dre_across[15][15]={0},dre_across2[15][15]={0};  //横方向权值存储数组
int dre_up[15][15]={0},dre_up2[15][15]={0};        //竖方向权值存储数组
int dre_ld[15][15]={0},dre_ld2[15][15]={0};        //左斜方向权值存储数组
int dre_rd[15][15]={0},dre_rd2[15][15]={0};	       //右斜方向权值存储数组


void ch_list1()
{                     //对方棋形表
  int x,y,j,k;                        
    for(x=0;x<15;x++)                   //横方向
	  for(y=0;y<15;y++)
	   {  
		  int p=0,q=0;
		   if(board[x][y]==0)
		   {
		    for(j=x-1;j>=0;j--)     //向左搜索
		    {
				if(board[j][y]==-1) p++;    //单个方向权值计算  
		        else break;
			}
         
            for(j=x+1;j<15;j++)     //向右搜索
			{
				if(board[j][y]==-1) q++;
	            else break;
			}
            dre_across[x][y]=p+q;         //横方向总权值计算
		   }
       
	  }
	                   //竖方向
    for(x=0;x<15;x++)
	  for(y=0;y<15;y++)
	  { 
		  int p=0,q=0;
		   if(board[x][y]==0)
		   {
		    for(j=y-1;j>=0;j--)  //向上搜索
			{
				if(board[x][j]==-1) p++;
		        else break;
			}
         
            for(j=y+1;j<15;j++)      //向下搜索 
			{
				if(board[x][j]==-1) q++;
		        else break;
			}
            dre_up[x][y]=p+q;
		   }
	  }
		                   //左斜方向
    for(x=0;x<15;x++)
	  for(y=0;y<15;y++)
	  {   
          int p=0,q=0;
		  if(board[x][y]==0)
		  {
		   for(j=x-1,k=y-1;(j>=0&&k>=0);j--,k--)  //左斜向上搜索
		   {
			   if(board[j][k]==-1) p++;
		       else break;
		   }
           for(j=x+1,k=y+1;(j<15&&k<15);j++,k++)   //左斜向下搜索
		   {  
			   if(board[j][k]==-1) q++;
		       else break;
		   }
           dre_ld[x][y]=p+q;
		  }	
	  }
		                          //右斜方向
    for(x=0;x<15;x++)
	  for(y=0;y<15;y++)
	  {
          int p=0,q=0;
	      if(board[x][y]==0)
		  {
		   for(j=x-1,k=y+1;(j>=0&&k<15);j--,k++)  //右斜向下搜索
		   {
			   if(board[j][k]==-1) p++;
		       else break;
		   }
          for(j=x+1,k=y-1;(j<15&&k>=0);j++,k--)   //右斜向上搜索
		  {
			  if(board[j][k]==-1) q++;
		      else break;
		  }
          dre_rd[x][y]=p+q;
		  }
	  }
}
		                            
void ch_list2()
{                   //我方的棋形表 ,搜索过程同上面的对方搜索过程一样
  int x,y,j,k;                   //并计算每个方向的权值,存放到数组max[8]中
   for(x=0;x<15;x++)                //横方向
	 for(y=0;y<15;y++)
	 {
	   int p=0,q=0;
		if(board[x][y]==0)
		{
		  for(j=x-1;j>=0;j--)
		  {
			  if(board[j][y]==1) p++;
		      else break;
		  }
         
          for(j=x+1;j<15;j++)
		  {
			  if(board[j][y]==1) q++;
		      else break;
		  }
          dre_across2[x][y]=p+q;
		}
	 }
		                    //竖方向
   for(x=0;x<15;x++)
     for(y=0;y<15;y++)
	 {
       int p=0,q=0;
	    if(board[x][y]==0)
		{
	      for(j=y-1;j>=0;j--)
	      {
			  if(board[x][j]==1) p++;
		      else break;
		  }
          for(j=y+1;j<15;j++)
		  {
			  if(board[x][j]==1) q++;
		      else break;
		  }
          dre_up2[x][y]=p+q;
		}
	 }
	                       //左斜方向
   for(x=0;x<15;x++)
     for(y=0;y<15;y++)
	 {
       int p=0,q=0;
	    if(board[x][y]==0)
		{
	   	  for(j=x-1,k=y-1;(j>=0&&k>=0);j--,k--)
		  {
			  if(board[j][k]==1) p++;
	          else break;
		  }
         
          for(j=x+1,k=y+1;(j<15&&k<15);j++,k++)
		  {
			  if(board[j][k]==1) q++;
		      else break;
		  }
          dre_ld2[x][y]=p+q;
		}
	 }
		                //右斜方向
     for(x=0;x<15;x++)
       for(y=0;y<15;y++)
	   {
         int p=0,q=0;
	      if(board[x][y]==0)
		  {
	        for(j=x+1,k=y-1;(j<15&&k>=0);j++,k--)
			{
				if(board[j][k]==1) p++;
		        else break;
			}
         
            for(j=x-1,k=y+1;(j>=0&&k<15);j--,k++)
			{
                if(board[j][k]==1) q++;
	            else break;
			}
            dre_rd2[x][y]=p+q;
		  }
	   }
}	
void compare(){                                         //对方比较大小
	int x,y,i;
    max[0]=dre_across[0][0];                            //横方向比较 
    for(x=0;x<15;x++)
      for(y=0;y<15;y++)
      if(dre_across[x][y]>=max[0])
       {
         max[0]=dre_across[x][y];
         a[0]=x;                          //横坐标存储到数组a中
         b[0]=y;                          //纵坐标存储到数组b中
	  }
    max[1]=dre_up[0][0];                            //竖方向比较
    for(x=0;x<15;x++)
      for(y=0;y<15;y++)
      if(dre_up[x][y]>=max[1])
      {
       max[1]=dre_up[x][y];
       a[1]=x;
       b[1]=y;
	 }   
    max[2]=dre_ld[0][0];                          //左斜方向比较
    for(x=0;x<15;x++)
      for(y=0;y<15;y++)
      if(dre_ld[x][y]>=max[2])
      {
       max[2]=dre_ld[x][y];
       a[2]=x;
       b[2]=y;
      }
   max[3]=dre_rd[0][0];                        //右斜方向比较
   for(x=0;x<15;x++)
     for(y=0;y<15;y++)
     if(dre_rd[x][y]>=max[3])
     {
      max[3]=dre_rd[x][y];
      a[3]=x;
      b[3]=y;
     }                                          //我方比较大小,比较过程同对方比较过程一样 
   max[4]=dre_across2[0][0];
   for(x=0;x<15;x++)
     for(y=0;y<15;y++)
     if(dre_across2[x][y]>max[4])
    {
      max[4]=dre_across2[x][y];
      a[4]=x;
      b[4]=y;
    }
   max[5]=dre_up2[0][0];
   for(x=0;x<15;x++)
    for(y=0;y<15;y++)
    if(dre_up2[x][y]>max[5])
     {
      max[5]=dre_up2[x][y];
      a[5]=x;
      b[5]=y;
    }
   max[6]=dre_ld2[0][0];
   for(x=0;x<15;x++)
    for(y=0;y<15;y++)
    if(dre_ld2[x][y]>max[6])
    {
     max[6]=dre_ld2[x][y];
     a[6]=x;
     b[6]=y;
    }
   max[7]=dre_rd2[0][0];
   for(x=0;x<15;x++)
    for(y=0;y<15;y++)
    if(dre_rd2[x][y]>max[7])
   {
     max[7]=dre_rd2[x][y];
     a[7]=x;
     b[7]=y;
   } 	
   maxm[0]=max[0];                  //给数组maxm赋初值
   for(i=0;i<8;i++)
  {
    if(max[i]>=maxm[0])
    { 
	  maxm[0]=max[i];            
      maxm[1]=a[i];              //存储最大权值点的横、
      maxm[2]=b[i];             //纵坐标
	}                         
    if((maxm[1]==0)||(maxm[2]==0))     
     {
		for(x=4;x<13;x++)
        for(y=4;y<13;y++)
        if(board[x][y]==0)
       {
          maxm[1]=x;
          maxm[2]=y;
       }
	}
    else if((maxm[1]==14)||(maxm[2]==14))
        {
		  for(x=4;x<13;x++)
              for(y=4;y<13;y++)
                 if(board[x][y]==0)
				 {
					 maxm[1]=x;
                     maxm[2]=y;
				 }
        }          
 }
printf("\n");
  printf("%d,%d\n",maxm[1],maxm[2]);    //打印下子点的坐标
}


void main()
 {
  int x,y,n,t,SWITCH;
  scanf("%d",&n);
  if(n==0)  
	  printf("7,7\n");	
  else if(n==1) 
	  printf("6,6\n");
  else if(n%2==0)
	  SWITCH=1;     //SWITCH表示交换下子权 
  else 
	  SWITCH=-1;
  for(t=0;t<n;t++)
  {
  scanf("%d,%d",&x,&y);
      if(SWITCH==1)
	  {
	     board[x][y]=1;;SWITCH=-1;
	  }
      else if(SWITCH==-1)
	  {
	     board[x][y]=-1;SWITCH=1;
	  }
  }
ch_list1();
ch_list2();
compare();
}	

⌨️ 快捷键说明

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