// Returns Tuple of Item1 = availableTurns, Item2 = oppositeDisksToFlip private Tuple <List <Coordinate>, List <Coordinate> > getAvailableTurnsAndCellsToFlip(eCellContent i_DiskType, Coordinate i_LastTurn) { var validMoves = new List <Coordinate>(); var oppositeDisk = (i_DiskType == eCellContent.O) ? eCellContent.X : eCellContent.O; eCellContent tempCellContent; var cellCandidatesToFlip = new List <Coordinate>(); var cellsToFlip = new List <Coordinate>(); var lastTurnRow = i_LastTurn != null ? i_LastTurn.Row : -1; var lastTurnColumn = i_LastTurn != null ? i_LastTurn.Column : -1; bool didContinue = true, didFindOppositePiece = false; for (int r = 0; r < Size; r++) { for (int c = 0; c < Size; c++) { if (GetCellContent(r, c) == i_DiskType) { // right horizontally cellCandidatesToFlip.Clear(); for (int i = c + 1; i < Size; i++) { tempCellContent = GetCellContent(r, i); if (tempCellContent == eCellContent.Empty && didFindOppositePiece == false) { didContinue = false; break; } if (tempCellContent == oppositeDisk && didContinue == true) { cellCandidatesToFlip.Add(new Coordinate(r, i)); didFindOppositePiece = true; continue; } else if (tempCellContent != oppositeDisk && tempCellContent != eCellContent.Empty && didContinue == true) { if (lastTurnRow == r && lastTurnColumn == i) { cellsToFlip.AddRange(cellCandidatesToFlip); } break; } else if (tempCellContent == eCellContent.Empty && didFindOppositePiece == true && didContinue == true) { validMoves.Add(new Coordinate(r, i)); break; } } // left horizontally didContinue = true; didFindOppositePiece = false; cellCandidatesToFlip.Clear(); for (int i = c - 1; i >= 0; i--) { tempCellContent = GetCellContent(r, i); if (tempCellContent == eCellContent.Empty && didFindOppositePiece == false) { didContinue = false; break; } if (tempCellContent == oppositeDisk && didContinue == true) { cellCandidatesToFlip.Add(new Coordinate(r, i)); didFindOppositePiece = true; continue; } else if (tempCellContent != oppositeDisk && tempCellContent != eCellContent.Empty && didContinue == true) { if (lastTurnRow == r && lastTurnColumn == i) { cellsToFlip.AddRange(cellCandidatesToFlip); } break; } else if (GetCellContent(r, i) == eCellContent.Empty && didFindOppositePiece == true && didContinue == true) { validMoves.Add(new Coordinate(r, i)); break; } } // down vertically didContinue = true; didFindOppositePiece = false; cellCandidatesToFlip.Clear(); for (int i = r + 1; i < Size; i++) { tempCellContent = GetCellContent(i, c); if (tempCellContent == eCellContent.Empty && didFindOppositePiece == false) { didContinue = false; break; } if (tempCellContent == oppositeDisk && didContinue == true) { cellCandidatesToFlip.Add(new Coordinate(i, c)); didFindOppositePiece = true; continue; } else if (tempCellContent != oppositeDisk && tempCellContent != eCellContent.Empty && didContinue == true) { if (lastTurnRow == i && lastTurnColumn == c) { cellsToFlip.AddRange(cellCandidatesToFlip); } break; } else if (tempCellContent == eCellContent.Empty && didFindOppositePiece == true && didContinue == true) { validMoves.Add(new Coordinate(i, c)); break; } } // up vertically didContinue = true; didFindOppositePiece = false; cellCandidatesToFlip.Clear(); for (int i = r - 1; i >= 0; i--) { tempCellContent = GetCellContent(i, c); if (tempCellContent == eCellContent.Empty && didFindOppositePiece == false) { didContinue = false; break; } if (tempCellContent == oppositeDisk && didContinue == true) { cellCandidatesToFlip.Add(new Coordinate(i, c)); didFindOppositePiece = true; continue; } else if (tempCellContent != oppositeDisk && tempCellContent != eCellContent.Empty && didContinue == true) { if (lastTurnRow == i && lastTurnColumn == c) { cellsToFlip.AddRange(cellCandidatesToFlip); } break; } else if (tempCellContent == eCellContent.Empty && didFindOppositePiece == true && didContinue == true) { validMoves.Add(new Coordinate(i, c)); break; } } // upper left diagonally didContinue = true; didFindOppositePiece = false; cellCandidatesToFlip.Clear(); for (int i = r - 1, j = c - 1; i >= 0 && j >= 0; i--, j--) { tempCellContent = GetCellContent(i, j); if (tempCellContent == eCellContent.Empty && didFindOppositePiece == false) { didContinue = false; break; } else if (tempCellContent == oppositeDisk && didContinue == true) { cellCandidatesToFlip.Add(new Coordinate(i, j)); didFindOppositePiece = true; continue; } else if (tempCellContent != oppositeDisk && tempCellContent != eCellContent.Empty) { if (lastTurnRow == i && lastTurnColumn == j) { cellsToFlip.AddRange(cellCandidatesToFlip); } break; } else if (tempCellContent == eCellContent.Empty && didFindOppositePiece == true) { validMoves.Add(new Coordinate(i, j)); break; } } // upper right diagonally didContinue = true; didFindOppositePiece = false; cellCandidatesToFlip.Clear(); for (int i = r - 1, j = c + 1; i >= 0 && j < Size; i--, j++) { tempCellContent = GetCellContent(i, j); if (tempCellContent == eCellContent.Empty && didFindOppositePiece == false) { didContinue = false; break; } if (tempCellContent == oppositeDisk && didContinue == true) { cellCandidatesToFlip.Add(new Coordinate(i, j)); didFindOppositePiece = true; continue; } else if (tempCellContent != oppositeDisk && tempCellContent != eCellContent.Empty) { if (lastTurnRow == i && lastTurnColumn == j) { cellsToFlip.AddRange(cellCandidatesToFlip); } break; } else if (tempCellContent == eCellContent.Empty && didFindOppositePiece == true) { validMoves.Add(new Coordinate(i, j)); break; } } // lower right diagonally didContinue = true; didFindOppositePiece = false; cellCandidatesToFlip.Clear(); for (int i = r + 1, j = c + 1; i < Size && j < Size; i++, j++) { tempCellContent = GetCellContent(i, j); if (tempCellContent == eCellContent.Empty && didFindOppositePiece == false) { didContinue = false; break; } if (tempCellContent == oppositeDisk && didContinue == true) { cellCandidatesToFlip.Add(new Coordinate(i, j)); didFindOppositePiece = true; continue; } else if (tempCellContent != oppositeDisk && tempCellContent != eCellContent.Empty) { if (lastTurnRow == i && lastTurnColumn == j) { cellsToFlip.AddRange(cellCandidatesToFlip); } break; } else if (tempCellContent == eCellContent.Empty && didFindOppositePiece == true) { validMoves.Add(new Coordinate(i, j)); break; } } // lower left diagonally didContinue = true; didFindOppositePiece = false; cellCandidatesToFlip.Clear(); for (int i = r + 1, j = c - 1; i < Size && j >= 0; i++, j--) { tempCellContent = GetCellContent(i, j); if (tempCellContent == eCellContent.Empty && didFindOppositePiece == false) { didContinue = false; break; } if (tempCellContent == oppositeDisk && didContinue == true) { cellCandidatesToFlip.Add(new Coordinate(i, j)); didFindOppositePiece = true; continue; } else if (tempCellContent != oppositeDisk && tempCellContent != eCellContent.Empty) { if (lastTurnRow == i && lastTurnColumn == j) { cellsToFlip.AddRange(cellCandidatesToFlip); } break; } else if (tempCellContent == eCellContent.Empty && didFindOppositePiece == true) { validMoves.Add(new Coordinate(i, j)); break; } } } } } //// cellsToFlip distinct cellsToFlip = cellsToFlip.GroupBy(cell => (cell.Row * 10) + cell.Column).Select(duplicates => duplicates.First()).ToList(); return(new Tuple <List <Coordinate>, List <Coordinate> >(validMoves, cellsToFlip)); }
public List <Coordinate> GetAvailableTurns(eCellContent i_DiskType) { return(getAvailableTurnsAndCellsToFlip(i_DiskType, null).Item1); }
public List <Coordinate> GetCellsToFlip(eCellContent i_DiskType, Coordinate i_LastTurn) { return(getAvailableTurnsAndCellsToFlip(i_DiskType, i_LastTurn).Item2); }
public void SetCellContent(int i_Row, int i_Column, eCellContent i_CellContent) { m_Map[i_Row, i_Column] = i_CellContent; }