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

📄 analysechess.cpp

📁 在linux下使用qt来开发的五子棋
💻 CPP
📖 第 1 页 / 共 2 页
字号:
						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 + -