예제 #1
0
 private int EvalLine_p1(int[,] board, int x, int y, int i, int j, ref int flag, ref EvalResultLine ret)
 {
     if (board[i, j] == board[x, y])
     {
         ret.block = (ret.block != 0) ? 1 : 0;
         ret.count++;
         if (i == x && j == y)
         {
             flag = 1;
         }
     }
     else if (flag == 0) // 不包括当前子,要重置
     {
         if (board[i, j] == 0)
         {
             ret.block++;
         }
         ret.count = 0;
     }
     else // 包括当前子的联珠已算完,停下来
     {
         if (board[i, j] == 0)
         {
             ret.block++;
         }
         ret.count = (ret.count >= 5) ? 5 : ret.count;
         return(1);
     }
     return(0); // 不包括,继续
 }
예제 #2
0
        // 计算联珠数
        private EvalResult[] EvalLine(int[,] board, int x, int y)
        {
            int            i, j, flag;
            EvalResultLine line;

            EvalResult[] ret = new EvalResult[6]; // 使用 1~5
            for (i = 0; i < 6; i++)
            {
                ret[i].block = new int[4];
            }

            // 【——】
            i    = x;
            flag = 0; line = new EvalResultLine();
            for (j = 0; j < intSize; j++)
            {
                if (EvalLine_p1(board, x, y, i, j, ref flag, ref line) != 0)
                {
                    break;
                }
            }
            ret[line.count].block[ret[line.count].count] = line.block;
            ret[line.count].count++;

            // 【|】
            j    = y;
            flag = 0; line = new EvalResultLine();
            for (i = 0; i < intSize; i++)
            {
                if (EvalLine_p1(board, x, y, i, j, ref flag, ref line) != 0)
                {
                    break;
                }
            }
            ret[line.count].block[ret[line.count].count] = line.block;
            ret[line.count].count++;

            // 【\】
            flag = 0; line = new EvalResultLine();
            if (x >= y) // 右上部,从上边起
            {
                i = x - y;
                for (j = 0; i + j != intSize; j++)
                {
                    if (EvalLine_p1(board, x, y, i + j, j, ref flag, ref line) != 0)
                    {
                        break;
                    }
                }
            }
            else // 左下部,从左边起
            {
                j = y - x;
                for (i = 0; i + j != intSize; i++)
                {
                    if (EvalLine_p1(board, x, y, i, i + j, ref flag, ref line) != 0)
                    {
                        break;
                    }
                }
            }
            ret[line.count].block[ret[line.count].count] = line.block;
            ret[line.count].count++;

            // 【/】
            flag = 0; line = new EvalResultLine();
            if (x + y < intSize) // 左上部,从上边起
            {
                i = x + y;
                for (j = 0; i - j >= 0; j++)
                {
                    if (EvalLine_p1(board, x, y, i - j, j, ref flag, ref line) != 0)
                    {
                        break;
                    }
                }
            }
            else // 右下部,从右边起
            {
                j = x + y - intSize + 1;
                for (i = 0; i + j != intSize; i++)
                {
                    if (EvalLine_p1(board, x, y, intSize - i - 1, i + j, ref flag, ref line) != 0)
                    {
                        break;
                    }
                }
            }
            ret[line.count].block[ret[line.count].count] = line.block;
            ret[line.count].count++;

            return(ret);
        }