Checkers_c

About

This project was created for my AP Computer Science Principles class and was our last project from following Harvard’s CS50 course. It is a recreation of Checkers using the C programming language. It includes basic pieces which can only move forward and the promoted pieces which can move forward or backwards. I chose to recreate Checkers to challenge myself after seeing some of the previous student projects.

My Role

I was responsible for all the code.

What I Learned

This project was my first project that involved more complex logic than other coding assignments that I did which tested my patience and perserverance. Since I had learned Python beforehand, it was difficult switching to programming entirely in a low-level language like C, but having to resolve all the compile errors made me a lot better at finding information online.

// SCOPE - libraries
#include <cs50.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <math.h>

// code taken from https://stackoverflow.com/questions/3585846/color-text-in-terminal-applications-in-unix
// NEW FEATURE - colored text
#define RED   "\x1B[31m"
#define RESET "\x1B[0m"

// defining variables
// SCOPE - variables
string white = RESET "o" RED;
string whiteKing = RESET "W" RED;
string red = RED "o";
string redKing = RED "W";
string empty = " ";
int initialLetter = 0;
int initialNumber = 0;
int finalLetter = 0;
int finalNumber = 0;
string playerMove;
string moveColor;
int turnCounter = 1;
int whiteCount = 1; // piece counter
int redCount = 1;
string errorMessage;
bool legalMove = false;
bool gameOver = false;

// SCOPE - array
// used for updating game board
string boardPiece[8][4];


// declaring functions, definitions are after main()
// SCOPE - functions
bool check_legal_move(string input);
string create_error_message(string message);
string update_board(string move, string board[8][4]);


int main(void)
{
    // initiating the setup pieces into the array
    // SCOPE - loops
    for (int c = 0; c < 4; c = c + 1)
    {
        // fills the top 3 rows with white
        for (int b = 0; b < 8; b = b + 1)
        {
            if (b < 3)
            {
                boardPiece[b][c] = white;
            }

            // fills the middle 2 rows with empty
            if (b >=3 && b < 5)
            {
                boardPiece[b][c] = empty;
            }

            // fills the bottom 3 rows with red
            if (b >= 5)
            {
                boardPiece[b][c] = red;
            }
        }
    }

    do
    {
        // prints the board with all the board pieces
        printf(RESET "--+---------------------------------+ \n");
        printf("H | " RESET "[ ]" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "| \n", boardPiece[0][0], boardPiece[0][1], boardPiece[0][2], boardPiece[0][3]);
        printf("  |                                 | \n");
        printf("G |" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "[ ] | \n", boardPiece[1][0], boardPiece[1][1], boardPiece[1][2], boardPiece[1][3]);
        printf("  |                                 | \n");
        printf("F | " RESET "[ ]" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "| \n", boardPiece[2][0], boardPiece[2][1], boardPiece[2][2], boardPiece[2][3]);
        printf("  |                                 | \n");
        printf("E |" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "[ ] | \n", boardPiece[3][0], boardPiece[3][1], boardPiece[3][2], boardPiece[3][3]);
        printf("  |                                 | \n");
        printf("D | " RESET "[ ]" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "| \n", boardPiece[4][0], boardPiece[4][1], boardPiece[4][2], boardPiece[4][3]);
        printf("  |                                 | \n");
        printf("C |" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "[ ] | \n", boardPiece[5][0], boardPiece[5][1], boardPiece[5][2], boardPiece[5][3]);
        printf("  |                                 | \n");
        printf("B | " RESET "[ ]" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "| \n", boardPiece[6][0], boardPiece[6][1], boardPiece[6][2], boardPiece[6][3]);
        printf("  |                                 | \n");
        printf("A |" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "[ ]" RED " [%s] " RESET "[ ] | \n", boardPiece[7][0], boardPiece[7][1], boardPiece[7][2], boardPiece[7][3]);
        printf("--+---------------------------------+ \n");
        printf("  |  1   2   3   4   5   6   7   8  | \n\n");

        // prints the current number of turns
        printf("--TURN %i-- \n", turnCounter);

        // checks whether its red's or white's move
        // SCOPE - conditional logic
        if (turnCounter % 2 == 1)
        {
            moveColor = RED "RED" RESET;
        } else {
            moveColor = RESET "WHITE";
        }

        do
        {
            // prompts player input of moves until the move is legal or until they end the game
            printf("%s", moveColor);
            // SCOPE - interactive element
            playerMove = get_string("s Move: ");

            // checks if player inputted end, then ends the program
            if (strcmp(playerMove, "end") == 0)
            {
                printf("----------\n");
                printf("GAME ENDED\n");
                printf("----------\n");
                return 1;
            }

            // checks if the players move if legal
            check_legal_move(playerMove);
            if (legalMove == false)
            {
                // if not legal move, gives the player an error message depending on what they wrote
                create_error_message(playerMove);
                printf("%s\n", errorMessage);
            }
        // keep prompting until they make a legal move
        } while (legalMove == false);

        // updates the gameboard to reflect the move
        update_board(playerMove, boardPiece);

        // checks if a piece is able to turn into a king piece
        for (int a = 0; a < 4; a = a + 1)
        {
            // checks if red piece is at the top end of the board
            if (boardPiece[0][a] == red)
            {
                // promotes that piece to king
                boardPiece[0][a] = redKing;
            }
            // checks if white piece is at the bottom of the board
            if (boardPiece[7][a] == white)
            {
                // promotes that piece to king
                boardPiece[7][a] = whiteKing;
            }
        }

        // reset legal move for the function
        legalMove = false;

        printf("--------- \n\n\n");
        // adds 1 to the turn counter SCOPE - math
        turnCounter = turnCounter + 1;

        // loops through board pieces to check if all the pieces of a color are still alive
        for (int x = 0; x < 8; x = x + 1)
        {
            for (int y = 0; y < 4; y = y + 1)
            {
                // checks for red pieces
                // SCOPE - logical operator
                if (boardPiece[x][y] == red || boardPiece[x][y] == redKing)
                {
                    redCount = redCount + 1;
                }
                // checks for white pieces
                if (boardPiece[x][y] == white || boardPiece[x][y] == whiteKing)
                {
                    whiteCount = whiteCount + 1;
                }
            }
        }

        // if a certain color no longer has any pieces, set gameOver to true
        if (redCount == 0 || whiteCount == 0)
        {
            gameOver = true;
        } else {
            // resets piece counts for the next loop
            redCount = 0;
            whiteCount = 0;
        }

    // continue until game is over and one side has no more pieces
    } while (gameOver == false);

    // prints the color of the winner then ends the program
    printf("----- GAME OVER -----\n");
    printf("%s is the winner! \n", moveColor);
    printf("---------------------\n");
    return 0;
}

