internal CheckerSquare[] GetCheckerSquares(int i_PlayerID) { int k = 0; int size = i_PlayerID == 0 ? m_NumX : m_NumO; CheckerSquare[] cSquare = new CheckerSquare[size]; for (int i = 0; i < m_Size; i++) { for (int j = 0; j < m_Size; j++) { if (i_PlayerID == 1) { if (m_Table[i, j].m_CheckerMan.m_Type == CheckersMan.eType.O || m_Table[i, j].m_CheckerMan.m_Type == CheckersMan.eType.U) { cSquare[k++] = m_Table[i, j]; } } else { if (m_Table[i, j].m_CheckerMan.m_Type == CheckersMan.eType.K || m_Table[i, j].m_CheckerMan.m_Type == CheckersMan.eType.X) { cSquare[k++] = m_Table[i, j]; } } } } return(cSquare); }
internal bool isLegalMove(string i_MoveCommand, ref Player i_MovePlayer) { int[] startPoint = getStartPoint(i_MoveCommand); int[] endPoint = getEndPoint(i_MoveCommand); CheckerSquare currentSquare = m_CheckersTable.m_Table[startPoint[0], startPoint[1]]; CheckerSquare targetSquare = m_CheckersTable.m_Table[endPoint[0], endPoint[1]]; // checks if the squares are inside the border of the table bool firstCheck = isSquaresInBorder(currentSquare, targetSquare); firstCheck = firstCheck && (currentSquare.m_CheckerMan.m_Type == i_MovePlayer.m_FirstType || currentSquare.m_CheckerMan.m_Type == i_MovePlayer.m_SecondType); // checks if currentsquare is occupied and the target square isnt bool secondCheck = currentSquare.isOccupied() && !targetSquare.isOccupied(); // check if the move is diagonal, otherwise if its eating move bool thirdCheck = false; bool fourthCheck = false; if (firstCheck && secondCheck) { thirdCheck = isDiagonalMove(currentSquare, targetSquare); if (isEatMove(currentSquare, targetSquare)) { CheckerSquare SquareToFree = null; fourthCheck = isLegalEat(currentSquare, targetSquare, ref SquareToFree); } } return(firstCheck && secondCheck && (thirdCheck || fourthCheck)); }
internal string canEatAfterEat(CheckerSquare i_Square) { string[] possibleMoves = getPossibleMoves(i_Square); string eatMove = string.Empty; for (int i = 0; i < possibleMoves.Length; i++) { int[] startPoint = getStartPoint(possibleMoves[i]); int[] endPoint = getEndPoint(possibleMoves[i]); CheckerSquare currentSquare = m_CheckersTable.m_Table[startPoint[0], startPoint[1]]; CheckerSquare targetSquare = m_CheckersTable.m_Table[endPoint[0], endPoint[1]]; if (isEatMove(currentSquare, targetSquare)) { CheckerSquare SquareToFree = null; bool isLegEat = isLegalEat(currentSquare, targetSquare, ref SquareToFree); if (isLegEat) { eatMove = possibleMoves[i]; break; } } } return(eatMove); }
private bool canOEatDownSideRight(CheckerSquare i_CurrentSquare, CheckerSquare i_TargetSquare) { bool canEat = (m_CheckersTable.m_Table[i_CurrentSquare.m_Posx + 1, i_CurrentSquare.m_Posy + 1].m_CheckerMan.m_Type == CheckersMan.eType.X || m_CheckersTable.m_Table[i_CurrentSquare.m_Posx + 1, i_CurrentSquare.m_Posy + 1].m_CheckerMan.m_Type == CheckersMan.eType.K) && m_CheckersTable.m_Table[i_CurrentSquare.m_Posx + 2, i_CurrentSquare.m_Posy + 2].m_CheckerMan.m_Type == CheckersMan.eType.None; return(canEat); }
private bool canXEatUpSideRight(CheckerSquare i_CurrentSquare, CheckerSquare i_TargetSquare) { bool canEat = (m_CheckersTable.m_Table[i_CurrentSquare.m_Posx - 1, i_CurrentSquare.m_Posy + 1].m_CheckerMan.m_Type == CheckersMan.eType.O || m_CheckersTable.m_Table[i_CurrentSquare.m_Posx - 1, i_CurrentSquare.m_Posy + 1].m_CheckerMan.m_Type == CheckersMan.eType.U) && m_CheckersTable.m_Table[i_CurrentSquare.m_Posx - 2, i_CurrentSquare.m_Posy + 2].m_CheckerMan.m_Type == CheckersMan.eType.None; return(canEat); }
private bool canUEatUpSideLeft(CheckerSquare i_CurrentSquare, CheckerSquare i_TargetSquare) { bool canEat = (m_CheckersTable.m_Table[i_CurrentSquare.m_Posx - 1, i_CurrentSquare.m_Posy - 1].m_CheckerMan.m_Type == CheckersMan.eType.X || m_CheckersTable.m_Table[i_CurrentSquare.m_Posx - 1, i_CurrentSquare.m_Posy - 1].m_CheckerMan.m_Type == CheckersMan.eType.K) && m_CheckersTable.m_Table[i_CurrentSquare.m_Posx - 2, i_CurrentSquare.m_Posy - 2].m_CheckerMan.m_Type == CheckersMan.eType.None; return(canEat); }
private bool canKEatDownSideLeft(CheckerSquare i_CurrentSquare, CheckerSquare i_TargetSquare) { bool canEat = (m_CheckersTable.m_Table[i_CurrentSquare.m_Posx + 1, i_CurrentSquare.m_Posy - 1].m_CheckerMan.m_Type == CheckersMan.eType.O || m_CheckersTable.m_Table[i_CurrentSquare.m_Posx + 1, i_CurrentSquare.m_Posy - 1].m_CheckerMan.m_Type == CheckersMan.eType.U) && m_CheckersTable.m_Table[i_CurrentSquare.m_Posx + 2, i_CurrentSquare.m_Posy - 2].m_CheckerMan.m_Type == CheckersMan.eType.None; return(canEat); }
internal bool isEatMove(string i_MoveMessage) { int[] startPoint = getStartPoint(i_MoveMessage); int[] endPoint = getEndPoint(i_MoveMessage); CheckerSquare currentSquare = m_CheckersTable.m_Table[startPoint[0], startPoint[1]]; CheckerSquare targetSquare = m_CheckersTable.m_Table[endPoint[0], endPoint[1]]; return(isSquaresInBorder(currentSquare, targetSquare) && isEatMove(currentSquare, targetSquare)); }
private bool isLegalEatForMen(CheckerSquare i_CurrentSquare, CheckerSquare i_TargetSquare, ref CheckerSquare i_SquareToFree) { bool isLegalForMen = false; if (i_CurrentSquare.m_CheckerMan.m_Type == CheckersMan.eType.X) { isLegalForMen = isLegalEatForX(i_CurrentSquare, i_TargetSquare, ref i_SquareToFree); } else { isLegalForMen = isLegalEatForO(i_CurrentSquare, i_TargetSquare, ref i_SquareToFree); } return(isLegalForMen); }
private bool isLegalEatForKings(CheckerSquare i_CurrentSquare, CheckerSquare i_TargetSquare, ref CheckerSquare i_SquareToFree) { bool isLegalEatForKing = false; if (i_CurrentSquare.m_CheckerMan.m_Type == CheckersMan.eType.K) { isLegalEatForKing = isLegalEatForK(i_CurrentSquare, i_TargetSquare, ref i_SquareToFree); } else { isLegalEatForKing = isLegalEatForU(i_CurrentSquare, i_TargetSquare, ref i_SquareToFree); } return(isLegalEatForKing); }
internal bool isLegalEat(CheckerSquare i_CurrentSquare, CheckerSquare i_TargetSquare, ref CheckerSquare i_SquareToFree) { bool isLegalEat = false; if (i_CurrentSquare.m_CheckerMan.m_Type == CheckersMan.eType.K || i_CurrentSquare.m_CheckerMan.m_Type == CheckersMan.eType.U) { isLegalEat = isLegalEatForKings(i_CurrentSquare, i_TargetSquare, ref i_SquareToFree); } else { isLegalEat = isLegalEatForMen(i_CurrentSquare, i_TargetSquare, ref i_SquareToFree); } return(isLegalEat); }
private string[] getPossibleMovesAfterEat(CheckerSquare i_CurrentSquare) { string[] possibleMoves; possibleMoves = new string[8]; possibleMoves[0] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx + 1, i_CurrentSquare.m_Posy + 1); possibleMoves[1] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx + 1, i_CurrentSquare.m_Posy - 1); possibleMoves[2] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx - 1, i_CurrentSquare.m_Posy + 1); possibleMoves[3] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx - 1, i_CurrentSquare.m_Posy - 1); possibleMoves[4] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx + 2, i_CurrentSquare.m_Posy + 2); possibleMoves[5] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx + 2, i_CurrentSquare.m_Posy - 2); possibleMoves[6] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx - 2, i_CurrentSquare.m_Posy + 2); possibleMoves[7] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx - 2, i_CurrentSquare.m_Posy - 2); return(possibleMoves); }
private bool isLegalEatForO(CheckerSquare i_CurrentSquare, CheckerSquare i_TargetSquare, ref CheckerSquare i_SquareToFree) { bool isLegalForMen = false; if (i_CurrentSquare.m_Posx < m_TableSize - 2) { if (i_CurrentSquare.m_Posy < i_TargetSquare.m_Posy && i_CurrentSquare.m_Posy < m_TableSize - 2) { isLegalForMen = canOEatDownSideRight(i_CurrentSquare, i_TargetSquare); i_SquareToFree = m_CheckersTable.m_Table[i_CurrentSquare.m_Posx + 1, i_CurrentSquare.m_Posy + 1]; } else if (i_CurrentSquare.m_Posy > i_TargetSquare.m_Posy && i_CurrentSquare.m_Posy > 1) { isLegalForMen = canOEatDownSideLeft(i_CurrentSquare, i_TargetSquare); i_SquareToFree = m_CheckersTable.m_Table[i_CurrentSquare.m_Posx + 1, i_CurrentSquare.m_Posy - 1]; } } return(isLegalForMen); }
private void initTable() { int numOfMen = calcNumOfMen(); m_Table = new CheckerSquare[m_Size, m_Size]; initUpperSide(); // space of 2 lines between the oponnents CheckersMan cMan = new CheckersMan(CheckersMan.eType.None); for (int i = (m_Size - 1) / 2; i < ((m_Size / 2) + 1); i++) { for (int j = 0; j < m_Size; j++) { m_Table[i, j] = new CheckerSquare(i, j, cMan); } } initBottomSide(); }
private bool isEatMove(CheckerSquare i_CurrentSquare, CheckerSquare i_TargetSquare) { bool isEatMove = false; if (i_CurrentSquare.m_CheckerMan.m_Type == CheckersMan.eType.X) { isEatMove = i_CurrentSquare.m_Posx == (i_TargetSquare.m_Posx + 2); } else if (!m_Player.m_JustAte && i_CurrentSquare.m_CheckerMan.m_Type == CheckersMan.eType.O) { isEatMove = i_CurrentSquare.m_Posx == (i_TargetSquare.m_Posx - 2); } else { isEatMove = Math.Abs(i_CurrentSquare.m_Posx - i_TargetSquare.m_Posx) == 2; } isEatMove = isEatMove && Math.Abs(i_CurrentSquare.m_Posy - i_TargetSquare.m_Posy) == 2; return(isEatMove); }
private bool isDiagonalMove(CheckerSquare i_CurrentSquare, CheckerSquare i_TargetSquare) { bool isDiagonal = false; if (i_CurrentSquare.m_CheckerMan.m_Type == CheckersMan.eType.X) { isDiagonal = i_CurrentSquare.m_Posx == (i_TargetSquare.m_Posx + 1); } else if (i_CurrentSquare.m_CheckerMan.m_Type == CheckersMan.eType.O) { isDiagonal = i_CurrentSquare.m_Posx == (i_TargetSquare.m_Posx - 1); } else { isDiagonal = Math.Abs(i_CurrentSquare.m_Posx - i_TargetSquare.m_Posx) == 1; } isDiagonal = isDiagonal && Math.Abs(i_CurrentSquare.m_Posy - i_TargetSquare.m_Posy) == 1; return(isDiagonal); }
// perform a move // internal void move(string i_MoveCommand, Player i_Player, bool i_punish) { CheckersLogic cLogic = new CheckersLogic(this, i_Player); int[] startPoint = cLogic.getStartPoint(i_MoveCommand); int[] endPoint = cLogic.getEndPoint(i_MoveCommand); CheckerSquare currentSquare = m_Table[startPoint[0], startPoint[1]]; CheckerSquare targetSquare = m_Table[endPoint[0], endPoint[1]]; CheckerSquare SquareToFree = null; // make the move ! if (cLogic.isLegalEat(currentSquare, targetSquare, ref SquareToFree)) { // perform the eat if (SquareToFree.m_CheckerMan.returnType().Equals(" K ") || SquareToFree.m_CheckerMan.returnType().Equals(" X ")) { m_NumX--; } else { m_NumO--; } SquareToFree.free(); } if ((targetSquare.m_Posx == 0 || targetSquare.m_Posx == m_Size - 1) && currentSquare.m_CheckerMan.m_Type != CheckersMan.eType.K && currentSquare.m_CheckerMan.m_Type != CheckersMan.eType.U) { if (currentSquare.m_CheckerMan.m_Type == CheckersMan.eType.X) { currentSquare.m_CheckerMan = new CheckersMan(CheckersMan.eType.K); } else if (currentSquare.m_CheckerMan.m_Type == CheckersMan.eType.O) { currentSquare.m_CheckerMan = new CheckersMan(CheckersMan.eType.U); } } targetSquare.m_CheckerMan = new CheckersMan(currentSquare.m_CheckerMan.m_Type); currentSquare.m_CheckerMan.m_Type = CheckersMan.eType.None; }
private bool isLegalEatForK(CheckerSquare i_CurrentSquare, CheckerSquare i_TargetSquare, ref CheckerSquare i_SquareToFree) { bool isLegalEatForKing = false; // check what kind of eat is it if (i_CurrentSquare.m_Posx == i_TargetSquare.m_Posx + 2) { if (i_CurrentSquare.m_Posx > 1) { if (i_CurrentSquare.m_Posy < i_TargetSquare.m_Posy && i_CurrentSquare.m_Posy < m_TableSize - 2) { isLegalEatForKing = canXEatUpSideRight(i_CurrentSquare, i_TargetSquare); i_SquareToFree = m_CheckersTable.m_Table[i_CurrentSquare.m_Posx - 1, i_CurrentSquare.m_Posy + 1]; } else if (i_CurrentSquare.m_Posy > i_TargetSquare.m_Posy && i_CurrentSquare.m_Posy > 1) { isLegalEatForKing = canXEatUpSideLeft(i_CurrentSquare, i_TargetSquare); i_SquareToFree = m_CheckersTable.m_Table[i_CurrentSquare.m_Posx - 1, i_CurrentSquare.m_Posy - 1]; } } } else { if (i_CurrentSquare.m_Posx < m_TableSize - 2) { if (i_CurrentSquare.m_Posy < i_TargetSquare.m_Posy && i_CurrentSquare.m_Posy < m_TableSize - 2) { isLegalEatForKing = canKEatDownSideRight(i_CurrentSquare, i_TargetSquare); i_SquareToFree = m_CheckersTable.m_Table[i_CurrentSquare.m_Posx + 1, i_CurrentSquare.m_Posy + 1]; } else if (i_CurrentSquare.m_Posy > i_TargetSquare.m_Posy && i_CurrentSquare.m_Posy > 1) { isLegalEatForKing = canKEatDownSideLeft(i_CurrentSquare, i_TargetSquare); i_SquareToFree = m_CheckersTable.m_Table[i_CurrentSquare.m_Posx + 1, i_CurrentSquare.m_Posy - 1]; } } } return(isLegalEatForKing); }
internal string[] getPossibleMoves(CheckerSquare i_CurrentSquare) { string[] possibleMoves; if (i_CurrentSquare.m_CheckerMan.m_Type == CheckersMan.eType.K || i_CurrentSquare.m_CheckerMan.m_Type == CheckersMan.eType.U) { possibleMoves = new string[8]; possibleMoves[0] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx + 1, i_CurrentSquare.m_Posy + 1); possibleMoves[1] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx + 1, i_CurrentSquare.m_Posy - 1); possibleMoves[2] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx - 1, i_CurrentSquare.m_Posy + 1); possibleMoves[3] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx - 1, i_CurrentSquare.m_Posy - 1); possibleMoves[4] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx + 2, i_CurrentSquare.m_Posy + 2); possibleMoves[5] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx + 2, i_CurrentSquare.m_Posy - 2); possibleMoves[6] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx - 2, i_CurrentSquare.m_Posy + 2); possibleMoves[7] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx - 2, i_CurrentSquare.m_Posy - 2); } else if (i_CurrentSquare.m_CheckerMan.m_Type == CheckersMan.eType.X) { possibleMoves = new string[6]; possibleMoves[0] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx - 1, i_CurrentSquare.m_Posy + 1); possibleMoves[1] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx - 1, i_CurrentSquare.m_Posy - 1); possibleMoves[2] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx + 2, i_CurrentSquare.m_Posy + 2); possibleMoves[3] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx + 2, i_CurrentSquare.m_Posy - 2); possibleMoves[4] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx - 2, i_CurrentSquare.m_Posy + 2); possibleMoves[5] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx - 2, i_CurrentSquare.m_Posy - 2); } else { possibleMoves = new string[6]; possibleMoves[0] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx + 1, i_CurrentSquare.m_Posy + 1); possibleMoves[1] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx + 1, i_CurrentSquare.m_Posy - 1); possibleMoves[2] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx + 2, i_CurrentSquare.m_Posy + 2); possibleMoves[3] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx + 2, i_CurrentSquare.m_Posy - 2); possibleMoves[4] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx - 2, i_CurrentSquare.m_Posy + 2); possibleMoves[5] = createMoveFromIndices(i_CurrentSquare.m_Posx, i_CurrentSquare.m_Posy, i_CurrentSquare.m_Posx - 2, i_CurrentSquare.m_Posy - 2); } return(possibleMoves); }
private void initUpperSide() { CheckersMan cMan; // occupy the squares on the upper side of the table for (int i = 0; i < ((m_Size - 1) / 2); i++) { for (int j = 0; j < m_Size; j++) { if ((i + j) % 2 == 1) { cMan = new CheckersMan(CheckersMan.eType.O); m_Table[i, j] = new CheckerSquare(i, j, cMan); } else { cMan = new CheckersMan(CheckersMan.eType.None); m_Table[i, j] = new CheckerSquare(i, j, cMan); } } } }
private void initBottomSide() { CheckersMan cMan; int bottomSide = (m_Size / 2) + 1; // put men on the bottom side of the table for (int i = bottomSide; i < m_Size; i++) { for (int j = 0; j < m_Size; j++) { if ((i + j) % 2 == 1) { cMan = new CheckersMan(CheckersMan.eType.X); m_Table[i, j] = new CheckerSquare(i, j, cMan); } else { cMan = new CheckersMan(CheckersMan.eType.None); m_Table[i, j] = new CheckerSquare(i, j, cMan); } } } }
private bool isSquaresInBorder(CheckerSquare i_CurrentSquare, CheckerSquare i_TargetSquare) { return(i_CurrentSquare != null && i_TargetSquare != null); }