AS 2019 TakePiece

From TRCCompSci - AQA Computer Science
Revision as of 11:55, 1 April 2019 by Admin (talk | contribs) (ListPossibleMoves)
Jump to: navigation, search

Issues

I have completed this improvement, and there are many sections to make this work.I think it is unlikely to be asked to do this, but you need to:

  • Add to the MoveRecord Struct (CanTake boolean, TakeRow & TakeColumn)
  • Duplicate ValidJump and create ValidTake
  • Add loads to ListPossibleMoves
  • Changes to MakeMove

Changes to Struct

Find the current MoveRecord struct:

        struct MoveRecord
        {
            public string Piece;
            public int NewRow;
            public int NewColumn;
            public bool CanJump;
        }

Add the following variables to get:

        struct MoveRecord
        {
            public string Piece;
            public int NewRow;
            public int NewColumn;
            public bool CanJump;
            public bool CanTake;
            public int TakeRow;
            public int TakeColumn;
        }

ValidTake

Create the following method by duplicating valid jump, then change to this:

        private static bool ValidTake(string[,] board, int[,] playersPieces, string piece, int newRow, int newColumn)
        {
            bool valid = false;
            string middlePiece = "";
            string player, oppositePiecePlayer, middlePiecePlayer;
            int index, currentRow, currentColumn, middlePieceRow, middlePieceColumn;
            player = piece[0].ToString().ToLower();
            index = Convert.ToInt32(piece.Substring(1));
            if (player == "a")
            {
                oppositePiecePlayer = "b";
            }
            else
            {
                oppositePiecePlayer = "a";
            }
            if (newRow >= 0 && newRow < BoardSize &&
                newColumn >= 0 && newColumn < BoardSize)
            {
                if (board[newRow, newColumn] == Space)
                {
                    currentRow = playersPieces[index, Row];
                    currentColumn = playersPieces[index, Column];
                    middlePieceRow = (currentRow + newRow) / 2;
                    middlePieceColumn = (currentColumn + newColumn) / 2;
                    middlePiece = board[middlePieceRow, middlePieceColumn];
                    middlePiecePlayer = middlePiece[0].ToString().ToLower();
                    if (middlePiecePlayer == oppositePiecePlayer && middlePiecePlayer != " ") //change this
                    {
                        valid = true;
                    }
                }
            }
            return valid;
        }

ListPossibleMoves

The for loop cycles through each piece, you will see inside this loop are several if statements. The last 2 check if any valid jumps are possible. So find this code:

                    if (ValidJump(board, playersPieces, piece, jumpRow, jumpLeftColumn))
                    {
                        Console.WriteLine(piece + " can jump to " + jumpRow + " , " + jumpLeftColumn);
                        numberOfMoves++;
                        listOfMoves[numberOfMoves].Piece = piece;
                        listOfMoves[numberOfMoves].NewRow = jumpRow;
                        listOfMoves[numberOfMoves].NewColumn = jumpLeftColumn;
                        listOfMoves[numberOfMoves].CanJump = true;
                    }
                    if (ValidJump(board, playersPieces, piece, jumpRow, jumpRightColumn))
                    {
                        Console.WriteLine(piece + " can jump to " + jumpRow + " , " + jumpRightColumn);
                        numberOfMoves++;
                        listOfMoves[numberOfMoves].Piece = piece;
                        listOfMoves[numberOfMoves].NewRow = jumpRow;
                        listOfMoves[numberOfMoves].NewColumn = jumpRightColumn;
                        listOfMoves[numberOfMoves].CanJump = true;
                    }

Copy these two if statements and paste directly underneath, and change ValidJump to ValidTake:

                    if (ValidTake(board, playersPieces, piece, jumpRow, jumpLeftColumn))
                    {
                        Console.WriteLine(piece + " can take piece and go to " + jumpRow + " , " + jumpLeftColumn);
                        numberOfMoves++;
                        listOfMoves[numberOfMoves].Piece = piece;
                        listOfMoves[numberOfMoves].NewRow = jumpRow;
                        listOfMoves[numberOfMoves].NewColumn = jumpLeftColumn;
                        listOfMoves[numberOfMoves].CanJump = true;
                        listOfMoves[numberOfMoves].CanTake = true;
                        listOfMoves[numberOfMoves].TakeRow = currentRow + direction;
                        listOfMoves[numberOfMoves].TakeColumn = jumpLeftColumn + 1;

                    }
                    if (ValidTake(board, playersPieces, piece, jumpRow, jumpRightColumn))
                    {
                        Console.WriteLine(piece + " can take piece and go to " + jumpRow + " , " + jumpRightColumn);
                        numberOfMoves++;
                        listOfMoves[numberOfMoves].Piece = piece;
                        listOfMoves[numberOfMoves].NewRow = jumpRow;
                        listOfMoves[numberOfMoves].NewColumn = jumpRightColumn;
                        listOfMoves[numberOfMoves].CanJump = true;
                        listOfMoves[numberOfMoves].CanTake = true;
                        listOfMoves[numberOfMoves].TakeRow = currentRow + direction;
                        listOfMoves[numberOfMoves].TakeColumn = jumpRightColumn - 1;
                    }

The code above will also set the CanTake, TakeRow, and TakeColumn if a take is possible.

