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

📄 analysechess.cpp

📁 在linux下使用qt来开发的五子棋
💻 CPP
📖 第 1 页 / 共 2 页
字号:

#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 + -