Funky tic-tac-toe

So, i have this game of tic tac toe:
[code]
#include <stdio.h>
#include <stdlib.h>

#define flag 10

//esta funcao recebe uma matriz e a imprime na forma tabuleiro.
void imprimir_grade(char m[3][3]){
int i,j;
printf("\n\n");
for(i = 0; i < 3; i++){
for(j = 0; j < 3; j++){
if(m[i][j] == '\0') {
printf(" %d", 3*(i)+(j+1));
}else{
printf(" %c", m[i][j]);
}
if(j!=2) { printf("|"); }
}
if(i != 2) {
printf("\n---------\n");
}
}
}
//essa funcao recebe uma matriz e compara os resultados retornando um caractere, determinando se ha um vencedor.
char funcao(char m[3][3]){
int i;
char p = '\0';
if(m[1][1]!='\0' && ((m[0][0] == m[1][1] && m[1][1] == m[2][2])||(m[0][2] == m[1][1]&& m[1][1] == m[2][0]))){
p = m[1][1];
}else{
for(i=0;i<3;i++){
if(m[i][0]!= '\0' && m[i][0] == m[i][1] && m[i][0] == m[i][2]){
p = m[i][0];
break;
}
else if(m[0][i] != '\0' && (m[0][i] == m[1][i])&&(m[0][i]== m[2][i])){
p = m[0][i];
break;
}
}
}
return p;
}
int main(){
//o vetor de uma posicao sera usado para ler a linha inteira, acabando com a nescessidade de usar fflush para cada scanf.
//Ele impede bugs quando a pessoa digitar caracteres sem querer.
int A, S, i, j, jogador, l, nlins, ncols;
char marcador, perdedor='\0', again, g[2];
char tabuleiro[3][3];
printf("Bem vindo ao Jogo da Velha!\n");
//a mascara usada no scanf vai ler todos os caracteres ate uma quebra de linha, mas salva apenas o primeiro.
//o -48 e responsavel pela conversao de char para numero.
do{
printf(" Digite 1 se voce usa o linux, e 2 se usa o windows: ");
scanf(" %[^\n]", g);
S = g[0] < 58 && g[0] > 47 ? g[0] - 48 : flag;
}while (S!=1 && S!= 2);

/*Aqui colocamos um label para redirecionamento*/inicio:
//este loop vai ler A quantas vezes forem nescessarias. Aindica a versao do jogo escolhida.
do{
printf("Aperte:\n1 - para jogar a variacao 1.\n2 - para jogar a variacao 2.\n0 - para ver as instrucoes de como usar.\n9 - para encerrar o programa.\n\n");
scanf(" %[^\n]", g);
A = g[0] < 58 && g[0] > 47 ? g[0] - 48 : flag;
}while(A != 1 && A != 2 && A != 0 && A != 9);

switch(A){
case 9:
printf("Obrigado por jogar!\n");
return 0;
case 0:
printf("----------------------------------------------------------------------------------------------\nEsse programa consiste em duas variacoes do jogo da velha:\n 1-O modo de jogo eh igual ao original, porem o jogador que \n completar uma linha, coluna ou diagonal primeiro eh o perdedor.\n 2- Cada jogador seleciona o seu marcador e a posicao desejada\n no inicio de cada rodada. O vencedor eh quem completar uma linha, coluna ou diagonal primeiro\n----------------------------------------------------------------------------------------------\n");
//aqui vamos usar o comando goto para redirecionar ao menu inicial.
goto inicio;

//Esta e o jogo. Optamos por deixar as duas versoes juntas, devido a semelhanca dos codigos.
default:
//este for reseta nosso tabuleiro.
perdedor = '\0';
for(i = 0; i < 3; i++) {
for(j = 0; j < 3; j++){
tabuleiro[i][j] = '\0';
}
}
if(S==1)
system("clear");
else
system("cls");
printf("Voces escolheram a modalidade %d!\n", A);

for( i=0; i<9 && perdedor=='\0'; i++){
printf("Rodada %d!\n", i+1);
imprimir_grade(tabuleiro);
jogador = i%2 + 1;
if(A == 1){
marcador = (jogador == 1) ? 'X' : 'O';
} else{
do{
printf("\nDigite o marcador, X ou O:\n");
scanf(" %[^\n]", g);
marcador = g[0];
if(marcador == 'x')
marcador = 'X';
else if(marcador == 'o')
marcador = 'O';
}while(marcador != 'X' && marcador != 'O');
}
printf("\nJogador %d, digite o quadrado que deseja marcar:\n", jogador);
scanf(" %[^\n]", g);
l = g[0] < 58 && g[0] > 47 ? g[0] - 48 : flag;;
l--;
ncols = l%3;
nlins = l/3;
if(l<0 || l>8 || tabuleiro[nlins][ncols] != '\0') {
do{
printf("Este lugar e invalido, tente novamente.\n");
scanf(" %[^\n]", g);
l = g[0] < 58 && g[0] > 47 ? g[0] - 48 : flag;
l--;
ncols = l%3;
nlins = l/3;
}while(l<0 || l>8 || tabuleiro[nlins][ncols] != '\0');
}
tabuleiro[nlins][ncols] = marcador;
perdedor = funcao(tabuleiro);
if(S==1)
system("clear");
else
system("cls");
}
if(perdedor == '\0'){
printf("Deu velha!\n");
}else{
if(A == 1){
//A funcao "funcao" determina quem ganhou o jogo para a versao 1.
if(perdedor == 'X'){
printf("O ganhador foi o jogador 2!\n");
} else {
printf("O ganhador foi o jogador 1!\n");
}
} else {
//Nesta versao o ultimo a jogar e sempre o vencedor.
printf("O ganhador foi o jogador %d!\n", jogador);
}
}
printf("Voces desejam jogar novamente?: S/N\n");
//Caso o usuário não deseje jogar novamente, o programa é encerrado. Caso contrário, o programa volta ao menu inicial.
do{
scanf(" %[^\n]", g);
again = g[0];
if(again == 's')
again = 'S';
else if(again == 'n')
again = 'N';
}while(!(again == 'S' || again == 'N'));
if(again == 'S'){
goto inicio;
} else{
printf("\n\nObrigada!\n\n");
}
break;
}
return 0;
}
[\code]

And i have to create an AI that wins the 2nd variation of the game, assuming that the computer is the first player. Any suggestions?
Last edited on
PLEASE USE CODE TAGS (the <> formatting button) when posting code.
It makes it easier to read your code and also easier to respond to your
post.
http://www.cplusplus.com/articles/jEywvCM9/
Hint: You can edit your post, highlight your code and press the <>
formatting button.
Topic archived. No new replies allowed.