Search code examples
c++c++11multidimensional-arraycombinatoricsknights-tour

Knight Tour Index and Moving Algorithm Bugs


The goal of this program is for the knight to move around the chest board and only touching each spot once.

Each spot is initialized and set to zero by default. As the knight moves, each spot the knight touches should correspond with the number of moves taken to reach that point.

However, I am having quite a few problems

1) My Knight is moving around the board and going either out of bound of the multidimensional chess board array or manipulates the movement arrays (horizontal[] and vertical[])

2) The conditions of my boolean functions MoveOnBoard && MoveHasNotBeenMade are that if the next possible move is between the exisiting rows and columns also if the spot being moved to has a value of 0(meaning it has yet to be moved to). However, both of these conditions seem to be ignored.

How would I go about fixing this?

Thank you in advance!

Here's the code below

using namespace std;
#include <iostream>
#include <array>

void DefinedMoveSet();
void RenderBoard();
void MoveKnight(int& moveChoice, int& numberOfMovesMade);
void PossibleMoves();
bool MoveOnBoard(int& moveChoice);
bool MoveHasNotBeenMade(int& moveChoice);

// Two single dimenisional arrays to store move positions for the Knight
// Arrays have yet to be assigned values
int vertical[8], horizontal[8];
int currentRow = 4, currentColumn = 3;

// Initializing an array with the dimension 8 * 8
int chestBoard[8][8] = { 0 };

int main()
{
    DefinedMoveSet();
    PossibleMoves();
    RenderBoard();
    cin.ignore();
    return 0;
}

void RenderBoard()
{
    // The outer loop goes through each row until it reaches 8
    for (int boardRow = 0; boardRow < 8; boardRow++)
    {
        // The inner loop takes in the specific row 
        for (int boardColumn = 0; boardColumn < 8; boardColumn++)
        {
            // Then iterates through the columns of that row until it reaches 8
            // Each index is seperated by a tab escape key shortcut
            cout << chestBoard[boardRow][boardColumn] << "\t";
        }
        // Back to the inner array a new line is printed for the next row
        cout << "\n";
    }
}

void DefinedMoveSet()
{
    // Values for the horizontal array at each index
    horizontal[0] = 2;
    horizontal[1] = 1;
    horizontal[2] = -1;
    horizontal[3] = -2;
    horizontal[4] = -2;
    horizontal[5] = -1;
    horizontal[6] = 1;
    horizontal[7] = 2;

    // Values for the vertical array at each index
    vertical[0] = -1;
    vertical[1] = -2;
    vertical[2] = -2;
    vertical[3] = -1;
    vertical[4] = 1;
    vertical[5] = 2;
    vertical[6] = 2;
    vertical[7] = 1;
}

bool MoveOnBoard(int& moveChoice)
{
    int futureRow = currentRow + vertical[moveChoice];
    int futureColumn = currentColumn + horizontal[moveChoice];

    if ((0 < futureRow) && (0 < futureColumn) && (futureRow < 8) && (futureColumn < 8))
        return true;
}

bool MoveHasNotBeenMade(int& moveChoice)
{
    int futureRow = currentRow + vertical[moveChoice];
    int futureColumn = currentColumn + horizontal[moveChoice];

    if (chestBoard[futureRow][futureColumn] == 0)
        return true;
}

void PossibleMoves()
{
    bool movesStillExist = true;

    int numberOfMovesMade = 1;

    while (numberOfMovesMade < 65 && movesStillExist)
    {
        for (int i = 0; i < 8; i++)
        {
            if (i == 8)
                movesStillExist = false;

            if (MoveOnBoard(i) && MoveHasNotBeenMade(i))
            {
                numberOfMovesMade++;
                MoveKnight(i, numberOfMovesMade);
            }
        }
    }
}

void MoveKnight(int &moveChoice, int &numberOfMovesMade)  
{
    // Takes in the int moveNumber as a parameter
    // MoveNumber(or case) must be between 0 and 7
    // if there is not a case for the value then the knight will not move
    //chestBoard[currentRow][currentColumn] = numberOfMovesMade;
    currentRow += vertical[moveChoice];
    currentColumn += horizontal[moveChoice];
    chestBoard[currentRow][currentColumn] = numberOfMovesMade;
}

Solution

  • in MoveOnBoardand and in MoveHasNotBeenMade instead of

    if(...)
      return true;
    

    should be

    if(...)
      return true;
    return false;
    

    if condtion == false, function returning not void reach end without return statement.