Jogo da velha em C, erro ao executar

Estou fazendo o cruso do C Progressivo, estou tentando por mim mesmo fazer o jogo da velha, porém estou com um erro para escrever a matriz na tela, ele da um erro no programa e fecha, achei um algoritmo na internet que faz o mesmo que o meu para escrever a matriz na tela, não muda nada, não sei porque o meu está dando erro e o dele consegui executar, segue meu código (está incompleto, estou tentando fazer ainda com alguns testes, não estranhem):

`#include <stdio.h>

int main()
{
char tabuleiro[3][3];
int linha, coluna, opcao = 0;

for (linha = 0 ; linha < 3 ; linha++)
{
    for (coluna = 0 ; linha < 3 ; coluna++)
    {
        tabuleiro[linha][coluna] = ' ';
    }
}

do
{
    printf("+---+---+---+\n");
    printf("| %c | %c | %c |\n",tabuleiro[0][0],tabuleiro[0][1],tabuleiro[0][2]);
    printf("+---+---+---+\n");
    printf("| %c | %c | %c |\n",tabuleiro[1][0],tabuleiro[1][1],tabuleiro[1][2]);
    printf("+---+---+---+\n");
    printf("| %c | %c | %c |\n",tabuleiro[2][0],tabuleiro[2][1],tabuleiro[2][2]);
    printf("+---+---+---+\n");

    printf("Escolha uma opcao: ");
    scanf("%d",&opcao);
    system("cls");

    switch (opcao) {
        case 1:
            tabuleiro[0][0] = 9;
            break;
        case 2:
            tabuleiro[0][1] = 9;
            break;
        case 3:
            tabuleiro[0][2] = 9;
            break;
        case 4:
            tabuleiro[1][0] = 9;
            break;
        case 5:
            tabuleiro[1][1] = 9;
            break;
        case 6:
            tabuleiro[1][2] = 9;
            break;
        case 7:
            tabuleiro[2][0] = 9;
            break;
        case 8:
            tabuleiro[2][1] = 9;
            break;
        case 9:
            tabuleiro[2][2] = 9;
            break;
        default:
            printf("Opcao invalida!\n");
    }
}while(1);

}
`

E o que achei é esse:

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

int main(void)
{
char Matriz[3][3];
char O=‘O’, X=‘X’;
int l=0,j,i;

for(i=0;i<3;i++)
    for(j=0;j<3;j++)
        Matriz[i][j]=' ';

while(l<=9)
    {
    printf("  JOGO DA VELHA \n");
    for(i=0;i<3;i++)
    {
        printf("\t\t     %c \xBA %c \xBA %c\n",Matriz[i][0],Matriz[i][1],Matriz[i][2]);
        if(i<3-1)
        {
            printf("\t\t    ÍÍÍ\xCEÍÍÍ\xCEÍÍÍ\n");
        }
    }

    printf("\n\n\n\n\n\n\n\n\n\n\n\nINSIRA AS COORDENADAS, ");
    if(l%2)printf("PLAYER 2\nLINHA: ");
    else printf("PLAYER 1\nLINHA: ");

    scanf("%d",&i);
    printf("COLUNA: ");
    scanf("%d",&j);

    if(Matriz[i-1][j-1]==' ')
    {
        if(l%2)Matriz[i-1][j-1]=X;
        else Matriz[i-1][j-1]=O;
        l++;
    }


    if((Matriz[0][0]==O && Matriz[0][1]==O && Matriz[0][2]==O)||
       (Matriz[1][0]==O && Matriz[1][1]==O && Matriz[1][2]==O)||
       (Matriz[2][0]==O && Matriz[2][1]==O && Matriz[2][2]==O)||
       (Matriz[0][0]==O && Matriz[1][0]==O && Matriz[2][0]==O)||
       (Matriz[0][1]==O && Matriz[1][1]==O && Matriz[2][1]==O)||
       (Matriz[0][2]==O && Matriz[1][2]==O && Matriz[2][2]==O)||
       (Matriz[0][0]==O && Matriz[1][1]==O && Matriz[2][2]==O)||
       (Matriz[0][2]==O && Matriz[1][1]==O && Matriz[2][0]==O))
    {
        printf("\n\a\t\tJogador 1, VOCE VENCEU!!!");
        break;
    }
    if((Matriz[0][0]==X && Matriz[0][1]==X && Matriz[0][2]==X)||
       (Matriz[1][0]==X && Matriz[1][1]==X && Matriz[1][2]==X)||
       (Matriz[2][0]==X && Matriz[2][1]==X && Matriz[2][2]==X)||
       (Matriz[0][0]==X && Matriz[1][0]==X && Matriz[2][0]==X)||
       (Matriz[0][1]==X && Matriz[1][1]==X && Matriz[2][1]==X)||
       (Matriz[0][2]==X && Matriz[1][2]==X && Matriz[2][2]==X)||
       (Matriz[0][0]==X && Matriz[1][1]==X && Matriz[2][2]==X)||
       (Matriz[0][2]==X && Matriz[1][1]==X && Matriz[2][0]==X))
    {
        printf("\n\n\n\n\a\t\tJogador 2, VOCE VENCEU!!!");
        break;
    }

    if(l==9)
    {
        printf("PARTIDA EMPATADA");
        break;
    }

}
getch();
return(0);

}

