thefern
thefern

Reputation: 367

Stuck on TicTacToe checking if the move is valid C++

Hi I am a beginner and I am making a console tic tac toe c++ before I try to get it done in unity3d but that's another story, I got stuck on the get_move1() function, as far as how can I check if the array has a 1 or a -1 if it does then is full and the function should say in an invalid move, can this be done any other way besides 2d array, my program just hangs with no error, I haven't work on the other functions yet so they are just empty for now. Thanks for your help.

*init_board and board_state array
get_move function to determine if the move is legal if it is then
fill board_state array and show X or O on the board with another array
check_win
*/

/* layout of board
cout <<  "   1 | 2 | 3  \n"
         "     |   |    \n"
       "  - - - - - -   \n"
         "   4 | 5 | 6  \n"
         "     |   |    \n"
       "  - - - - - -   \n"
         "   7 | 8 | 9  \n"
         "     |   |    \n" << endl;

 cout << "   " <<board_array[0] <<" | " <<  board_array[1] << " | " << board_array[2] <<    "\n"
         "     |   |    \n"
       "  - - - - - -   \n"
         "   " <<board_array[3] <<" | " <<  board_array[4] << " | " << board_array[5] <<    "\n"
         "     |   |    \n"
       "  - - - - - -   \n"
         "   " <<board_array[6] <<" | " <<  board_array[7] << " | " << board_array[8] <<    "\n"
         "     |   |    \n" << endl;

         */

#include <iostream>

using namespace std;

//declare global variables

int board_state[3][3] = { {0,0,0},  //here the 2d array is initialized and set to 0 for empty
                          {0,1,0},
                          {0,0,0} };

char gui_state[3][3];               //2d array to represent the X and O on the board




//declare functions

void init_board();
void get_move1();



int main()
{
    init_board();
        get_move1();
}

void init_board()
{
    cout << "   1 | 2 | 3 \n"
            "     |   |   \n"
            "  - - - - - -  \n"
            "   4 | 5 | 6 \n"
            "     |   |   \n"
            "  - - - - - -  \n"
            "   7 | 8 | 9 \n"
            "     |   |   \n"
            " **Tic Tac Toe ** " << endl;
}

void get_move1() // In this function player's moves are taken and make sure they are valid if so update arrays
{
    int player1_move;
    int i;
    int j;
    bool invalid_move;


    cout << "Player 1 enter move" << endl;
    cin >> player1_move;

    //need to check if the players's move is valid

    for (i=0; i < 3; i++)          //if array is 1 or -1 then move is invalid
    {
        for(j = 0; j < 3; i++)
            if (board_state[i][j] == 1 || board_state[i][j] == -1)
            {
                invalid_move = true;
            }


    } cout << "You entered an invalid move" << endl;

}

void get_move2()
{

}

void game_state()
{

}

void check_win()
{

}

so I decided to go for a one dimensional array to keep it simple for now

int board_state[9] = {0,1,0,0,0,0,0,0,0};  //here the 1d array is initialized and set to 0 for empty

void get_move1() // In this function player's moves are taken and make sure they are valid if so update arrays
{
    int player1_move;
    int array_index;
    int player1_fill = 1;


    cout << "Player 1 enter move" << endl;
    cin >> player1_move;

    //need to check if the players's move is valid

    array_index = player1_move -1;

    if (board_state[array_index] == 1 || board_state[array_index] == -1)
    {
        cout << "Invalid move" << endl;
    }

    else board_state[array_index] = player1_fill;

Thanks for the help guys.

Upvotes: 0

Views: 2449

Answers (4)

YankeeWhiskey
YankeeWhiskey

Reputation: 1582

The problem is after discover an improper move, the loop does not stop so the invalid_move is overwritten.

invalid_move=false;//and here
for (i=0; i < 3&&invalid_move==false; i++)   //Watch out here
    {
        for(j = 0; j < 3&&invalid_move==false; j++)
            if (board_state[i][j] == 1 || board_state[i][j] == -1)
            {
                invalid_move = true;
            }


    } cout << "You entered an invalid move" << endl;

Upvotes: 0

Thomas Matthews
Thomas Matthews

Reputation: 57728

After the for loop add this code:

if (invalid_move)
{
    cout << "Invalid move.\n";
}

Upvotes: 0

parapura rajkumar
parapura rajkumar

Reputation: 24413

invalid_move is not intialized properly

Also if the cells are labelled 1.9.. you need to map it (i,j) correctly and update the array. You are not updating the array with player1_move. For this you don't need the for loop at all

Upvotes: 0

ruakh
ruakh

Reputation: 183456

This line:

for(j = 0; j < 3; i++)

should be:

for(j = 0; j < 3; j++)

Upvotes: 4

Related Questions