// function checks if the selected piece can legally move to a selected position
bool check_legal_move(string input)
{
    // input should only have 5 characters
    if (strlen(input) == 5)
    {
        // check whether the correct datatypes were inputted
        if (isalpha(input[0]) && isdigit(input[1]) && isblank(input[2]) && isalpha(input[3]) && isdigit(input[4]) && atoi(&input[1]) <= 8 && atoi(&input[4]) <=8)
        {
            initialLetter = abs(toupper(input[0]) - 72);
            initialNumber = floor((atoi(&input[1]) + 1) / 2) - 1;
            finalLetter = abs(toupper(input[3]) - 72);
            finalNumber = floor((atoi(&input[4]) + 1) / 2) - 1;
            // printf("initial letter %i\n", initialLetter); // printtest
            // printf("initial number %i\n", initialNumber); // printtest
            // printf("final letter %i\n", finalLetter); // printtest
            // printf("final number %i\n", finalNumber); // printtest

            // if the initial or final number is 4, minus 1 to ensure index doesnt break
            if (initialNumber == 4)
            {
                initialNumber = initialNumber - 1;
            }
            if (finalNumber == 4)
            {
                finalNumber = finalNumber - 1;
            }
        } else {
            return legalMove = false;
        }

        // checks if it is reds turn SCOPE - complex logic
        if (turnCounter % 2 == 1)
        {
            for (int side = 1; side < 8; side = side + 2)
            {
                // checks if there a red piece/king on the far left odd side
                if (initialLetter == side && initialNumber == 0 && ((boardPiece[side][0] == red && boardPiece[initialLetter][initialNumber] == red) || (boardPiece[side][0] == redKing && boardPiece[initialLetter][initialNumber] == redKing)))
                {
                    // check red piece side movement
                    if (boardPiece[initialLetter][initialNumber] == red && boardPiece[finalLetter][finalNumber] == empty && initialLetter - 1 == finalLetter && initialNumber == finalNumber)
                    {
                        return legalMove = true;

                    // check red king side movement
                    } else if (boardPiece[initialLetter][initialNumber] == redKing && boardPiece[finalLetter][finalNumber] == empty && (initialLetter + 1 == finalLetter || initialLetter - 1 == finalLetter) && initialNumber == finalNumber) {
                        return legalMove = true;

                    // check if side piece is capturing
                    } else if ((boardPiece[initialLetter][initialNumber] == red || boardPiece[initialLetter][initialNumber] == redKing) && abs(initialLetter - 2) == finalLetter && initialNumber + 1 == finalNumber) {
                        // checks if diagonal piece is white
                        if (boardPiece[initialLetter - 1][initialNumber] == white || boardPiece[initialLetter - 1][initialNumber] == whiteKing)
                        {
                            return legalMove = true;
                        } else {
                            return legalMove = false;
                        }

                    } else {
                        return legalMove = false;
                    }
                }
            }

            // ensures initial position is red piece and final position is empty
            if (boardPiece[initialLetter][initialNumber] == red && boardPiece[finalLetter][finalNumber] == empty)
            {
                // check red piece movement
                if (initialLetter - 1 == finalLetter && (initialNumber == finalNumber || abs(initialNumber - 1) == finalNumber))
                {
                    return legalMove = true;

                // check red piece even movement
                } else if (initialLetter % 2 == 0 && initialLetter - 1 == finalLetter && (initialNumber == finalNumber || initialNumber + 1 == finalNumber)) {
                    return legalMove = true;

                // check red piece capture
                } else if (abs(initialLetter - 2) == finalLetter && (initialNumber + 1 == finalNumber || abs(initialNumber - 1) == finalNumber)) {
                    // check ODD left side
                    if (initialLetter % 2 == 1 && finalNumber + 1 == initialNumber && (boardPiece[initialLetter - 1][initialNumber - 1] == white || boardPiece[initialLetter - 1][initialNumber - 1] == whiteKing))
                    {
                        return legalMove = true;

                    // check odd and right side capture
                    } else if (initialLetter % 2 == 1 && finalNumber - 1 == initialNumber && (boardPiece[initialLetter - 1][initialNumber] == white || boardPiece[initialLetter - 1][initialNumber] == whiteKing)) {
                        return legalMove = true;

                    // check EVEN left side
                    } else if (initialLetter % 2 == 0 && finalNumber + 1 == initialNumber && (boardPiece[initialLetter - 1][initialNumber] == white || boardPiece[initialLetter - 1][initialNumber] == whiteKing)) {
                        return legalMove = true;

                    // check EVEN right side
                    } else if (initialLetter % 2 == 0 && finalNumber - 1 == initialNumber && (boardPiece[initialLetter - 1][initialNumber + 1] == white || boardPiece[initialLetter - 1][initialNumber + 1] == whiteKing)) {
                        return legalMove = true;

                    } else {
                        return legalMove = false;
                    }

                } else {
                    return legalMove = false;
                }

            // ensures initial position is red KING and final position is empty
            } else if (boardPiece[initialLetter][initialNumber] == redKing && boardPiece[finalLetter][finalNumber] == empty) {
                for (int let = 0; let < 8; let = let + 1)
                {
                    // check red king movement on odd letters
                    if (let % 2 == 1 && (initialNumber == finalNumber || abs(initialNumber - 1) == finalNumber) && (initialLetter + 1 == finalLetter || abs(initialLetter - 1) == finalLetter))
                    {
                        return legalMove = true;

                    // check red king movement on even letters
                    } else if ((initialNumber == finalNumber || initialNumber + 1 == finalNumber) && (initialLetter + 1 == finalLetter || abs(initialLetter - 1) == finalLetter)) {
                        return legalMove = true;

                    }
                }

                 // check red king capture
                if ((initialLetter + 2 == finalLetter || initialLetter - 2 == finalLetter) && (initialNumber + 1 == finalNumber || initialNumber - 1 == finalNumber))
                {
                    // EVEN top left
                    if (initialLetter % 2 == 0 && finalNumber + 1 == initialNumber && initialLetter - 2 == finalLetter && (boardPiece[initialLetter - 1][initialNumber] == white || boardPiece[initialLetter - 1][initialNumber] == whiteKing))
                    {
                        return legalMove = true;

                    // EVEN top right
                    } else if (initialLetter % 2 == 0 && finalNumber - 1 == initialNumber && initialLetter - 2 == finalLetter && (boardPiece[initialLetter - 1][initialNumber + 1] == white || boardPiece[initialLetter - 1][initialNumber + 1] == whiteKing)) {
                        return legalMove = true;

                    // EVEN bottom left
                    } else if (initialLetter % 2 == 0 && finalNumber + 1 == initialNumber && initialLetter + 2 == finalLetter && (boardPiece[initialLetter + 1][initialNumber] == white || boardPiece[initialLetter + 1][initialNumber] == whiteKing)) {
                        return legalMove = true;

                    // EVEN bottom right
                    } else if (initialLetter % 2 == 0 && finalNumber - 1 == initialNumber && initialLetter + 2 == finalLetter && (boardPiece[initialLetter + 1][initialNumber + 1] == white || boardPiece[initialLetter + 1][initialNumber + 1] == whiteKing)) {
                        return legalMove = true;

                    // ODD top left
                    } else if (initialLetter % 2 == 1 && finalNumber + 1 == initialNumber && initialLetter - 2 == finalLetter && (boardPiece[initialLetter - 1][initialNumber - 1] == white || boardPiece[initialLetter - 1][initialNumber - 1] == whiteKing)) {
                        return legalMove = true;

                    // ODD top right
                    } else if (initialLetter % 2 == 1 && finalNumber - 1 == initialNumber && initialLetter - 2 == finalLetter && (boardPiece[initialLetter - 1][initialNumber] == white || boardPiece[initialLetter - 1][initialNumber] == whiteKing)) {
                        return legalMove = true;

                    // ODD bottom left
                    } else if (initialLetter % 2 == 1 && finalNumber + 1 == initialNumber && initialLetter + 2 == finalLetter && (boardPiece[initialLetter + 1][initialNumber - 1] == white || boardPiece[initialLetter + 1][initialNumber - 1] == whiteKing)) {
                        return legalMove = true;

                    // ODD bottom right
                    } else if (initialLetter % 2 == 1 && finalNumber - 1 == initialNumber && initialLetter + 2 == finalLetter && (boardPiece[initialLetter + 1][initialNumber] == white || boardPiece[initialLetter + 1][initialNumber] == whiteKing)) {
                        return legalMove = true;

                    } else {
                        return legalMove = false;
                    }

                } else {
                    return legalMove = false;
                }

            } else {
                return legalMove = false;
            }

        // else move for white
        } else {
            for (int side = 0; side < 8; side = side + 2)
            {
                // checks if there a white piece/king on the far right odd side
                if (initialLetter == side && initialNumber == 3 && ((boardPiece[side][3] == white && boardPiece[initialLetter][initialNumber] == white) || (boardPiece[side][3] == whiteKing && boardPiece[initialLetter][initialNumber] == whiteKing)))
                {
                    // check white piece side movement
                    if (boardPiece[initialLetter][initialNumber] == white && boardPiece[finalLetter][finalNumber] == empty && initialLetter + 1 == finalLetter && initialNumber == finalNumber)
                    {
                        return legalMove = true;

                    // check white side king movement
                    } else if (boardPiece[initialLetter][initialNumber] == whiteKing && boardPiece[finalLetter][finalNumber] == empty && (initialLetter + 1 == finalLetter || initialLetter - 1 == finalLetter) && initialNumber == finalNumber) {
                        return legalMove = true;

                    // check if side piece is capturing
                    } else if ((boardPiece[initialLetter][initialNumber] == white || boardPiece[initialLetter][initialNumber] == whiteKing) && initialLetter + 2 == finalLetter && initialNumber - 1 == finalNumber) {
                        if (boardPiece[initialLetter + 1][initialNumber] == red || boardPiece[initialLetter - 1][initialNumber] == redKing)
                        {
                            return legalMove = true;
                        } else {
                            return legalMove = false;
                        }

                    } else {
                        return legalMove = false;
                    }
                }
            }

            // ensures initial position is white piece and final position is empty
            if (boardPiece[initialLetter][initialNumber] == white && boardPiece[finalLetter][finalNumber] == empty)
            {
                // check white piece/king movement
                if (initialLetter + 1 == finalLetter && (initialNumber == finalNumber || initialNumber + 1 == finalNumber))
                {
                    return legalMove = true;

                // check white piece odd movement
                } else if (initialLetter % 2 == 1 && initialLetter + 1 == finalLetter && (initialNumber == finalNumber || initialNumber - 1 == finalNumber)) {
                    return legalMove = true;

                // check white piece capture
                } else if (initialLetter + 2 == finalLetter && (initialNumber + 1 == finalNumber || abs(initialNumber - 1) == finalNumber)) {
                    // check ODD left side
                    if (initialLetter % 2 == 1 && finalNumber + 1 == initialNumber && (boardPiece[initialLetter + 1][initialNumber - 1] == red || boardPiece[initialLetter + 1][initialNumber - 1] == redKing))
                    {
                        return legalMove = true;

                    // check ODD right
                    } else if (initialLetter % 2 == 1 && finalNumber - 1 == initialNumber && (boardPiece[initialLetter + 1][initialNumber] == red || boardPiece[initialLetter + 1][initialNumber] == redKing)) {
                        return legalMove = true;

                    // check EVEN left
                    } else if (initialLetter % 2 == 0 && finalNumber + 1 == initialNumber && (boardPiece[initialLetter + 1][initialNumber] == red || boardPiece[initialLetter + 1][initialNumber] == redKing)) {
                        return legalMove = true;

                    // check EVEN right
                    } else if (initialLetter % 2 == 0 && finalNumber - 1 == initialNumber && (boardPiece[initialLetter + 1][initialNumber - 1] == red || boardPiece[initialLetter + 1][initialNumber - 1] == redKing)) {
                        return legalMove = true;

                    } else {
                        return legalMove = false;
                    }

                } else {
                    return legalMove = false;
                }

            // ensures initial position is white king and final position is empty
            } else if (boardPiece[initialLetter][initialNumber] == whiteKing && boardPiece[finalLetter][finalNumber] == empty) {
                for (int let = 0; let < 8; let = let + 1)
                {
                    // check white king movement on odd letters
                    if (let % 2 == 1 && (initialNumber == finalNumber || abs(initialNumber - 1) == finalNumber) && (initialLetter + 1 == finalLetter || abs(initialLetter - 1)))
                    {
                        return legalMove = true;

                    // check white king movement on even letters
                    } else if ((initialNumber == finalNumber || initialNumber + 1 == finalNumber) && (initialLetter + 1 == finalLetter || abs(initialLetter - 1) == finalLetter)) {
                        return legalMove = true;

                    }
                }

                // check white king capture
                if ((initialLetter + 2 == finalLetter || initialLetter - 2 == finalLetter) && (initialNumber + 1 == finalNumber || initialNumber - 1 == finalNumber))
                {
                    // EVEN top left
                    if (initialLetter % 2 == 0 && finalNumber + 1 == initialNumber && initialLetter - 2 == finalLetter && (boardPiece[initialLetter - 1][initialNumber] == red || boardPiece[initialLetter - 1][initialNumber] == redKing))
                    {
                        return legalMove = true;

                    // EVEN top right
                    } else if (initialLetter % 2 == 0 && finalNumber - 1 == initialNumber && initialLetter - 2 == finalLetter && (boardPiece[initialLetter - 1][initialNumber + 1] == red || boardPiece[initialLetter - 1][initialNumber + 1] == redKing)) {
                        return legalMove = true;

                    // EVEN bottom left
                    } else if (initialLetter % 2 == 0 && finalNumber + 1 == initialNumber && initialLetter + 2 == finalLetter && (boardPiece[initialLetter + 1][initialNumber] == red || boardPiece[initialLetter + 1][initialNumber] == redKing)) {
                        return legalMove = true;

                    // EVEN bottom right
                    } else if (initialLetter % 2 == 0 && finalNumber - 1 == initialNumber && initialLetter + 2 == finalLetter && (boardPiece[initialLetter + 1][initialNumber + 1] == red || boardPiece[initialLetter + 1][initialNumber + 1] == redKing)) {
                        return legalMove = true;

                    // ODD top left
                    } else if (initialLetter % 2 == 1 && finalNumber + 1 == initialNumber && initialLetter - 2 == finalLetter && (boardPiece[initialLetter - 1][initialNumber - 1] == red || boardPiece[initialLetter - 1][initialNumber - 1] == redKing)) {
                        return legalMove = true;

                    // ODD top right
                    } else if (initialLetter % 2 == 1 && finalNumber - 1 == initialNumber && initialLetter - 2 == finalLetter && (boardPiece[initialLetter - 1][initialNumber] == red || boardPiece[initialLetter - 1][initialNumber] == redKing)) {
                        return legalMove = true;

                    // ODD bottom left
                    } else if (initialLetter % 2 == 1 && finalNumber + 1 == initialNumber && initialLetter + 2 == finalLetter && (boardPiece[initialLetter + 1][initialNumber - 1] == red || boardPiece[initialLetter + 1][initialNumber - 1] == redKing)) {
                        return legalMove = true;

                    // ODD bottom right
                    } else if (initialLetter % 2 == 1 && finalNumber - 1 == initialNumber && initialLetter + 2 == finalLetter && (boardPiece[initialLetter + 1][initialNumber] == red || boardPiece[initialLetter + 1][initialNumber] == redKing)) {
                        return legalMove = true;

                    } else {
                        return legalMove = false;
                    }

                } else {
                    return legalMove = false;
                }
            }
        }

    } else {
        // return error if letters arent A-H or numbers arent 1-8
        return legalMove = false;
    }

    return legalMove = false;
}