Finally, we need to not list any moves for a taken piece. So again in ListPossibleMoves, the if statements to check ValidMove, ValidJump, and Valid take can be wrapped in an if statement to check if the Row & Column are set to -1:

        if (currentRow != -1 && currentColumn!=-1)
        { 
                piece = nextPlayer + i;
                currentRow = playersPieces[i, Row];
                currentColumn = playersPieces[i, Column];
                if (playersPieces[i, Dame] == 1)
                {
                    piece = piece.ToUpper();
                }
                newRow = currentRow + direction;
                leftColumn = currentColumn - 1;
                rightColumn = currentColumn + 1;
                if (currentRow != -1 && currentColumn!=-1)
                {
                    if (ValidMove(board, newRow, leftColumn))
                    {
                        Console.WriteLine(piece + " can move to " + newRow + " , " + leftColumn);
                        numberOfMoves++;
                        listOfMoves[numberOfMoves].Piece = piece;
                        listOfMoves[numberOfMoves].NewRow = newRow;
                        listOfMoves[numberOfMoves].NewColumn = leftColumn;
                        listOfMoves[numberOfMoves].CanJump = false;
                    }
                    if (ValidMove(board, newRow, rightColumn))
                    {
                        Console.WriteLine(piece + " can move to " + newRow + " , " + rightColumn);
                        numberOfMoves++;
                        listOfMoves[numberOfMoves].Piece = piece;
                        listOfMoves[numberOfMoves].NewRow = newRow;
                        listOfMoves[numberOfMoves].NewColumn = rightColumn;
                        listOfMoves[numberOfMoves].CanJump = false;
                    }
                    jumpRow = currentRow + direction + direction;
                    jumpLeftColumn = currentColumn - 2;
                    jumpRightColumn = currentColumn + 2;
                    if (ValidJump(board, playersPieces, piece, jumpRow, jumpLeftColumn))
                    {
                        Console.WriteLine(piece + " can jump to " + jumpRow + " , " + jumpLeftColumn);
                        numberOfMoves++;
                        listOfMoves[numberOfMoves].Piece = piece;
                        listOfMoves[numberOfMoves].NewRow = jumpRow;
                        listOfMoves[numberOfMoves].NewColumn = jumpLeftColumn;
                        listOfMoves[numberOfMoves].CanJump = true;
                    }
                    if (ValidJump(board, playersPieces, piece, jumpRow, jumpRightColumn))
                    {
                        Console.WriteLine(piece + " can jump to " + jumpRow + " , " + jumpRightColumn);
                        numberOfMoves++;
                        listOfMoves[numberOfMoves].Piece = piece;
                        listOfMoves[numberOfMoves].NewRow = jumpRow;
                        listOfMoves[numberOfMoves].NewColumn = jumpRightColumn;
                        listOfMoves[numberOfMoves].CanJump = true;
                    }
                    if (ValidTake(board, playersPieces, piece, jumpRow, jumpLeftColumn))
                    {
                        Console.WriteLine(piece + " can take piece and go to " + jumpRow + " , " + jumpLeftColumn);
                        numberOfMoves++;
                        listOfMoves[numberOfMoves].Piece = piece;
                        listOfMoves[numberOfMoves].NewRow = jumpRow;
                        listOfMoves[numberOfMoves].NewColumn = jumpLeftColumn;
                        listOfMoves[numberOfMoves].CanJump = true;
                        listOfMoves[numberOfMoves].CanTake = true;
                        listOfMoves[numberOfMoves].TakeRow = currentRow + direction;
                        listOfMoves[numberOfMoves].TakeColumn = jumpLeftColumn + 1;

                    }
                    if (ValidTake(board, playersPieces, piece, jumpRow, jumpRightColumn))
                    {
                        Console.WriteLine(piece + " can take piece and go to " + jumpRow + " , " + jumpRightColumn);
                        numberOfMoves++;
                        listOfMoves[numberOfMoves].Piece = piece;
                        listOfMoves[numberOfMoves].NewRow = jumpRow;
                        listOfMoves[numberOfMoves].NewColumn = jumpRightColumn;
                        listOfMoves[numberOfMoves].CanJump = true;
                        listOfMoves[numberOfMoves].CanTake = true;
                        listOfMoves[numberOfMoves].TakeRow = currentRow + direction;
                        listOfMoves[numberOfMoves].TakeColumn = jumpRightColumn - 1;
                    }
        }

Make Move

Change the if statement:

                if (jumping)
                {
                    middlePieceRow = (currentRow + newRow) / 2;
                    middlePieceColumn = (currentColumn + newColumn) / 2;
                    middlePiece = board[middlePieceRow, middlePieceColumn];
                    Console.WriteLine("jumped over " + middlePiece);
                }

to this:

                if (taking)
                {
                    middlePieceRow = (currentRow + newRow) / 2;
                    middlePieceColumn = (currentColumn + newColumn) / 2;
                    middlePiece = board[middlePieceRow, middlePieceColumn];
                    board[middlePieceRow, middlePieceColumn]=" ";
                    opponentsPieces[Convert.ToInt32(middlePiece.Substring(1)), Row] = -1;
                    opponentsPieces[Convert.ToInt32(middlePiece.Substring(1)), Column] = -1;
                    Console.WriteLine("Taken " + middlePiece);
                }
                else if (jumping)
                {
                    middlePieceRow = (currentRow + newRow) / 2;
                    middlePieceColumn = (currentColumn + newColumn) / 2;
                    middlePiece = board[middlePieceRow, middlePieceColumn];
                    Console.WriteLine("jumped over " + middlePiece);
                }