//Handles the turn of a given player use arrow keys to move cursor and select a position on the board and then 'Enter' or 'Space' to select it. //If the move is possible then the given player's piece will be placed on the board and the board will update. //'S' can be pressed to skip the player's turn if he/she so chooses. private void PlayerTurn(State playerState) { bool turnIsOver = false; string initialTurnStatus; string turnStatus; string playerSymbol; string enemySymbol; //Sets up initial variables based on the given State of the player. if (playerState == State.Cross) { initialTurnStatus = "\nPlayer 1's turn:\nPress 'Enter' or 'Space' to place piece.\nIf unable to make a move press 'S' to skip turn."; turnStatus = initialTurnStatus; playerSymbol = "X"; enemySymbol = "O"; } else { initialTurnStatus = "\nPlayer 2's turn:\nPress 'Enter' or 'Space' to place piece.\nIf unable to make a move press 'S' to skip turn."; turnStatus = initialTurnStatus; playerSymbol = "O"; enemySymbol = "X"; } //Loops until a either a valid move is made or if the player skips his/her turn. while (!turnIsOver) { Console.Clear(); _board.DrawBoard(); Console.WriteLine(turnStatus); const int cursorOffsetLeft = 3; const int cursorOffsetTop = 1; int cLeft = cursorOffsetLeft; int cTop = cursorOffsetTop; bool piecePlaced = false; bool skipPressed = false; Position selectedPos = new Position((cLeft / cursorOffsetLeft) - 1, (cTop / cursorOffsetTop) - 1); do { while (!Console.KeyAvailable) { Console.SetCursorPosition(cLeft, cTop); Console.Write(playerSymbol); if (_board.GetStateAt(selectedPos) == State.Circle) { Console.SetCursorPosition(cLeft, cTop); Console.Write(enemySymbol); } } switch (Console.ReadKey().Key) { case ConsoleKey.UpArrow: { cTop -= cursorOffsetTop; if (cTop <= 0) { cTop += cursorOffsetTop; } break; } case ConsoleKey.DownArrow: { cTop += cursorOffsetTop; if (cTop > cursorOffsetTop * _board.SideDimensions) { cTop -= cursorOffsetTop; } break; } case ConsoleKey.LeftArrow: { cLeft -= cursorOffsetLeft; if (cLeft <= 0) { cLeft += cursorOffsetLeft; } break; } case ConsoleKey.RightArrow: { cLeft += cursorOffsetLeft; if (cLeft > cursorOffsetLeft * _board.SideDimensions) { cLeft -= cursorOffsetLeft; } break; } case ConsoleKey.Enter: case ConsoleKey.Spacebar: { piecePlaced = true; break; } case ConsoleKey.S: { skipPressed = true; break; } default: { break; } } selectedPos = new Position((cLeft / cursorOffsetLeft) - 1, (cTop / cursorOffsetTop) - 1); Console.SetCursorPosition(0, 0); _board.DrawBoard(); Console.WriteLine(turnStatus); }while (!piecePlaced && !skipPressed); if (skipPressed) { break; } //Move is valid if it's on an empty space, adjacent to an enemy piece, and if it surrounds(captures) an enemy piece. else if (!_board.IsEmptyAt(selectedPos)) { turnStatus = "\nSpace is already occupied!\n" + initialTurnStatus; continue; } else if (!_board.IsAdjacentToEnemyPiece(selectedPos, playerState)) { turnStatus = "\nPiece is not adjacent to any opponent pieces!\n" + initialTurnStatus; continue; } else if (_board.AttemptPlacePieceAt(selectedPos, playerState)) { turnIsOver = true; Console.Clear(); _board.DrawBoard(); } else { turnStatus = "\nCan not capture any opponent pieces from this position!\n" + initialTurnStatus; continue; } } }