// function chooses which message to display
string create_error_message(string message)
{
    // turns the message lower case
    for (int m = 0; m < strlen(message); m = m + 1)
    {
        message[m] = tolower(message[m]);
    }

    // check if player typed rules
    if (strcmp((message), "rules") == 0)
    {
        // print rules message
        errorMessage = "---RULES--- \nPieces can only move forward diagonally and capture diagonally. Unlike real Checkers, capture is not forced and only one piece can be captured at a time. \nIf your piece (o) makes it to the other side, it becomes a king (W) and can now move forwards or backwards. \nTake turns until one side has no remaining pieces left.";
    // check if player typed help
    } else if (strcmp((message), "help") == 0) {
        // print help message
        errorMessage = "---HELP---\nPieces can only move forward diagonally unless they are a king (can move backwards). Put your moves with letter first, \nthen the number like [Initial position] space [Final Position]. Example C3 D2. Capitalization doesnt matter. \nIf capturing, [Final Pos] will be the square behind the enemy piece. \nCapture is not forced and only one piece can be captured at a time. Example C3 E5";
    } else {
        // print generic error message
        errorMessage = "Unknown move. Type 'help' to help format input, 'rules' to learn how to play, or 'end' to end the program.";
    }
    return errorMessage;
}

// function takes player moves and updates the board
string update_board(string move, string board[8][4])
{
    // check if it was a capture
    if (initialLetter + 2 == finalLetter || initialLetter - 2 == finalLetter)
    {
        // check if red piece did the capture
        if (boardPiece[initialLetter][initialNumber] == red)
        {
            // check odd left side
            if (initialLetter % 2 == 1 && finalNumber + 1 == initialNumber && (boardPiece[initialLetter - 1][initialNumber - 1] == white || boardPiece[initialLetter - 1][initialNumber - 1] == whiteKing))
            {
                boardPiece[initialLetter - 1][initialNumber - 1] = empty;

            // check odd and right side capture
            } else if (initialLetter % 2 == 1 && finalNumber - 1 == initialNumber && (boardPiece[initialLetter - 1][initialNumber] == white || boardPiece[initialLetter - 1][initialNumber] == whiteKing)) {
                boardPiece[initialLetter - 1][initialNumber] = empty;

            // check EVEN left side
            } else if (initialLetter % 2 == 0 && finalNumber + 1 == initialNumber && (boardPiece[initialLetter - 1][initialNumber] == white || boardPiece[initialLetter - 1][initialNumber] == whiteKing)) {
                boardPiece[initialLetter - 1][initialNumber] = empty;

            // check EVEN right side
            } else if (initialLetter % 2 == 0 && finalNumber - 1 == initialNumber && (boardPiece[initialLetter - 1][initialNumber + 1] == white || boardPiece[initialLetter - 1][initialNumber + 1] == whiteKing)) {
                boardPiece[initialLetter - 1][initialNumber + 1] = empty;
            }

            boardPiece[finalLetter][finalNumber] = red;
        }

        // check if red king is capturing
        if (boardPiece[initialLetter][initialNumber] == redKing)
        {
            // EVEN top left
            if (initialLetter % 2 == 0 && finalNumber + 1 == initialNumber && initialLetter - 2 == finalLetter && (boardPiece[initialLetter - 1][initialNumber] == white || boardPiece[initialLetter - 1][initialNumber] == whiteKing))
            {
                boardPiece[initialLetter - 1][initialNumber] = empty;

            // EVEN top right
            } else if (initialLetter % 2 == 0 && finalNumber - 1 == initialNumber && initialLetter - 2 == finalLetter && (boardPiece[initialLetter - 1][initialNumber + 1] == white || boardPiece[initialLetter - 1][initialNumber + 1] == whiteKing)) {
                boardPiece[initialLetter - 1][initialNumber + 1] = empty;

            // EVEN bottom left
            } else if (initialLetter % 2 == 0 && finalNumber + 1 == initialNumber && initialLetter + 2 == finalLetter && (boardPiece[initialLetter + 1][initialNumber] == white || boardPiece[initialLetter + 1][initialNumber] == whiteKing)) {
                boardPiece[initialLetter + 1][initialNumber] = empty;

            // EVEN bottom right
            } else if (initialLetter % 2 == 0 && finalNumber - 1 == initialNumber && initialLetter + 2 == finalLetter && (boardPiece[initialLetter + 1][initialNumber + 1] == white || boardPiece[initialLetter + 1][initialNumber + 1] == whiteKing)) {
                boardPiece[initialLetter + 1][initialNumber + 1] = empty;

            // ODD top left
            } else if (initialLetter % 2 == 1 && finalNumber + 1 == initialNumber && initialLetter - 2 == finalLetter && (boardPiece[initialLetter - 1][initialNumber - 1] == white || boardPiece[initialLetter - 1][initialNumber - 1] == whiteKing)) {
                boardPiece[initialLetter - 1][initialNumber - 1] = empty;

            // ODD top right
            } else if (initialLetter % 2 == 1 && finalNumber - 1 == initialNumber && initialLetter - 2 == finalLetter && (boardPiece[initialLetter - 1][initialNumber] == white || boardPiece[initialLetter + 1][initialNumber] == whiteKing)) {
                boardPiece[initialLetter - 1][initialNumber] = empty;

            // ODD bottom left
            } else if (initialLetter % 2 == 1 && finalNumber + 1 == initialNumber && initialLetter + 2 == finalLetter && (boardPiece[initialLetter + 1][initialNumber - 1] == white || boardPiece[initialLetter + 1][initialNumber - 1] == whiteKing)) {
                boardPiece[initialLetter + 1][initialNumber - 1] = empty;

            // ODD bottom right
            } else if (initialLetter % 2 == 1 && finalNumber - 1 == initialNumber && initialLetter + 2 == finalLetter && (boardPiece[initialLetter + 1][initialNumber] == white || boardPiece[initialLetter + 1][initialNumber] == whiteKing)) {
                boardPiece[initialLetter + 1][initialNumber] = empty;
            }

            boardPiece[finalLetter][finalNumber] = redKing;
        }

        // check if white piece did the move
        if (boardPiece[initialLetter][initialNumber] == white)
        {
            // check ODD left
            if (initialLetter % 2 == 1 && finalNumber + 1 == initialNumber && (boardPiece[initialLetter + 1][initialNumber - 1] == red || boardPiece[initialLetter + 1][initialNumber - 1] == redKing))
            {
                boardPiece[initialLetter + 1][initialNumber - 1] = empty;

            // check ODD right
            } else if (initialLetter % 2 == 1 && finalNumber - 1 == initialNumber && (boardPiece[initialLetter + 1][initialNumber] == red || boardPiece[initialLetter + 1][initialNumber] == redKing)) {
                boardPiece[initialLetter + 1][initialNumber] = empty;

            // check EVEN left
            } else if (initialLetter % 2 == 0 && finalNumber + 1 == initialNumber && (boardPiece[initialLetter + 1][initialNumber] == red || boardPiece[initialLetter + 1][initialNumber] == redKing)) {
                boardPiece[initialLetter + 1][initialNumber] = empty;

            // check EVEN right
            } else if (initialLetter % 2 == 0 && finalNumber - 1 == initialNumber && (boardPiece[initialLetter + 1][initialNumber - 1] == red || boardPiece[initialLetter + 1][initialNumber - 1] == redKing)) {
                boardPiece[initialLetter + 1][initialNumber - 1] = empty;
            }

            boardPiece[finalLetter][finalNumber] = white;
        }

        // checks if white king did the capture
        if (boardPiece[initialLetter][initialNumber] == whiteKing)
        {
            // checks for a red piece/king in the direction of capture and turn that position empty
            // EVEN top left
            if (initialLetter % 2 == 0 && finalNumber + 1 == initialNumber && initialLetter - 2 == finalLetter && (boardPiece[initialLetter - 1][initialNumber] == red || boardPiece[initialLetter - 1][initialNumber] == redKing))
            {
                boardPiece[initialLetter - 1][initialNumber] = empty;

            // EVEN top right
            } else if (initialLetter % 2 == 0 && finalNumber - 1 == initialNumber && initialLetter - 2 == finalLetter && (boardPiece[initialLetter - 1][initialNumber + 1] == red || boardPiece[initialLetter - 1][initialNumber + 1] == redKing)) {
                boardPiece[initialLetter - 1][initialNumber + 1] = empty;

            // EVEN bottom left
            } else if (initialLetter % 2 == 0 && finalNumber + 1 == initialNumber && initialLetter + 2 == finalLetter && (boardPiece[initialLetter + 1][initialNumber] == red || boardPiece[initialLetter + 1][initialNumber] == redKing)) {
                boardPiece[initialLetter + 1][initialNumber] = empty;

            // EVEN bottom right
            } else if (initialLetter % 2 == 0 && finalNumber - 1 == initialNumber && initialLetter + 2 == finalLetter && (boardPiece[initialLetter + 1][initialNumber + 1] == red || boardPiece[initialLetter + 1][initialNumber + 1] == redKing)) {
                boardPiece[initialLetter + 1][initialNumber + 1] = empty;

            // ODD top left
            } else if (initialLetter % 2 == 1 && finalNumber + 1 == initialNumber && initialLetter - 2 == finalLetter && (boardPiece[initialLetter - 1][initialNumber - 1] == red || boardPiece[initialLetter - 1][initialNumber - 1] == redKing)) {
                boardPiece[initialLetter - 1][initialNumber - 1] = empty;

            // ODD top right
            } else if (initialLetter % 2 == 1 && finalNumber - 1 == initialNumber && initialLetter - 2 == finalLetter && (boardPiece[initialLetter - 1][initialNumber] == red || boardPiece[initialLetter - 1][initialNumber] == redKing)) {
                boardPiece[initialLetter - 1][initialNumber] = empty;

            // ODD bottom left
            } else if (initialLetter % 2 == 1 && finalNumber + 1 == initialNumber && initialLetter + 2 == finalLetter && (boardPiece[initialLetter + 1][initialNumber - 1] == red || boardPiece[initialLetter + 1][initialNumber - 1] == redKing)) {
                boardPiece[initialLetter + 1][initialNumber - 1] = empty;

            // ODD bottom right
            } else if (initialLetter % 2 == 1 && finalNumber - 1 == initialNumber && initialLetter + 2 == finalLetter && (boardPiece[initialLetter + 1][initialNumber] == red || boardPiece[initialLetter + 1][initialNumber] == redKing)) {
                boardPiece[initialLetter + 1][initialNumber] = empty;
            }

            boardPiece[finalLetter][finalNumber] = whiteKing;
        }

    // regular movement
    } else {
        // checks the color of initial position, then turns final position into that color
        if (board[initialLetter][initialNumber] == red)
        {
            board[finalLetter][finalNumber] = red;
        }
        if (board[initialLetter][initialNumber] == redKing)
        {
            board[finalLetter][finalNumber] = redKing;
        }
        if (board[initialLetter][initialNumber] == white)
        {
            board[finalLetter][finalNumber] = white;
        }
        if (board[initialLetter][initialNumber] == whiteKing)
        {
            board[finalLetter][finalNumber] = whiteKing;
        }
    }

    // turns the piece in the initial position empty after the piece moves to a new spot
    board[initialLetter][initialNumber] = empty;

    // exits the function
    return 0;
}