/// <summary> /// Зачеркивание выиграшной комбинации /// </summary> /// <param name="ltd">Координаты комбинации</param> /// <param name="line">Ориентация линии</param> public void DrawLine(LineToDraw ltd, char line) { int x1 = cellSize * ltd.StartX + mathLineX() + cellSize / 2; int y1 = cellSize * ltd.StartY + mathLineY() + cellSize / 2; int x2 = cellSize * ltd.EndX + mathLineX() + cellSize / 2; int y2 = cellSize * ltd.EndY + mathLineY() + cellSize / 2; switch (line) { case '|': y1 -= cellSize / 2; y2 += cellSize / 2; break; case '-': x1 -= cellSize / 2; x2 += cellSize / 2; break; case '\\': x1 -= cellSize / 2; y1 -= cellSize / 2; x2 += cellSize / 2; y2 += cellSize / 2; break; case '/': x1 -= cellSize / 2; y1 += cellSize / 2; x2 += cellSize / 2; y2 -= cellSize / 2; break; } gField.DrawLine(linePen, x1, y1, x2, y2); }
/// <summary> /// Проверка всех выиграшных возможностей /// </summary> /// <param name="iY">Индекс строки</param> /// <param name="iX">Индекс столбца</param> /// <param name="mark">Отметка</param> /// <param name="ltd">Линия для отрисовки</param> /// <returns>Возвращает символ, для отрисовки линии</returns> char CheckObliqueLine(int iY, int iX, Mark mark, ref LineToDraw ltd) { ltd.SetStart(iY, iX); ltd.SetEnd(iY, iX); int forward = 1, backslash = 1; for (int i = 1; i <= lineToWin; i++) { if (iX + i < cells.GetLength(1) && iY + i < cells.GetLength(0)) { if (cells[iY + i, iX + i] == mark) { forward++; ltd.SetEnd(iY + i, iX + i); continue; } } break; } for (int i = 1; i <= lineToWin; i++) { if (iX - i >= 0 && iY - i >= 0) { if (cells[iY - i, iX - i] == mark) { forward++; ltd.SetStart(iY - i, iX - i); continue; } } break; } if (forward >= lineToWin) { return('\\'); } for (int j = 1; j <= lineToWin; j++) { if (iY - j >= 0 && iX + j < cells.GetLength(1)) { if (cells[iY - j, iX + j] == mark) { backslash++; ltd.SetEnd(iY - j, iX + j); continue; } } break; } for (int j = 1; j <= lineToWin; j++) { if (iY + j < cells.GetLength(0) && iX - j >= 0) { if (cells[iY + j, iX - j] == mark) { backslash++; ltd.SetStart(iY + j, iX - j); continue; } } break; } if (backslash >= lineToWin) { return('/'); } return(' '); }
/// <summary> /// Проверка всех выиграшных возможностей /// </summary> /// <param name="iY">Индекс строки</param> /// <param name="iX">Индекс столбца</param> /// <param name="mark">Отметка</param> /// <param name="ltd">Линия для отрисовки</param> /// <returns>Возвращает символ, для отрисовки линии</returns> char CheckStaightLine(int iY, int iX, Mark mark, out LineToDraw ltd) { ltd = new LineToDraw(iY, iX, iY, iX); // Предполагается что текущий ход уже имеет 1 заполненую ячейку int totalX = 1, totalY = 1; for (int i = 1; i <= lineToWin; i++) { if (iX + i < cells.GetLength(1)) { if (cells[iY, iX + i] == mark) { totalX++; ltd.SetEnd(iY, iX + i); continue; } } break; } for (int i = 1; i <= lineToWin; i++) { if (iX - i >= 0) { if (cells[iY, iX - i] == mark) { totalX++; ltd.SetStart(iY, iX - i); continue; } } break; } if (totalX >= lineToWin) { return('-'); } for (int j = 1; j <= lineToWin; j++) { if (iY + j < cells.GetLength(0)) { if (cells[iY + j, iX] == mark) { totalY++; ltd.SetEnd(iY + j, iX); continue; } } break; } for (int j = 1; j <= lineToWin; j++) { if (iY - j >= 0) { if (cells[iY - j, iX] == mark) { totalY++; ltd.SetStart(iY - j, iX); continue; } } break; } if (totalY >= lineToWin) { return('|'); } return(' '); }