`

Reparem que que o inicio quando eu faço os “for” pra preencher a matriz com ’ ’ está igual o algoritmo que achei, não sei qual o problema.

Não sei se resolve seu problema, pois não testei os códigos que você postou, apenas dei uma olhada rápida e vi que no seu segundo for tem um negócio estranho.

Seu código tá assim:

for (linha = 0 ; linha < 3 ; linha++) {
    for (coluna = 0 ; linha < 3 ; coluna++) {
        tabuleiro[linha][coluna] = ' ';
    }
}

Viu? No for de dentro não deveria ser coluna < 3?

Nossa cara, eu li esse codigo 1000 vezes e não vi isso acredita?
obrigado.

O jogo ta funcionado, mas sem o uso de funções, agora vou melhorar isso, acho que o switch não ficou legal, poluiu muito o código, amanhâ vou aperfeiçoar.

`#include <stdio.h>

int main()
{
char tabuleiro[3][3],x = ‘X’,o = ‘O’, vez=o;
int linha, coluna, opcao = 0, termino = 1, count = 49;

for (linha = 0 ; linha < 3 ; linha++)
{
    for (coluna = 0 ; coluna < 3 ; coluna++)
    {
        tabuleiro[linha][coluna] = count++;
    }
}

do
{
    printf("> > > > > JOGO DA VELHA 1.0 < < < < <\n\n");
    printf("+---+---+---+\n");
    printf("| %c | %c | %c |\n",tabuleiro[0][0],tabuleiro[0][1],tabuleiro[0][2]);
    printf("+---+---+---+\n");
    printf("| %c | %c | %c |\n",tabuleiro[1][0],tabuleiro[1][1],tabuleiro[1][2]);
    printf("+---+---+---+\n");
    printf("| %c | %c | %c |\n",tabuleiro[2][0],tabuleiro[2][1],tabuleiro[2][2]);
    printf("+---+---+---+\n");

    if (vez == x) {
        vez = o;
    } else if (vez == o) {
        vez = x;
    }

    printf("\nEscolha uma opcao: ");
    scanf("%d",&opcao);
    system("cls");

    switch (opcao) {
        case 1:
            tabuleiro[0][0] = vez;
            break;
        case 2:
            tabuleiro[0][1] = vez;
            break;
        case 3:
            tabuleiro[0][2] = vez;
            break;
        case 4:
            tabuleiro[1][0] = vez;
            break;
        case 5:
            tabuleiro[1][1] = vez;
            break;
        case 6:
            tabuleiro[1][2] = vez;
            break;
        case 7:
            tabuleiro[2][0] = vez;
            break;
        case 8:
            tabuleiro[2][1] = vez;
            break;
        case 9:
            tabuleiro[2][2] = vez;
            break;
        default:
            printf("Opcao invalida!\n");
    }

    if(tabuleiro[0][0] == tabuleiro[0][1] && tabuleiro[0][0] == tabuleiro[0][2] ||+
       tabuleiro[1][0] == tabuleiro[1][1] && tabuleiro[1][0] == tabuleiro[1][2] ||+
       tabuleiro[2][0] == tabuleiro[2][1] && tabuleiro[2][0] == tabuleiro[2][2] ||+

       tabuleiro[0][0] == tabuleiro[1][0] && tabuleiro[0][0] == tabuleiro[2][0] ||+
       tabuleiro[0][1] == tabuleiro[1][1] && tabuleiro[0][1] == tabuleiro[1][2] ||+
       tabuleiro[0][2] == tabuleiro[1][2] && tabuleiro[0][2] == tabuleiro[2][2] ||+

       tabuleiro[0][0] == tabuleiro[1][1] && tabuleiro[0][0] == tabuleiro[2][2] ||+
       tabuleiro[0][2] == tabuleiro[1][1] && tabuleiro[0][2] == tabuleiro[2][0])
    {
        printf("%c ganhou!\n",vez);
        termino = 0;
    }
}while(termino);

}
`