Complete o programa que permite jogar o jogo da velha de forma que ele termine quando um jogador complete alguma linha, coluna ou diagonal.
Passo 1
Fala aí! Bora fazer um programinha bem legal, vamos jogar o famoso jogo da velha!
Bom, a primeira coisa que é sempre bom ressaltar quando se trata de programação é que, para qualquer programa, sempre existem várias respostas. O jeito que eu chego na resposta para esta questão pode não ser exatamente igual ao seu, e, se ambos funcionarem, tá tudo certo!
Beleza, agora vamos ao que interessa. Vamos começar declarando um vetor que vai ser responsável por numerar nosso tabuleiro:

Eu escolhi criar um com 10 posições só pra ficar mais intuitivo, pois em C, a primeira posição de um vetor é sempre referida como posição[0], e isso pode acabar confundindo.
Em seguida, vamos escrever a função responsável por mostrar o jogo na tela do usuário:

Certo, basicamente, montamos uma tabelinha usando os caracteres | e __ e preenchemos cada espaço com sua respectiva numeração
Passo 2
Maravilha, bora pra próxima função!

Coloquei um nome bem intuitivo, essa função serve pra verificar se algum jogador venceu, seja em uma linha (linhas 31 a 40), coluna (linhas 42 a 51) ou coluna (linhas 53 a 61). Basicamente, a função compara cada espaço e retorna o valor 1 ou 0, por exemplo, a expressão na linha 31 compara as posições 1, 2 e 3, se todas forem iguais, ela retorna o valor lógico 1, indicando que um jogador venceu. A linha 63 serve para identificar um empate, quando ninguém conseguir marcar uma sequência, o valor retornado é 0. Aquele “return -1” vai ser relevante logo logo.
(Mais uma vez, existem inúmeros jeitos de escrever esse passo, poderíamos, por exemplo utilizar dois laços for e um if encadeados. Eu escolhi esse jeito porque, apesar de bem mais extenso, fica mais intuitivo 😊).
Passo 3
Bora pra função principal agora:

Começamos declarando as variáveis que iremos utilizar, a jogador serve como um contador de turnos, i é basicamente auxiliar, escolha serve para registrar a casa escolhida pelo jogador em cada turno e marcar é o que utilizaremos para substituir o número da casa escolhida pelo jogador pelo seu símbolo (X ou O).
Beleza, em seguida vamos abrir um laço do...while, pois queremos executar as instruções a seguir logo de cara. Vamos invocar a função tabuleiro na linha 79 para mostrar o jogo na tela do jogador e identificar de qual jogador é o turno na linha seguinte.
As linhas 87 a 112 respondem à escolha do jogador, por exemplo, a linha 87 diz o seguinte:
se o jogador escolher a casa 1 (escolha == 1) e a casa 1 estiver desocupada (posição[1] == ‘1’)
então registre o símbolo do jogador na posição 1 (posição[1] = marcar)
E isso se repete para cada possível escolha. Caso o jogador escolha uma casa que não existe, ou que já esteja ocupada, retornamos com a mensagem “Movimento invalido!”.

Aí chegamos na segunda parte do laço do...while, lembra quando falei daquele return -1 na função verifica_venceu lá no passo 2? É aqui que ele entra! Aqui, estamos dizendo que enquanto i for igual a -1 (while (i == -1) todo o processo acima deve ser repetido e, anteriormente, dizemos que i seria igual a -1 enquanto ninguém tiver vencido, fazemos essa conexão na linha 121. Pra isso que serve o return -1, sem ele, o programa não saberia decidir quando parar.
Passo 4
Agora é só correr pro abraço. Vamos chamar a função tabuleiro uma vez fora do laço do...while só pra atualizar o estado final do jogo e colocamos as mensagens finais. Vamos verificar o valor de i, se ele for igual a 1, como vimos lá no passo 2, algum jogador venceu o jogo, caso contrário, deu empate.
E finalizamos o programa! Pode chamar um amigo pra uma partida e ainda se exibir com o jogo que você escreveu 😊.
Resposta
Resposta nos passos anteriores.