📄 analysechess.cpp
字号:
break; //越界,或遇到异色棋子,退出搜索
}
}
break;
}
//横向
case 1:
{
//左搜索
for( i=1; i<4; i++)
{
if( n-i>=0 && n-i<15 && grid[m][n-i]==0 )
{
grid[m][n-i] = grid[m][n]; //遇到左边第一个空格,填上一粒子
fourback = AnalyseChess::Four( grid, m, n-i, dire );
if( fourback != 0 ) //能构成四连或冲四
{
left = fourback; //能构成四连left为2,冲四left为1
grid[m][n-i] = 0;
break;
}
else
{
grid[m][n-i] = 0;
break;
}
}
else if( n-i>=0 && n-i<15 && grid[m][n-i]==grid[m][n] ) //如果遇到同色棋子,则继续查找空格
{
continue;
}
else
{
break; //越界,或遇到异色棋子,退出搜索
}
}
//右搜索
for( i=1; i<4; i++)
{
if( n+i>=0 && n+i<15 && grid[m][n+i]==0 )
{
grid[m][n+i] = grid[m][n]; //遇到右边第一个空格,填上一粒子
fourback = AnalyseChess::Four( grid, m, n+i, dire );
if( fourback != 0 ) //能构成四连或冲四
{
right = fourback; //能构成四连right为2,冲四right为1
grid[m][n+i] = 0;
break;
}
else
{
grid[m][n+i] = 0;
break;
}
}
else if( n+i>=0 && n+i<15 && grid[m][n+i]==grid[m][n] ) //如果遇到同色棋子,则继续查找空格
{
continue;
}
else
{
break; //越界,或遇到异色棋子,退出搜索
}
}
break;
}
//左上右下
case 2:
{
//左搜索
for( i=1; i<4; i++)
{
if( m-i>=0 && m-i<15 && n-i>=0 && n-i<15 && grid[m-i][n-i]==0 )
{
grid[m-i][n-i] = grid[m][n]; //遇到左边第一个空格,填上一粒子
fourback = AnalyseChess::Four( grid, m-i, n-i, dire );
if( fourback != 0 ) //能构成四连或冲四
{
left = fourback; //能构成四连left为2,冲四left为1
grid[m-i][n-i] = 0;
break;
}
else
{
grid[m-i][n-i] = 0;
break;
}
}
else if( m-i>=0 && m-i<15 && n-i>=0 && n-i<15 && grid[m-i][n-i]==grid[m][n] ) //如果遇到同色棋子,则继续查找空格
{
continue;
}
else
{
break; //越界,或遇到异色棋子,退出搜索
}
}
//右搜索
for( i=1; i<4; i++)
{
if( m+i>=0 && m+i<15 && n+i>=0 && n+i<15 && grid[m+i][n+i]==0 )
{
grid[m+i][n+i] = grid[m][n]; //遇到右边第一个空格,填上一粒子
fourback = AnalyseChess::Four( grid, m+i, n+i, dire );
if( fourback != 0 ) //能构成四连或冲四
{
right = fourback; //能构成四连right为2,冲四right为1
grid[m+i][n+i] = 0;
break;
}
else
{
grid[m+i][n+i] = 0;
break;
}
}
else if( m+i>=0 && m+i<15 && n+i>=0 && n+i<15 && grid[m+i][n+i]==grid[m][n] ) //如果遇到同色棋子,则继续查找空格
{
continue;
}
else
{
break; //越界,或遇到异色棋子,退出搜索
}
}
break;
}
//左下右上
case 3:
{
//左搜索
for( i=1; i<4; i++)
{
if( m+i>=0 && m+i<15 && n-i>=0 && n-i<15 && grid[m+i][n-i]==0 )
{
grid[m+i][n-i] = grid[m][n]; //遇到右边第一个空格,填上一粒子
fourback = AnalyseChess::Four( grid, m+i, n-i, dire );
if( fourback != 0 ) //能构成四连或冲四
{
right = fourback; //能构成四连right为2,冲四right为1
grid[m+i][n-i] = 0;
break;
}
else
{
grid[m+i][n-i] = 0;
break;
}
}
else if( m+i>=0 && m+i<15 && n-i>=0 && n-i<15 && grid[m+i][n-i]==grid[m][n] ) //如果遇到同色棋子,则继续查找空格
{
continue;
}
else
{
break; //越界,或遇到异色棋子,退出搜索
}
}
//右搜索
for( i=1; i<4; i++)
{
if( m-i>=0 && m-i<15 && n+i>=0 && n+i<15 && grid[m-i][n+i]==0 )
{
grid[m-i][n+i] = grid[m][n]; //遇到左边第一个空格,填上一粒子
fourback = AnalyseChess::Four( grid, m-i, n+i, dire );
if( fourback != 0 ) //能构成四连或冲四
{
left = fourback; //能构成四连left为2,冲四left为1
grid[m-i][n+i] = 0;
break;
}
else
{
grid[m-i][n+i] = 0;
break;
}
}
else if( m-i>=0 && m-i<15 && n+i>=0 && n+i<15 && grid[m-i][n+i]==grid[m][n] ) //如果遇到同色棋子,则继续查找空格
{
continue;
}
else
{
break; //越界,或遇到异色棋子,退出搜索
}
}
break;
}
}
//根据左、右加棋子后,能否构成4连、冲4,判断现在是3连、冲3
if( left == 2 || right == 2 )
{
return 2; //左右加棋后能构成(!!!多种四连,暂时归为一种)至少一个4连,说明现有已3连,返回2
}
else if( left == 0 && right == 0 )
{
return 0; //非法为0,现在不是3连或冲3(可能是乱棋,无用棋,但是也可能是二连、冲二)
}
else
{
return 1; //左右加棋后能构成至少一个冲4(无4连),说明现有已冲3,返回1
}
}
//判断2粒棋势
int AnalyseChess::Two( int (*realgrid)[15], int m, int n, const int &dire )
{
int left =0, right = 0;
int i,j;
int threeback; //存储调用3连判断函数的返回值
//新建数组,不对原始数组进行改动
int grid[15][15];
for( i=0; i<15; i++ )
{
for( j=0; j<15; j++ )
{
if( realgrid[i][j] == 1)
{
grid[i][j] = 1;
}
else if( realgrid[i][j] == -1)
{
grid[i][j] = -1;
}
else
{
grid[i][j] = 0;
}
}
}
switch( dire ){
//纵向
case 0:
{
//左搜索
for( i=1; i<3; i++)
{
if( m-i>=0 && m-i<15 && grid[m-i][n]==0 )
{
grid[m-i][n] = grid[m][n]; //遇到左边第一个空格,填上一粒子
threeback = AnalyseChess::Three( grid, m-i, n, dire );
if( threeback != 0 ) //能构成3连或冲3
{
left = threeback; //能构成3连left为2,冲3left为1
grid[m-i][n] = 0;
break;
}
else
{
grid[m-i][n] = 0;
break; //不能构成3连或冲3
}
}
else if( m-i>=0 && m-i<15 && grid[m-i][n]==grid[m][n] ) //如果遇到同色棋子,则继续查找空格
{
continue;
}
else
{
break; //越界,或遇到异色棋子,退出搜索
}
}
//右搜索
for( i=1; i<3; i++)
{
if( m+i>=0 && m+i<15 && grid[m+i][n]==0 )
{
grid[m+i][n] = grid[m][n]; //遇到右边第一个空格,填上一粒子
threeback = AnalyseChess::Three( grid, m+i, n, dire );
if( threeback != 0 ) //能构成3连或冲3
{
right = threeback; //能构成3连right为2,冲3right为1
grid[m+i][n] = 0;
break;
}
else
{
grid[m+i][n] = 0;
break;
}
}
else if( m+i>=0 && m+i<15 && grid[m+i][n]==grid[m][n] ) //如果遇到同色棋子,则继续查找空格
{
continue;
}
else
{
break; //越界,或遇到异色棋子,退出搜索
}
}
break;
}
//横向
case 1:
{
//左搜索
for( i=1; i<3; i++)
{
if( n-i>=0 && n-i<15 && grid[m][n-i]==0 )
{
grid[m][n-i] = grid[m][n]; //遇到左边第一个空格,填上一粒子
threeback = AnalyseChess::Three( grid, m, n-i, dire );
if( threeback != 0 ) //能构成3连或冲3
{
left = threeback; //能构成3连left为2,冲3left为1
grid[m][n-i] = 0;
break;
}
else
{
grid[m][n-i] = 0;
break;
}
}
else if( n-i>=0 && n-i<15 && grid[m][n-i]==grid[m][n] ) //如果遇到同色棋子,则继续查找空格
{
continue;
}
else
{
break; //越界,或遇到异色棋子,退出搜索
}
}
//右搜索
for( i=1; i<3; i++)
{
if( n+i>=0 && n+i<15 && grid[m][n+i]==0 )
{
grid[m][n+i] = grid[m][n]; //遇到右边第一个空格,填上一粒子
threeback = AnalyseChess::Three( grid, m, n+i, dire );
if( threeback != 0 ) //能构成3连或冲3
{
right = threeback; //能构成3连right为2,冲3right为1
grid[m][n+i] = 0;
break;
}
else
{
grid[m][n+i] = 0;
break;
}
}
else if( n+i>=0 && n+i<15 && grid[m][n+i]==grid[m][n] ) //如果遇到同色棋子,则继续查找空格
{
continue;
}
else
{
break; //越界,或遇到异色棋子,退出搜索
}
}
break;
}
//左上右下
case 2:
{
//左搜索
for( i=1; i<3; i++)
{
if( m-i>=0 && m-i<15 && n-i>=0 && n-i<15 && grid[m-i][n-i]==0 )
{
grid[m-i][n-i] = grid[m][n]; //遇到左边第一个空格,填上一粒子
threeback = AnalyseChess::Three( grid, m-i, n-i, dire );
if( threeback != 0 ) //能构成3连或冲3
{
left = threeback; //能构成3连left为2,冲3left为1
grid[m-i][n-i] = 0;
break;
}
else
{
grid[m-i][n-i] = 0;
break;
}
}
else if( m-i>=0 && m-i<15 && n-i>=0 && n-i<15 && grid[m-i][n-i]==grid[m][n] ) //如果遇到同色棋子,则继续查找空格
{
continue;
}
else
{
break; //越界,或遇到异色棋子,退出搜索
}
}
//右搜索
for( i=1; i<3; i++)
{
if( m+i>=0 && m+i<15 && n+i>=0 && n+i<15 && grid[m+i][n+i]==0 )
{
grid[m+i][n+i] = grid[m][n]; //遇到右边第一个空格,填上一粒子
threeback = AnalyseChess::Three( grid, m+i, n+i, dire );
if( threeback != 0 ) //能构成3连或冲3
{
right = threeback; //能构成3连right为2,冲3right为1
grid[m+i][n+i] = 0;
break;
}
else
{
grid[m+i][n+i] = 0;
break;
}
}
else if( m+i>=0 && m+i<15 && n+i>=0 && n+i<15 && grid[m+i][n+i]==grid[m][n] ) //如果遇到同色棋子,则继续查找空格
{
continue;
}
else
{
break; //越界,或遇到异色棋子,退出搜索
}
}
break;
}
//左下右上
case 3:
{
//左搜索
for( i=1; i<3; i++)
{
if( m+i>=0 && m+i<15 && n-i>=0 && n-i<15 && grid[m+i][n-i]==0 )
{
grid[m+i][n-i] = grid[m][n]; //遇到右边第一个空格,填上一粒子
threeback = AnalyseChess::Three( grid, m+i, n-i, dire );
if( threeback != 0 ) //能构成3连或冲3
{
right = threeback; //能构成3连right为2,冲3right为1
grid[m+i][n-i] = 0;
break;
}
else
{
grid[m+i][n-i] = 0;
break;
}
}
else if( m+i>=0 && m+i<15 && n-i>=0 && n-i<15 && grid[m+i][n-i]==grid[m][n] ) //如果遇到同色棋子,则继续查找空格
{
continue;
}
else
{
break; //越界,或遇到异色棋子,退出搜索
}
}
//右搜索
for( i=1; i<3; i++)
{
if( m-i>=0 && m-i<15 && n+i>=0 && n+i<15 && grid[m-i][n+i]==0 )
{
grid[m-i][n+i] = grid[m][n]; //遇到左边第一个空格,填上一粒子
threeback = AnalyseChess::Three( grid, m-i, n+i, dire );
if( threeback != 0 ) //能构成3连或冲3
{
left = threeback; //能构成3连left为2,冲3left为1
grid[m-i][n+i] = 0;
break;
}
else
{
grid[m-i][n+i] = 0;
break;
}
}
else if( m-i>=0 && m-i<15 && n+i>=0 && n+i<15 && grid[m-i][n+i]==grid[m][n] ) //如果遇到同色棋子,则继续查找空格
{
continue;
}
else
{
break; //越界,或遇到异色棋子,退出搜索
}
}
break;
}
}
//根据左、右加棋子后,能否构成3连、冲3,判断现在是2连、冲2(包括隔2冲2)
if( left == 2 && right == 2 )
{
return 3; //左右加棋后都能构成3连,说明现有已2连,返回3
}
else if( left == 2 || right == 2 )
{
return 2; //左右加棋后能构成正好一个3连,说明现有已伴2连(即:2连旁边隔一个空格处为异色棋子)(此情况权重小于2连,大于冲2),返回2
}
else if( left == 0 && right == 0 )
{
return 0; //非法为0,现在不是2连或冲2(是乱棋,无用棋)
}
else
{
return 1; //左右加棋子后,有1或2个冲3,则现在已经是冲2,返回1
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -