?? 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;
//新建數(shù)組,不對原始數(shù)組進行改動
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; //把預(yù)測加的棋子清除,在進行其它預(yù)測
break;
}
else
{
grid[m-i][n] = 0; //把預(yù)測加的棋子清除,在進行其它預(yù)測
break;
}
}
else if( m-i>=0 && m-i<15 && grid[m-i][n]==grid[m][n] ) //如果遇到同色棋子,則繼續(xù)查找空格
{
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; //把預(yù)測加的棋子清除,在進行其它預(yù)測
break;
}
else
{
grid[m+i][n] = 0; //把預(yù)測加的棋子清除,在進行其它預(yù)測
break;
}
}
else if( m+i>=0 && m+i<15 && grid[m+i][n]==grid[m][n] ) //如果遇到同色棋子,則繼續(xù)查找空格
{
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] ) //如果遇到同色棋子,則繼續(xù)查找空格
{
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] ) //如果遇到同色棋子,則繼續(xù)查找空格
{
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] ) //如果遇到同色棋子,則繼續(xù)查找空格
{
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] ) //如果遇到同色棋子,則繼續(xù)查找空格
{
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] ) //如果遇到同色棋子,則繼續(xù)查找空格
{
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] ) //如果遇到同色棋子,則繼續(xù)查找空格
{
continue;
}
else
{
break; //越界,或遇到異色棋子,退出搜索
}
}
break;
}
}
//返回值有3種:非法為0、沖四為1、四連為2
if( left == 0 && right == 0 )
{
return 0; //非法返回0,現(xiàn)在不是4連或沖4(可能是亂棋,無用棋,但是也可能是沖三、二連、三連)
}
else if( left == 1 && right == 1 )
{
return 2; //左右都能5連,說明已經(jīng)4連,返回2
}
else
{
return 1; //只有左能5連、或只有右能5連,說明已經(jīng)是沖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; //存儲調(diào)用四連判斷函數(shù)的返回值
//新建數(shù)組,不對原始數(shù)組進行改動
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 ) //能構(gòu)成四連或沖四
{
left = fourback; //能構(gòu)成四連left為2,沖四left為1
grid[m-i][n] = 0;
break;
}
else
{
grid[m-i][n] = 0;
break; //不能構(gòu)成四連或沖四
}
}
else if( m-i>=0 && m-i<15 && grid[m-i][n]==grid[m][n] ) //如果遇到同色棋子,則繼續(xù)查找空格
{
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 ) //能構(gòu)成四連或沖四
{
right = fourback; //能構(gòu)成四連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] ) //如果遇到同色棋子,則繼續(xù)查找空格
{
continue;
}
else
{
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -