📄 analysechess.cpp
字号:
#include "analysechess.h"
//判断5粒、5粒以上棋势
int AnalyseChess::Five( int (*grid)[15], int m, int n, const int &dire )
{
int count = 1;
int i;
switch( dire ){
//纵向
case 0:
{
//纵向左搜索
for( i=1; i<5; i++ )
{
if( m-i>=0 && m-i<15 && grid[m-i][n]==grid[m][n] )
{
count++;
}
else
{
break;
}
}
//纵向右搜索
for( i=1; i<5; i++ )
{
if( m+i>=0 && m+i<15 && grid[m+i][n]==grid[m][n] )
{
count++;
}
else
{
break;
}
}
break;
}
//横向
case 1:
{
//横向左搜索
for( i=1; i<5; i++ )
{
if( n-i>=0 && n-i<15 && grid[m][n-i]==grid[m][n] )
{
count++;
}
else
{
break;
}
}
//横向右搜索
for( i=1; i<5; i++ )
{
if( n+i>=0 && n+i<15 && grid[m][n+i]==grid[m][n] )
{
count++;
}
else
{
break;
}
}
break;
}
//左上右下
case 2:
{
//左上右下左搜索
for( i=1; i<5; i++ )
{
if( m-i>=0 && m-i<15 && n-i>=0 && n-i<15 && grid[m-i][n-i]==grid[m][n] )
{
count++;
}
else
{
break;
}
}
//左上右下右搜索
for( i=1; i<5; i++ )
{
if( m+i>=0 && m+i<15 && n+i>=0 && n+i<15 && grid[m+i][n+i]==grid[m][n] )
{
count++;
}
else
{
break;
}
}
break;
}
//左下右上
case 3:
{
//左下右上左搜索
for( i=1; i<5; i++ )
{
if( m+i>=0 && m+i<15 && n-i>=0 && n-i<15 && grid[m+i][n-i]==grid[m][n] )
{
count++;
}
else
{
break;
}
}
//左下右上右搜索
for( i=1; i<5; i++ )
{
if( m-i>=0 && m-i<15 && n+i>=0 && n+i<15 && grid[m-i][n+i]==grid[m][n] )
{
count++;
}
else
{
break;
}
}
break;
}
}
//返回值有两种:5连成功、没有5连
if( count >= 5 )
{
return 1; //左右搜索,相加大于等于5,表示5连成功,返回1
}
else
{
return 0; //表示没有5连,返回0
}
}
//判断4粒棋势
int AnalyseChess::Four( int (*realgrid)[15], int m, int n, const int &dire )
{
int left =0, right = 0;
int i,j;
//新建数组,不对原始数组进行改动
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<5; i++)
{
if( m-i>=0 && m-i<15 && grid[m-i][n]==0 )
{
grid[m-i][n] = grid[m][n]; //遇到左边第一个空格,填上一粒子
if( AnalyseChess::Five( grid, m-i, n, dire ) ==1 ) //判断5连
{
left = 1; //左填一粒子,满足5连
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; //越界,或遇到异色棋子,退出搜索
}
}
//右搜索
for( i=1; i<5; i++)
{
if( m+i>=0 && m+i<15 && grid[m+i][n]==0 )
{
grid[m+i][n] = grid[m][n]; //遇到右边第一个空格,填上一粒子
if( AnalyseChess::Five( grid, m+i, n, dire ) ==1 ) //判断5连
{
right = 1; //右填一粒子,满足5连
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<5; i++)
{
if( n-i>=0 && n-i<15 && grid[m][n-i]==0 )
{
grid[m][n-i] = grid[m][n]; //遇到左边第一个空格,填上一粒子
if( AnalyseChess::Five( grid, m, n-i, dire ) ==1 ) //判断5连
{
left = 1; //左填一粒子,满足5连
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<5; i++)
{
if( n+i>=0 && n+i<15 && grid[m][n+i]==0 )
{
grid[m][n+i] = grid[m][n]; //遇到右边第一个空格,填上一粒子
if( AnalyseChess::Five( grid, m, n+i, dire ) ==1 ) //判断5连
{
right = 1; //右填一粒子,满足5连
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<5; 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]; //遇到左边第一个空格,填上一粒子
if( AnalyseChess::Five( grid, m-i, n-i, dire ) ==1 ) //判断5连
{
left = 1; //左填一粒子,满足5连
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<5; 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]; //遇到右边第一个空格,填上一粒子
if( AnalyseChess::Five( grid, m+i, n+i, dire ) ==1 ) //判断5连
{
right = 1; //右填一粒子,满足5连
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<5; 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]; //遇到左边第一个空格,填上一粒子
if( AnalyseChess::Five( grid, m+i, n-i, dire ) ==1 ) //判断5连
{
left = 1; //左填一粒子,满足5连
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<5; 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]; //遇到右边第一个空格,填上一粒子
if( AnalyseChess::Five( grid, m-i, n+i, dire ) ==1 ) //判断5连
{
right = 1; //右填一粒子,满足5连
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种:非法为0、冲四为1、四连为2
if( left == 0 && right == 0 )
{
return 0; //非法返回0,现在不是4连或冲4(可能是乱棋,无用棋,但是也可能是冲三、二连、三连)
}
else if( left == 1 && right == 1 )
{
return 2; //左右都能5连,说明已经4连,返回2
}
else
{
return 1; //只有左能5连、或只有右能5连,说明已经是冲4,返回1
}
}
//判断3粒棋势
int AnalyseChess::Three( int (*realgrid)[15], int m, int n, const int &dire )
{
int left =0, right = 0;
int i,j;
int fourback; //存储调用四连判断函数的返回值
//新建数组,不对原始数组进行改动
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<4; i++)
{
if( m-i>=0 && m-i<15 && grid[m-i][n]==0 )
{
grid[m-i][n] = grid[m][n]; //遇到左边第一个空格,填上一粒子
fourback = AnalyseChess::Four( grid, m-i, n, dire );
if( fourback != 0 ) //能构成四连或冲四
{
left = fourback; //能构成四连left为2,冲四left为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; //越界,或遇到异色棋子,退出搜索
}
}
//右搜索
for( i=1; i<4; i++)
{
if( m+i>=0 && m+i<15 && grid[m+i][n]==0 )
{
grid[m+i][n] = grid[m][n]; //遇到右边第一个空格,填上一粒子
fourback = AnalyseChess::Four( grid, m+i, n, dire );
if( fourback != 0 ) //能构成四连或冲四
{
right = fourback; //能构成四连right为2,冲四right为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
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -