加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
核心算法改进.cpp 6.07 KB
一键复制 编辑 原始数据 按行查看 历史
杨浩 提交于 2022-02-22 08:17 . 项目文件2
void CFivezq::ChessExpert(CPoint &best)
{
int computer[15][15][4]={0},player[15][15][4]={0}; //应全部初始化为零
int flag[2][2]={0}; //标志数组:标志该空位两端是否到达边界(遇到对方棋子)/遇到空位
int count=0,i,j,k,m;
int x=0,y=0; //(x,y)存储向右搜索时遇到边界/空位/对方棋子时的前一个坐标,向左搜索的起点
for(i=0;i<15;i++) //分析己方棋型
for(j=0;j<15;j++)
{
if(m_board[i][j]==0)
{
m_board[i][j]=m_turn; //假设己方在这一点落子
for(k=1;k<5;k++) //横向--->
{
if(i+k>14){flag[0][0]=1;break;} //横向右遇到边界
if(m_board[i+k][j]==-m_turn){flag[0][0]=1;break;}//横向右遇到对方棋子+***o
if(m_board[i+k][j]==0){flag[0][1]=1;break;} //横向右遇到空位++*++
}
x=i+k-1;
y=j;
for(m=0;m>-5;m--) //横向<---
{
if(x+m<0){flag[1][0]=1;break;} //横向左遇到边界
if(m_board[x+m][y]==m_turn)count++;
if(m_board[x+m][y]==-m_turn){flag[1][0]=1;break;} //横向左遇到对方棋子o***+
if(m_board[x+m][y]==0){flag[1][1]=1;break;} //横向左遇到空位++*++
}
Evaluater(flag,count,computer[i][j][0]);
for(k=1;k<5;k++) //纵向|
{
if(j+k>14){flag[0][0]=1;break;} //纵向下遇到边界
if(m_board[i][j+k]==-m_turn){flag[0][0]=1;break;} //纵向下遇到对方棋子+***o
if(m_board[i][j+k]==0){flag[0][1]=1;break;} //纵向下遇到空位++*++
}
x=i;
y=j+k-1;
for(m=0;m>-5;m--)
{
if(y+m<0){flag[1][0]=1;break;} //纵向上遇到边界
if(m_board[x][y+m]==m_turn)count++;
if(m_board[x][y+m]==-m_turn){flag[1][0]=1;break;} //纵向上遇到对方棋子o***+
if(m_board[x][y+m]==0){flag[1][1]=1;break;} //纵向上遇到空位++*++
}
Evaluater(flag,count,computer[i][j][1]);
for(k=1;k<5;k++) //45°
{
if(i+k>14||j+k>14){flag[0][0]=1;break;} //45°向下遇到边界
if(m_board[i+k][j+k]==-m_turn){flag[0][0]=1;break;} //45°向下遇到对方棋子+***o
if(m_board[i+k][j+k]==0){flag[0][1]=1;break;} //45°向下遇到空位++*++
}
x=i+k-1;
y=j+k-1;
for(m=0;m>-5;m--)
{
if(x+m<0||y+m<0){flag[1][0]=1;break;} //45°向上遇到边界
if(m_board[x+m][y+m]==m_turn)count++;
if(m_board[x+m][y+m]==-m_turn){flag[1][0]=1;break;} //45°向上遇到对方棋子o***+
if(m_board[x+m][y+m]==0){flag[1][1]=1;break;} //45°向上遇到空位++*++
}
Evaluater(flag,count,computer[i][j][2]);
for(k=1;k<5;k++) //135°
{
if(i-k<0||j+k>14){flag[0][0]=1;break;} //135°向下遇到边界
if(m_board[i-k][j+k]==-m_turn){flag[0][0]=1;break;} //135°向下遇到对方棋子+***o
if(m_board[i-k][j+k]==0){flag[0][1]=1;break;} //135°向下遇到空位++*++
}
x=i-k+1;
y=j+k-1;
for(m=0;m>-5;m--)
{
if(x-m>14||y+m<0){flag[1][0]=1;break;} //135°向上遇到边界
if(m_board[x-m][y+m]==m_turn)count++;
if(m_board[x-m][y+m]==-m_turn){flag[1][0]=1;break;} //135°向上遇到对方棋子o***+
if(m_board[x-m][y+m]==0){flag[1][1]=1;break;} //135°向上遇到空位++*++
}
Evaluater(flag,count,computer[i][j][3]);
m_board[i][j]=0;
}
}
for(i=0;i<15;i++) //分析对方棋型
for(j=0;j<15;j++)
{
if(m_board[i][j]==0)
{
m_board[i][j]=-m_turn; //假设对方在这一点落子
for(k=1;k<5;k++) //横向--->
{
if(i+k>14){flag[0][0]=1;break;} //横向右遇到边界
if(m_board[i+k][j]==m_turn){flag[0][0]=1;break;}//横向右遇到对方棋子+***o
if(m_board[i+k][j]==0){flag[0][1]=1;break;} //横向右遇到空位++*++
}
x=i+k-1;
y=j;
for(m=0;m>-5;m--) //横向<---
{
if(x+m<0){flag[1][0]=1;break;} //横向左遇到边界
if(m_board[x+m][y]==-m_turn)count++;
if(m_board[x+m][y]==m_turn){flag[1][0]=1;break;} //横向左遇到对方棋子o***+
if(m_board[x+m][y]==0){flag[1][1]=1;break;} //横向左遇到空位++*++
}
Evaluater(flag,count,player[i][j][0]);
for(k=1;k<5;k++) //纵向|
{
if(j+k>14){flag[0][0]=1;break;} //纵向下遇到边界
if(m_board[i][j+k]==m_turn){flag[0][0]=1;break;} //纵向下遇到对方棋子+***o
if(m_board[i][j+k]==0){flag[0][1]=1;break;} //纵向下遇到空位++*++
}
x=i;
y=j+k-1;
for(m=0;m>-5;m--)
{
if(y+m<0){flag[1][0]=1;break;} //纵向上遇到边界
if(m_board[x][y+m]==-m_turn)count++;
if(m_board[x][y+m]==m_turn){flag[1][0]=1;break;} //纵向上遇到对方棋子o***+
if(m_board[x][y+m]==0){flag[1][1]=1;break;} //纵向上遇到空位++*++
}
Evaluater(flag,count,player[i][j][1]);
for(k=1;k<5;k++) //45°
{
if(i+k>14||j+k>14){flag[0][0]=1;break;} //45°向下遇到边界
if(m_board[i+k][j+k]==m_turn){flag[0][0]=1;break;} //45°向下遇到对方棋子+***o
if(m_board[i+k][j+k]==0){flag[0][1]=1;break;} //45°向下遇到空位++*++
}
x=i+k-1;
y=j+k-1;
for(m=0;m>-5;m--)
{
if(x+m<0||y+m<0){flag[1][0]=1;break;} //45°向上遇到边界
if(m_board[x+m][y+m]==-m_turn)count++;
if(m_board[x+m][y+m]==m_turn){flag[1][0]=1;break;} //45°向上遇到对方棋子o***+
if(m_board[x+m][y+m]==0){flag[1][1]=1;break;} //45°向上遇到空位++*++
}
Evaluater(flag,count,player[i][j][2]);
for(k=1;k<5;k++) //135°
{
if(i-k<0||j+k>14){flag[0][0]=1;break;} //135°向下遇到边界
if(m_board[i-k][j+k]==m_turn){flag[0][0]=1;break;} //135°向下遇到对方棋子+***o
if(m_board[i-k][j+k]==0){flag[0][1]=1;break;} //135°向下遇到空位++*++
}
x=i-k+1;
y=j+k-1;
for(m=0;m>-5;m--)
{
if(x-m>14||y+m<0){flag[1][0]=1;break;} //135°向上遇到边界
if(m_board[x-m][y+m]==-m_turn)count++;
if(m_board[x-m][y+m]==m_turn){flag[1][0]=1;break;} //135°向上遇到对方棋子o***+
if(m_board[x-m][y+m]==0){flag[1][1]=1;break;} //135°向上遇到空位++*++
}
Evaluater(flag,count,player[i][j][3]);
m_board[i][j]=0;
}
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化