Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

When i put 'X' or 'O' in some specific places in my 10×10 tic tac toe program, 2 spaces is registered

I made a 10×10 tic-tac-toe program and the winner is the player who has 5 marked in a row,column and diagonals. When I put ‘X’ or ‘O’ in the first column, which is 0, or the last column, which is 9, for example: 8 0, 9 0, 0 9. There will be a second mark on the other column which are 8 0->7 9, 9 0->8 9, 0 9->1 0.

   0   1   2   3   4   5   6   7   8   9
 |---|---|---|---|---|---|---|---|---|---|
0|   |   |   |   |   |   |   |   |   | X |
 |---|---|---|---|---|---|---|---|---|---|
1| X |   |   |   |   |   |   |   |   |   |
 |---|---|---|---|---|---|---|---|---|---|
2|   |   |   |   |   |   |   |   |   |   |
 |---|---|---|---|---|---|---|---|---|---|
3|   |   |   |   |   |   |   |   |   |   |
 |---|---|---|---|---|---|---|---|---|---|
4|   |   |   |   |   |   |   |   |   |   |
 |---|---|---|---|---|---|---|---|---|---|
5|   |   |   |   |   |   |   |   |   |   |
 |---|---|---|---|---|---|---|---|---|---|
6|   |   |   |   |   |   |   |   |   |   |
 |---|---|---|---|---|---|---|---|---|---|
7|   |   |   |   |   |   |   |   |   | X |
 |---|---|---|---|---|---|---|---|---|---|
8| X |   |   |   |   |   |   |   |   | O |
 |---|---|---|---|---|---|---|---|---|---|
9| O |   |   |   |   |   |   |   |   |   |
 |---|---|---|---|---|---|---|---|---|---|

Here is the code:

#include <stdio.h>
#include <time.h>
char board[9][9];
const char PLAYER ='X';
const char PLAYER2 = 'O';
const char BOT ='O';

void resetBoard(){
    int i,j;
    for(i=0;i<10;i++){
        for(j=0;j<10;j++){
            board[i][j]=' ';
        }
    }
}

printBoard(){
    printf("   0   1   2   3   4   5   6   7   8   9");
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
    printf("\n0| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |",board[0][0],board[0][1],board[0][2],board[0][3],board[0][4],board[0][5],board[0][6],board[0][7],board[0][8],board[0][9]);
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
    printf("\n1| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |",board[1][0],board[1][1],board[1][2],board[1][3],board[1][4],board[1][5],board[1][6],board[1][7],board[1][8],board[1][9]);
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
    printf("\n2| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |",board[2][0],board[2][1],board[2][2],board[2][3],board[2][4],board[2][5],board[2][6],board[2][7],board[2][8],board[2][9]);
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
    printf("\n3| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |",board[3][0],board[3][1],board[3][2],board[3][3],board[3][4],board[3][5],board[3][6],board[3][7],board[3][8],board[3][9]);
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
    printf("\n4| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |",board[4][0],board[4][1],board[4][2],board[4][3],board[4][4],board[4][5],board[4][6],board[4][7],board[4][8],board[4][9]);
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
    printf("\n5| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |",board[5][0],board[5][1],board[5][2],board[5][3],board[5][4],board[5][5],board[5][6],board[5][7],board[5][8],board[5][9]);
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
    printf("\n6| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |",board[6][0],board[6][1],board[6][2],board[6][3],board[6][4],board[6][5],board[6][6],board[6][7],board[6][8],board[6][9]);
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
    printf("\n7| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |",board[7][0],board[7][1],board[7][2],board[7][3],board[7][4],board[7][5],board[7][6],board[7][7],board[7][8],board[7][9]);
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
    printf("\n8| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |",board[8][0],board[8][1],board[8][2],board[8][3],board[8][4],board[8][5],board[8][6],board[8][7],board[8][8],board[8][9]);
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
    printf("\n9| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |",board[9][0],board[9][1],board[9][2],board[9][3],board[9][4],board[9][5],board[9][6],board[9][7],board[9][8],board[9][9]);
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
}

void printWinner(char winner){
    if (winner==PLAYER){
        printf("\nYou win!");
    }
    else if(winner==BOT){
        printf("\nYou lose!");
    }
    else printf("\nTie!");
}

void printWinnerHuman(char winner){
    if (winner==PLAYER){
        printf("\nPlayer 1 wins!");
    }
    else if(winner==PLAYER2){
        printf("\nPlayer 2 wins!");
    }
    else printf("\nTie!");
}

void playerMove(){
    int x,y;
    do{
        printf("\nYou are X!");
        printf("\nEnter move (Ex: 0 2): ");
        scanf("%d %d",&x,&y);
        if (board[x][y]!=' '){
            printf("\n\n\n\n\n\n\nSpace already taken\n");
            printf("\nTry another move!\n");
            printBoard();
        }
        else {
            board[x][y]=PLAYER;
            break;
        }
    }
    while(board[x][y]!=' ');
}

void player2Move(){
    int x,y;
    do{
        printf("\n\nYou are O!");
        printf("\nEnter your move (Ex: 1 2): ");
        scanf("%d %d",&x,&y);
        if(board[x][y]!=' '){
            printf("\nSpace already taken!\n");
            printBoard();
        }
        else{
            board[x][y]=PLAYER2;
            break;
        }
    }
    while(board[x][y]!=' ');
}

