Home > Software design >  How to reset array in my tic tac toe game
How to reset array in my tic tac toe game

Time:12-01

I'm new to C and I'm trying to make a tic-tac-toe game for my college project and I'm struggling on how to reset my array in my game.

Every time I play again it does not reset the array. Can anyone help me with this?

Here is the code:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>


char space[3][3] = {
    {'1','2','3'},
    {'4','5','6'},
    {'7','8','9'}
};

void board();
int checkWin();
int game();
void reset();




int main(){

    int choice = -1;

    do{
        printf("\n\n\n\n\n\n\n\t\t\t  ================\n");
        printf("\t\t\t     Tic Tac Toe\n");
        printf("\t\t\t  ================\n");
        printf("\t\t     -----------Menu-----------\n\n");
        printf("\t\t     1. Play\n");
        printf("\t\t     2. Exit\n");
        scanf("%d", &choice);
        switch(choice){
            case 1: game();
                break;
            case 2: printf("Goodbye!!");
                exit(0);
                break;
            default: printf(".......Wrong Key !.......Try Again!......");
                break;
        }


    }while(choice != 0);
}


int game(){
    int player = 1, i, choice;

    char mark;

    
    do
    {
        system("cls");
        board();
        player = (player % 2) ? 1 : 2;

        printf("Player %d, enter a number:  ", player);
        scanf("%d", &choice);

        mark = (player == 1) ? 'X' : 'O';

        if (choice == 1)
            space[0][0] = mark;
            
        else if (choice == 2)
            space[0][1] = mark;
            
        else if (choice == 3)
            space[0][2] = mark;
            
        else if (choice == 4)
            space[1][0] = mark;
            
        else if (choice == 5)
            space[1][1] = mark;
            
        else if (choice == 6)
            space[1][2] = mark;
            
        else if (choice == 7)
            space[2][0] = mark;
            
        else if (choice == 8)
            space[2][1] = mark;
            
        else if (choice == 9)
            space[2][2] = mark;
            
        else
        {
            printf("Invalid move ");

            player--;
            getch();
        }
        i = checkWin();

        player  ;
    }while (i ==  - 1);
    
    board();
    reset();
    
    if (i == 1)
        printf("==>\aPlayer %d win \n\n", --player);
        
    else
        printf("==>\aGame draw\n\n");
    
    getch();

    return 0;
}

int checkWin(){

    if (space[0][0] == space[0][1] && space[0][1] == space[0][2])
        return 1;
        
    else if (space[1][0] == space[1][1] && space[1][1] == space[1][2])
        return 1;
        
    else if (space[2][0] == space[2][1] && space[2][1] == space[2][2])
        return 1;
        
    else if (space[0][0] == space[1][0] && space[1][0] == space[2][0])
        return 1;
        
    else if (space[0][1] == space[1][1] && space[1][1] == space[2][1])
        return 1;
        
    else if (space[0][2] == space[1][2] && space[1][2] == space[2][2])
        return 1;
        
    else if (space[0][0] == space[1][1] && space[1][1] == space[2][2])
        return 1;
        
    else if (space[0][2] == space[1][1] && space[1][1] == space[2][0])
        return 1;
        
    else if (space[0][0] != space[0][0] && space[0][1] != space[0][1] && space[0][2] != space[0][2] &&
        space[1][0] != space[1][0] && space[1][1] != space[1][1] && space[1][2] != space[1][2] && space[2][0] 
        !=  space[2][0] &&  space[2][1] != space[2][1] && space[2][2] != space[2][1])

        return 0;
    else
        return  - 1;


}

void reset(){

    for (int i = 0; i < 3; i  )
    {
        for (int j = 0; j < 3; j  )
        {
            space[i][j] = 0;
        }
        
    }
    

}


void board(){

    system("cls");
    printf("\n\n\tTic Tac Toe\n\n");

    printf("Player 1 (X)  -  Player 2 (O)\n\n\n");


    printf("     |     |     \n");
    printf("  %c  |  %c  |  %c \n", space[0][0], space[0][1], space[0][2]);

    printf("_____|_____|_____\n");
    printf("     |     |     \n");

    printf("  %c  |  %c  |  %c \n", space[1][0], space[1][1], space[1][2]);

    printf("_____|_____|_____\n");
    printf("     |     |     \n");

    printf("  %c  |  %c  |  %c \n", space[2][0], space[2][1], space[2][2]);

    printf("     |     |     \n\n");
    

}

I tried using for loop but it does not work; how can I solve this?

void reset(){

    for (int i = 0; i < 3; i  )
    {
        for (int j = 0; j < 3; j  )
        {
            space[i][j] = 0;
        }
        
    }
    

}

CodePudding user response:

Your reset function is filling the entire 3x3 board matrix with zeros; these represent the nul character, not the character representing the '0' digit. Those nul characters aren't printed (and cannot be), so the board looks 'wrong' after a reset.

However, simply changing the space[i][j] = 0; line to space[i][j] = '0'; won't work! Although you will then initially see a board full of 0 digits, the way your checkWin() function works will then ensure that "Player 1" will have won the new game immediately after their first move, because there will already be rows/columns/diagonals of three identical characters.

So, to get the original ('1' thru '9') display, write your reset() function as below. (Note that the C Standard requires that the characters representing the numerical digits be in order and contiguous, so adding a value of 1 thru 9 to the '0' character will yield the appropriate digit character.)

void reset()
{
    int number = 1;
    for (int i = 0; i < 3; i  )
    {
        for (int j = 0; j < 3; j  )
        {
            space[i][j] = number     '0';
        }

    }
}

Alternatively, you can just declare and initialize a new 'board array' with the data in it, then just use memcpy to rest the space array with the contents of that:

#include <string.h> // For "memcpy"

void reset()
{
    char empty[3][3] = { {'1','2','3'}, {'4','5','6'}, {'7','8','9'} };
    memcpy(space, empty, sizeof(space));
}

Note, also that all the tests in the following statement are wrong:

    else if (space[0][0] != space[0][0] && space[0][1] != space[0][1] && space[0][2] != space[0][2] &&
        space[1][0] != space[1][0] && space[1][1] != space[1][1] && space[1][2] != space[1][2] && space[2][0]
        != space[2][0] && space[2][1] != space[2][1] && space[2][2] != space[2][1])

Each one of these is testing if an element is not equal to itself. This can never be true, so that else if block (the return 0; line) is never executed. But you don't actually need it, so you can just delete that block.

CodePudding user response:

I'm not fluid in C but doesn't this work:

char resetted[3][3] = {
 {'0','0','0'},
 {'0','0','0'},
 {'0','0','0'}
};

void reset(){
    space = resetted;
}
  • Related