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); // 不包括,继续 }
// 计算联珠数 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); }