void botMove(){
    //create random moves for bot
    srand(time(0));
    int x,y;
    if(checkFreeSpaces()>0){
        do{
            x=rand()%9;
            y=rand()%9;
        }
        while(board[x][y]!=' ');
        board[x][y]=BOT;
    }
    else printWinner(' ');
}

char checkWinner(){
    int i,j;
    int found=0;
    int count=0;
    //check rows winner
    for(i=0;i<10;i++){
        if(count<4){
            count=0;
            for(j=0;j<10;j++){
                if (board[i][j]==board[i][j+1]&&board[i][j]!=' '){
                    count++;
                    if(count==4){
                    return board[i][j];
                    }
                }
            }   
        }
    }
    //check columns winner
    for(i=0;i<10;i++){
        if(count<4){
            count=0;
            for(j=0;j<10;j++){
                if (board[j][i]==board[j+1][i]&&board[j][i]!=' '){
                    count++;
                    if(count==4){
                        return board[j][i];
                    }
                }
            }
        }
    }
    //check all diagonals above MAIN diagonals(\*)
    int row;
    int column;
    for(i=5;i>=0;i--){
        column=i;
        row=0;
        count=0;
        for(j=0;j<10;j++){
            if(board[row][column]==board[row+1][column+1]&&board[row][column]!=' '){
                row++;
                column++;
                count++;
                if(count==4){
                    return board[row][column];
                }
                else if(board[row][column]==board[row+1][column+1]&&board[row][column]==' '){
                row++;
                column++;
                }
            }
        }       
    }
    //check all diagonals above SECOND diagonal(*/)
    for(i=4;i<10;i++){
        column=i;
        row=0;
        count=0;
        for(j=0;j<10;j++){
            if(board[row][column]==board[row+1][column-1]&&board[row][column]!=' '){
                row++;
                column--;
                count++;
                if(count==4){
                    return board[row][column];
                }
            else if(board[row][column]==board[row+1][column-1]&&board[row][column]==' '){
                row++;
                column--;   
            }
            }
        }   
    }
    //check all diagonals below MAIN diagonal(*\)
    for(i=1;i<10;i++){
        row=i;
        column=0;
        count=0;
        for(j=0;j<10;j++){
            if(board[row][column]==board[row+1][column+1]&&board[row][column]!=' '){
                row++;
                column++;
                count++;
                if(count==4){
                    return board[row][column];
                }
                else if(board[row][column]==board[row+1][column+1]&&board[row][column]==' '){
                    row++;
                    column++;
                }
            }
        }
    }
    //check all diagonals below SECOND diagonal(\*)
    for(i=1;i<10;i++){
        row=i;
        column=9;
        count=0;
        for(j=0;j<10;j++){
            if(board[row][column]==board[row+1][column-1]&&board[row][column]!=' '){
                row++;
                column--;
                count++;
                if(count==4){
                    return board[row][column];
                }
                else if(board[row][column]==board[row+1][column-1]&&board[row][column]==' '){
                    row++;
                    column--;
                }
            }
        }
    }
        return ' '; //no winners
    }
    
int checkFreeSpaces(){
    int i,j;
    int freeSpaces=100;
    for(i=0;i<10;++i){
        for(j=0;j<10;++j){
            if (board[i][j]!=' '){
                freeSpaces--;
            }
        }
    }
    return freeSpaces;
}

void humanPlay(){
    resetBoard(); //reset default declaration of computer
        char winner =' ';
        while(winner == ' ' &&checkFreeSpaces()!=0){     //while there is no winner and there are still spaces
            printBoard();
            playerMove();
            winner=checkWinner();   //after every move of player, program checks if there is a winner and if there are spaces left.
            if(winner!=' ' || checkFreeSpaces()==0){
                break;
            }
            printBoard();
            player2Move();
            winner=checkWinner();
            if(winner!=' '||checkFreeSpaces()==0){          //if there is no spaces left and no winner, break loop.
                break;
            }
        }
        printBoard();
        printWinnerHuman(winner);
        
    }

    
void botPlay(){
    resetBoard(); //reset default declarartion of computer
        char winner =' ';
        while(winner == ' ' &&checkFreeSpaces()!=0){    //while there is no winner and there are still spaces
            printBoard();
            playerMove();
            winner=checkWinner();   //after every move of player, program checks if there is a winner and if there are spaces left.
            if(winner!=' ' || checkFreeSpaces()==0){
                break;
            }
            botMove();
            winner=checkWinner();
            if(winner!=' ' || checkFreeSpaces()==0){
                break;
            }
        }
        printBoard();
        printWinner(winner);
    }


//main
int main(){
    humanPlay();
    return 0;
}

I tried looking again at the printBoard() function to check if i misstyped any matrix position but i didn’t see any

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

You have to specify not the maximum index but the number of elements when you declare arrays in C.

The available indice for the array char board[9][9]; is 0 to 8 for each dimension.

Allocate enough elements like char board[10][10]; to fix the error.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading