一个连珠五子棋判断是否取胜的方法(二)
/// <summary>
/// 是否赢
/// </summary>
/// <param name="arrCol">棋盘中的所有棋子</param>
/// <param name="p">要检索的棋子的位置</param>
/// <param name="maxNum">返回连续棋子的最大个数</param>
/// <returns>是否赢</returns>
public virtual bool Win(Color[,] arrColor, Point p, out int maxNum)
{
maxNum = 0;//标识连续白子或者黑子的最大个数,连续五子取胜,连续六子及六子以上视为自杀
bool bo = false;//标识是否取胜
int lenX = arrColor.GetLength(0) - 1;//棋盘行边界索引
int lenY = arrColor.GetLength(1) - 1;//棋盘列边界索引
int num = 0;//临时标识变量
Color color = arrColor[p.X, p.Y];//要检索的棋子的颜色
for (int i = 0; i < 9; i++)//从左上角 到 右下角 的九子范围内检索连续的棋子 连续五子取胜、连续六子及六子以上视为自杀
{
//设定要检索的棋子的位置
int x = p.X - 4 + i;
int y = p.Y - 4 + i;
this.TreateMaxNum(new Point(x, y), lenX, lenY, arrColor, color, ref maxNum, ref bo, ref num);//检索连续棋子的最大个数
}
num = 0;//归零
for (int i = 0; i < 9; i++)//从 左下角 到 右上角 的九子范围内检索连续的棋子
{
int x = p.X + 4 - i;
int y = p.Y - 4 + i;
this.TreateMaxNum(new Point(x, y), lenX, lenY, arrColor, color, ref maxNum, ref bo, ref num);
}
num = 0;
for (int i = 0; i < 9; i++)//从 左 到 右 的九子范围内检索连续的棋子
{
int x = p.X - 4 + i;
int y = p.Y;
this.TreateMaxNum(new Point(x, y), lenX, lenY, arrColor, color, ref maxNum, ref bo, ref num);
}
num = 0;
for (int i = 0; i < 9; i++)//从 上 到 下 的九子范围内检索连续的棋子
{
int x = p.X;
int y = p.Y - 4 + i;
this.TreateMaxNum(new Point(x, y), lenX, lenY, arrColor, color, ref maxNum, ref bo, ref num);
}
return bo;
}
/// <summary>
/// 检索连续的最大值
///
/// 这个方法的参数太多了,我记得有人说过方法的参数最好不要超过五个,请问各位前辈、这种情况该怎么处理呀?
/// </summary>
/// <param name="p">要检索的棋子的位置</param>
/// <param name="lenX">棋盘的横向边界</param>
/// <param name="lenY">棋盘的竖向边界</param>
/// <param name="arrCol">棋盘所有棋子</param>
/// <param name="col">要检索的棋子的颜色</param>
/// <param name="maxNum">标识连续白子或者黑子的最大个数,连续五子取胜,连续六子及六子以上视为自杀</param>
/// <param name="bo">是否取胜</param>
/// <param name="num">中间变量</param>
private void TreateMaxNum(Point p, int lenX, int lenY, Color[,] arrCol, Color col, ref int maxNum, ref bool bo, ref int num)
{
if (p.X < 0 || p.X > lenX || p.Y < 0 || p.Y > lenY)// 索引出界
return;
if (arrCol[p.X, p.Y] == col)//是否与要检索的棋子的颜色一致
{
num++;//颜色一致、连续棋子的个数加一
if (num == 5)//标识连续五子胜
{
if (num > maxNum)//(*****)
{
maxNum = num;//将连续棋子的个数赋值于maxNum
}
bo = true;//取胜
}
else if (num > 5)//标识六子及六子以上自杀
{
if (num > maxNum)//(*****)
{
maxNum = num;//将连续棋子的个数赋值于maxNum
}
bo = false;//此时为自杀
}
}
else//***//
{
num = 0;//归零
}
}