Ir ao conteúdo
  • Cadastre-se

C Jogo da Velha em C erro na marcação


Posts recomendados

Olá amigos do fórum

 

Estou desenvolvendo um jogo da velha em c, e o único problema que tenho é que a condição que criei para verificar se determinada posição do tabuleiro já foi marcada não funciona. Por exemplo se eu marquei a posição 1,1 com o X e se o outro jogador marcar ela, o programa substitui o X pelo O.

 

Como eu poderia resolver isso? Já tentei colocar a função na int main, mas não funcionou.

Ficarei grato se puderem me dar uma luz.

 

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

void jogadap1();
void jogadap2();
void checajogada1();
void checajogada2();
void cvitoriap1();
void cvitoriap2();
void exibitab();
void menu();

int linha, coluna, jogadas, nivel, vencedor=0;
char jogodaveia[3][3];
  

void criartab(){//função para criar o tabuleiro
	for(linha=0;linha<=3;linha++){
		for(coluna=0;coluna<=3;coluna++){
			jogodaveia[linha][coluna]='0';
		}
	}
}



void exibitab(){//função para exibir o tabuleiro
	 printf("\n\n");	
	 printf(" %c | %c | %c\n",jogodaveia[0][0],jogodaveia[0][1],jogodaveia[0][2]);
	 printf("---+---+---\n");
     printf(" %c | %c | %c\n",jogodaveia[1][0],jogodaveia[1][1],jogodaveia[1][2]);
     printf("---+---+---\n");
     printf(" %c | %c | %c\n",jogodaveia[2][0],jogodaveia[2][1],jogodaveia[2][2]);
}

void jogadap1(){//jogador 1 faz a jogada
	 printf("\nO jogador 1 faz a jogada");
     printf("\nInforme a linha que voce quer marcar: ");
     scanf("%d",&linha);
                      
     printf("Informe a coluna que voce quer marcar: ");
     scanf("%d",&coluna);
     checajogada1();
     jogodaveia[linha-1][coluna-1]='X';
     cvitoriap1();
     jogadas++;             
}

void jogadap2(){//jogador 2 faz a jogada
	 printf("\nO jogador 2 faz a jogada");
     printf("\nInforme a linha que voce quer marcar: ");
    scanf("%d",&linha);
  printf("Informe a coluna que voce quer marcar: ");
     scanf("%d",&coluna);
     checajogada2();
     jogodaveia[linha-1][coluna-1]='O';
     cvitoriap2();
     jogadas++;
}


void checajogada1(){//checar o tabuleiro para não marcar em uma posição que já foi marcada
	if (jogodaveia[linha][coluna]!='0'){
		printf("\nJogada invalida");
		jogadap1();
	}
}

void checajogada2(){
	if (jogodaveia[linha][coluna]!='0'){
		printf("\nJogada invalida");
		jogadap2();
	}
}

void cvitoriap1(){//Condições de vitória do jogador 1
	if(jogodaveia[0][0]==jogodaveia[0][1]&&jogodaveia[0][1]==jogodaveia[0][2]&&jogodaveia[0][0]=='X'){
      vencedor=1;
    }
    else if(jogodaveia[1][0]==jogodaveia[1][1]&&jogodaveia[1][1]==jogodaveia[1][2]&&jogodaveia[1][0]=='X'){
       vencedor=1;
    }
    else if(jogodaveia[2][0]==jogodaveia[2][1]&&jogodaveia[2][1]==jogodaveia[2][2]&&jogodaveia[2][0]=='X'){
       vencedor=1;
    }
    else if(jogodaveia[0][0]==jogodaveia[1][0]&&jogodaveia[1][0]==jogodaveia[2][0]&&jogodaveia[0][0]=='X'){
       vencedor=1;
    }
    else if(jogodaveia[0][1]==jogodaveia[1][1]&&jogodaveia[1][1]==jogodaveia[2][1]&&jogodaveia[0][1]=='X'){
        vencedor=1;
    }
    else if (jogodaveia[0][2]==jogodaveia[1][2]&&jogodaveia[1][2]==jogodaveia[2][2]&&jogodaveia[0][2]=='X'){
        vencedor=1;
    }
    else if(jogodaveia[0][0]==jogodaveia[1][1]&&jogodaveia[1][1]==jogodaveia[2][2]&&jogodaveia[0][0]=='X'){
        vencedor=1;
    }
    else if(jogodaveia[0][2]==jogodaveia[1][1]&&jogodaveia[1][1]==jogodaveia[2][0]&&jogodaveia[0][2]=='X'){
        vencedor=1;
    }
    if(vencedor!=0){
     printf("\n\n---------------O vencedor foi o jogador %d !!!---------------\n\n",vencedor);
     printf("\n\n----------------------Parabens!---------------\n\n");
     exit(0);
	}      
}

void cvitoriap2(){//condições de vitória do jogador 2
	if(jogodaveia[0][0]==jogodaveia[0][1]&&jogodaveia[0][1]==jogodaveia[0][2]&&jogodaveia[0][0]=='O'){
        vencedor=2;
                                                                                              
    }
    else if(jogodaveia[1][0]==jogodaveia[1][1]&&jogodaveia[1][1]==jogodaveia[1][2]&&jogodaveia[1][0]=='O'){
	  vencedor=2;
                                                                                              
    }
    else if(jogodaveia[2][0]==jogodaveia[2][1]&&jogodaveia[2][1]==jogodaveia[2][2]&&jogodaveia[2][0]=='O'){
	 vencedor=2;
    } 
    else if(jogodaveia[0][0]==jogodaveia[1][0]&&jogodaveia[1][0]==jogodaveia[2][0]&&jogodaveia[0][0]=='O'){
	 vencedor=2;
                                                                                              
    }
     else if(jogodaveia[0][1]==jogodaveia[1][1]&&jogodaveia[1][1]==jogodaveia[2][1]&&jogodaveia[0][1]=='O'){
	 vencedor=2;
                                                                                              
    }
     else if (jogodaveia[0][2]==jogodaveia[1][2]&&jogodaveia[1][2]==jogodaveia[2][2]&&jogodaveia[0][2]=='O'){
	 vencedor=2;
                                                                                              
    }
     else if(jogodaveia[0][0]==jogodaveia[1][1]&&jogodaveia[1][1]==jogodaveia[2][2]&&jogodaveia[0][0]=='O'){
	 vencedor=2;
                                                                                            
    }
     else if(jogodaveia[0][2]==jogodaveia[1][1]&&jogodaveia[1][1]==jogodaveia[2][0]&&jogodaveia[0][2]=='O'){
	 vencedor=2;                                                                                   
    }
	 if(vencedor!=0){
     printf("\n\n---------------O vencedor foi o jogador %d !!!---------------\n\n",vencedor);
     printf("\n\n----------------------Parabens!---------------\n\n");
     exit(0);
   }
}
void menu(){
	 printf("\n\n---------------------BEM VINDO AO JOGO DA VEIA 2.0---------------------");
     printf("\n\nEscolha um nivel de dificuldade:\n\n(1) - Jogador vs Jogador \n(2) - Jogador vs PC \n(3) - Jogador vs IPC: \n\n ");
	 scanf("%d",&nivel);
}

int main(){
	menu();
	
	if (nivel == 1) {
		criartab();
		for(jogadas=1; jogadas<=9; jogadas++){
	 		exibitab();
	 		jogadap1();
	 		exibitab();
	 		jogadap2();
	 
   		}
   }
   return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Bom dia @Leandro Arnold

 

void checajogada1(){//checar o tabuleiro para não marcar em uma posição que já foi marcada
	if (jogodaveia[linha-1][coluna-1]!='0'){
		printf("\nJogada invalida");
		jogadap1();
	}
}

void checajogada2(){
	if (jogodaveia[linha-1][coluna-1]!='0'){
		printf("\nJogada invalida");
		jogadap2();
	}

Um pequeno erro de logica, você estava verificando a linha errada :D

 

Espero ter ajudado.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

O problema é que está fazendo uma recursividade maluca, jogadap1() chama checajogada1() que chama jogadap1() que chama checajogada1()... E no fim não altera nada porque quando voltar no retorno das funções ele vai voltar para o primeiro valor de linha e coluna que foram digitados.

 

Essas funções checajogada1 e checajogada2 deveriam ser do tipo int ao invés de void, e retornar 1 ou 0 (verdadeiro ou falso) dependendo do resultado. E no jogadap1 e jogadap2 deveria ter um if para checar o retorno, e fazer um ciclo para repetir a entrada de dados e fazer o jogador digitar coluna e linha novamente.

 

Edit: Não vi que as variáveis coluna e linha são globais. Mas a variável jogadas será incrementada (jogadas++) 2 ou mais vezes, dependendo de quantas vezes o jogador digitar uma posição inválida, ao invés de apenas 1.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Leandro Arnold  Olá. Seu jogo está muito bom, mas, como comentado acima, se um jogador fizer uma jogada inválida a sua variável jogada, q é incrementada a cada jogada, vai resultar em um valor errôneo, q não é o esperado.

Outro ponto q mais chama a atenção é a duplicidade de código. Note: Não estou aqui p corrigir ninguém, mas essa é apenas uma sugestão. Perceba q você cria uma função relativamente grande p verificar se o jogador 1 ganhou e depois praticamente faz outra função igual para verificar se o jogador 2 ganhou. Com a solicitação da jogada é a mesma coisa. Creio q, se você quiser, você pode resolver sozinho essa questão

OBS: É apenas uma sugestão para deixar seu código mais organizado.

Longe d mim corrigir alguém, inda mais com relação ao jogo da velha. Lembro do sofrimento q foi p mim criar o 1º jogo da velha. Misericórdia. Seu código está bom demais se comparar com o 1º jogo da velha q fiz! 

Como disse: é apenas uma sugestão procurar resolver a duplicidade de código.

Se porventura interessar posso passar um jogo da velha q tenho aqui q usa uma lógica com relação a verificar se ouve ganhador e a solicitação da jogada muito parecida com a sua.

Se acaso interessar posso postar aqui, aí, quem sabe, você vai poder perceber como é fácil resolver a questão da duplicidade d código. Mas, em geral, seu jogo da velha está ótimo! 

Link para o comentário
Compartilhar em outros sites

Muito obrigado pela observação Giu, não tinha me dado por conta disso, e o contador segue incrementando as jogadas inválidas, como eu posso arrumar isso no código?

 

Outro problema que enfrento agora é com relação ao modo jogador x computador. O computador marca o tabuleiro de forma randômica, mas do nada o programa dá erro e trava. Não sei o que está acontecendo.

 

Agradeço desde já pela atenção amigos.

Abraço!

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

void jogadap1();
void jogadap2();
void checajogada1();
void checajogada2();
void cvitoriap1();
void cvitoriap2();
void cempate();
void exibitab();
void computadorjoga();
void menu();

int linha, coluna, jogadas, nivel, vencedor=0;
char jogodaveia[3][3];

void computadorjoga(){//função para criar as jogadas randomicas do pc
	 srand(time(NULL));
	 linha= rand()%3;
	 coluna= rand()%3;
	 
	 if(jogodaveia[linha][coluna]=='0'){//se o espaço do tabuleiro estiver em branco, o computador marca
	 	jogodaveia[linha][coluna]='O';
	 	jogadas++;
	 }
	 else{
	 	computadorjoga();
	 }
}
void criartab(){//função para criar o tabuleiro
	for(linha=0;linha<=3;linha++){
		for(coluna=0;coluna<=3;coluna++){
			jogodaveia[linha][coluna]='0';
		}
	}
}

void exibitab(){//função para exibir o tabuleiro
	 printf("\n\n");	
	 printf(" %c | %c | %c\n",jogodaveia[0][0],jogodaveia[0][1],jogodaveia[0][2]);
	 printf("---+---+---\n");
     printf(" %c | %c | %c\n",jogodaveia[1][0],jogodaveia[1][1],jogodaveia[1][2]);
     printf("---+---+---\n");
     printf(" %c | %c | %c\n",jogodaveia[2][0],jogodaveia[2][1],jogodaveia[2][2]);
}

void jogadap1(){//jogador 1 faz a jogada
	 printf("\nO jogador 1 faz a jogada");
     printf("\nInforme a linha que voce quer marcar: ");
     scanf("%d",&linha);
                      
     printf("Informe a coluna que voce quer marcar: ");
     scanf("%d",&coluna);
     checajogada1();
     jogodaveia[linha][coluna]='X';
     cvitoriap1();
     jogadas++;
	 cempate();             
}

void jogadap2(){//jogador 2 faz a jogada
	 printf("\nO jogador 2 faz a jogada");
     printf("\nInforme a linha que voce quer marcar: ");
     scanf("%d",&linha);
                       
     printf("Informe a coluna que voce quer marcar: ");
     scanf("%d",&coluna);
     checajogada2();
  jogodaveia[linha][coluna]='O';
     cvitoriap2();
     jogadas++;
     cempate();
}


void checajogada1(){//checar o tabuleiro para não marcar em uma posição que já foi marcada
	if (jogodaveia[linha][coluna]!='0'){
		printf("\nJogada invalida");
		jogadap1();
	}
}

void checajogada2(){
	if (jogodaveia[linha][coluna]!='0'){
		printf("\nJogada invalida");
		jogadap2();
	}
}

void cvitoriap1(){//Condições de vitória do jogador 1
	if(jogodaveia[0][0]==jogodaveia[0][1]&&jogodaveia[0][1]==jogodaveia[0][2]&&jogodaveia[0][0]=='X'){
      vencedor=1;
    }
    else if(jogodaveia[1][0]==jogodaveia[1][1]&&jogodaveia[1][1]==jogodaveia[1][2]&&jogodaveia[1][0]=='X'){
       vencedor=1;
    }
    else if(jogodaveia[2][0]==jogodaveia[2][1]&&jogodaveia[2][1]==jogodaveia[2][2]&&jogodaveia[2][0]=='X'){
       vencedor=1;
    }
    else if(jogodaveia[0][0]==jogodaveia[1][0]&&jogodaveia[1][0]==jogodaveia[2][0]&&jogodaveia[0][0]=='X'){
       vencedor=1;
    }
    else if(jogodaveia[0][1]==jogodaveia[1][1]&&jogodaveia[1][1]==jogodaveia[2][1]&&jogodaveia[0][1]=='X'){
        vencedor=1;
    }
    else if (jogodaveia[0][2]==jogodaveia[1][2]&&jogodaveia[1][2]==jogodaveia[2][2]&&jogodaveia[0][2]=='X'){
        vencedor=1;
    }
    else if(jogodaveia[0][0]==jogodaveia[1][1]&&jogodaveia[1][1]==jogodaveia[2][2]&&jogodaveia[0][0]=='X'){
        vencedor=1;
    }
    else if(jogodaveia[0][2]==jogodaveia[1][1]&&jogodaveia[1][1]==jogodaveia[2][0]&&jogodaveia[0][2]=='X'){
        vencedor=1;
    }
    if(vencedor!=0){
     printf("\n\n---------------O vencedor foi o jogador %d !!!---------------\n\n",vencedor);
     printf("\n\n----------------------Parabens!---------------\n\n");
     exit(0);
	}     
}

void cvitoriap2(){//condições de vitória do jogador 2
	if(jogodaveia[0][0]==jogodaveia[0][1]&&jogodaveia[0][1]==jogodaveia[0][2]&&jogodaveia[0][0]=='O'){
        vencedor=2;
                                                                                              
    }
    else if(jogodaveia[1][0]==jogodaveia[1][1]&&jogodaveia[1][1]==jogodaveia[1][2]&&jogodaveia[1][0]=='O'){
	  vencedor=2;
                                                                                              
    }
    else if(jogodaveia[2][0]==jogodaveia[2][1]&&jogodaveia[2][1]==jogodaveia[2][2]&&jogodaveia[2][0]=='O'){
	 vencedor=2;
    } 
    else if(jogodaveia[0][0]==jogodaveia[1][0]&&jogodaveia[1][0]==jogodaveia[2][0]&&jogodaveia[0][0]=='O'){
	 vencedor=2;
                                                                                              
    }
     else if(jogodaveia[0][1]==jogodaveia[1][1]&&jogodaveia[1][1]==jogodaveia[2][1]&&jogodaveia[0][1]=='O'){
	 vencedor=2;
                                                                                              
    }
     else if (jogodaveia[0][2]==jogodaveia[1][2]&&jogodaveia[1][2]==jogodaveia[2][2]&&jogodaveia[0][2]=='O'){
	 vencedor=2;
                                                                                              
    }
     else if(jogodaveia[0][0]==jogodaveia[1][1]&&jogodaveia[1][1]==jogodaveia[2][2]&&jogodaveia[0][0]=='O'){
	 vencedor=2;
                                                                                            
    }
     else if(jogodaveia[0][2]==jogodaveia[1][1]&&jogodaveia[1][1]==jogodaveia[2][0]&&jogodaveia[0][2]=='O'){
	 vencedor=2;                                                                                   
    }
	 if(vencedor!=0){
     printf("\n\n---------------O vencedor foi o jogador %d !!!---------------\n\n",vencedor);
     printf("\n\n----------------------Parabens!---------------\n\n");
     exit(0);
   }
}

void cempate(){
	if((jogadas==9)&&(vencedor==0)){
		printf("\n\n--------------DEU VEIA!---------------\n\n");
		exit(0);
	}
}
void menu(){
	 printf("\n\n---------------------BEM VINDO AO JOGO DA VEIA 2.0---------------------");
     printf("\n\nEscolha um nivel de dificuldade:\n\n(1) - Jogador vs Jogador \n(2) - Jogador vs PC \n(3) - Jogador vs PC Imbativel: \n\n ");
	 scanf("%d",&nivel);
}

int main(){
	menu();

	if (nivel == 1) {
		criartab();
		do{
	 		exibitab();
	 		jogadap1();
	 		exibitab();
	 		jogadap2();
	 		
   		}while(jogadas<=9); 
   }
   if  (nivel==2){
   	    criartab();
   	    do{
   		    exibitab();jogadap1();
   		    exibitab();
   		    computadorjoga();
   		 
   	}while(jogadas<=9);
   	
   }
   return 0;
}

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

@Leandro Arnold  Olá. Vou procurar primeiro passar um exemplo de um jogo da velha q creio q você vai entender bem.

A meta, com isso, é você ver como é simples resolver o problema de duplicidade de código.

Perceba nesse exemplo q vou passar, q a mesma função para verificar se há ganhador serve tanto para um jogador como para outro. Espero q com esse exemplo possa, de alguma forma, ajudar.

#include <stdio.h>
#include <stdbool.h> // para trabalhar com variáveis do tipo booleana, true e false
#include <windows.h>
#include <string.h>

char matriz[3][3];

void showMatriz();
void initMatriz();
void requestPlay(char simbolo);
bool isComplete();
bool isSequence();
void iniciar();
void readString(char dados[], int tam);

struct jogador
{
    char nome[50];
    char simbolo;
};


void readString(char dados[], int tam)
{
    char ch;

    fgets(dados, tam, stdin);
    strtok(dados, "\n");
    if (strlen(dados) == tam - 1)
    {
        while ((ch = getchar()) != '\n' && ch != EOF);
    }
}

void iniciar()
{
    int indexAtual, qtdeJogadores = 2, i;
    struct jogador j[2];

    system("cls");

    printf("=====================\n");
    printf("==| JOGO DA VELHA |==\n");
    printf("=====================\n\n");

    indexAtual = 0;

    printf("DIGITE O NOME DO JOGADOR 1: ");
    readString(j[indexAtual].nome, 50); // aqui eu criei uma função para ler uma string (nome), pode também fazer uso do printf se preferir
    j[indexAtual].simbolo = 'X'; // aqui atribu0 o símbolo para o jogador

    indexAtual++;

    printf("DIGITE O NOME DO JOGADOR 2: ");
    readString(j[indexAtual].nome, 50);
    j[indexAtual].simbolo = 'O';

    bool finalizado = false;

    char *vencedor = NULL;

    indexAtual = 0;

    initMatriz(); // esvaziar o tabuleiro

    while (!finalizado)
    {
        system("cls"); // para limpar a tela

        showMatriz(); // imprimir o tabuleiro

        printf("E a vez do jogador %s\n", j[indexAtual].nome);

        requestPlay(j[indexAtual].simbolo); // aqui é a jogada, onde passo o símbolo referente a cada jogador como parâmetro

        if (isSequence()) // aqui equivale a fazer isso (isSequence() == true)
        {
            vencedor = j[indexAtual].nome;
            finalizado = true;
        }
        else if (isComplete())
            finalizado = true;

        // aqui o valor de indexAtual fica sendo intercalado entre 0 e 1
        indexAtual = (indexAtual + 1) % qtdeJogadores;
    }

    system("cls");
    showMatriz();

    if (vencedor == NULL) // se vencedor continua como NULL, significa que não houve vencedor, (empate), senão um jogador ganhou
        printf("    O Jogo terminou empatado!\n\n");
    else
        printf("    O Jogador %s ganhou!\n\n", vencedor);

    vencedor = NULL;

    printf("\nFIM DE JOGO!\n\n");
}


int main()
{
    system("title Jogo da Velha");

    char sim[5];

    do
    {
        iniciar();

        printf("\nDeseja jogar novamente? [s/n]: ");
        readString(sim, 5);

    } while (!strcmp("s", sim));

    system("cls");

    printf("\n\n\tObrigado por usar esse programa!\n\n");

    return 0;
}

// aqui é pra limpar o tabuleiro
void initMatriz()
{
    int i, j;

    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 3; j++)
        {
            matriz[i][j] = ' ';
        }
    }
}

// tabuleiro usado no jogo
void showMatriz()
{
    int i, j, cont;

    printf("\n\n\t");
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 3; j++)
        {
            printf("  %c  ", matriz[i][j]);
            if (j < 2)
            {
                printf("%c", -77); // colunas
            }
        }
        printf("\n\t");

        for (cont = 1; cont <= 15; cont++)
        {
            if (i < 2)
            {
                printf("%c", -60); // linhas
                if (cont == 5 || cont == 10)
                {
                    printf("%c", -59); // '+'
                }
            }
        }
        printf("\n\t");
    }

    printf("\n\n");
}

// exemplo de uma tabuleiro mais simples

void ShowTab()
{
    int i;

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

	for (i = 0; i < 3; i++)
	{
		printf("\t %c | %c | %c ", matriz[i][0], matriz[i][1], matriz[i][2]);

		if (i < 2)
		{
			printf("\n\t---|---|---\n");
		}
	}

	printf("\n\n\n");
}

// aqui é solicitada a jogada para o jogador
void requestPlay(char simbolo)
{
	int jogada = 0, i, j;

	do
	{
		printf("\nLINHA: ");
		scanf("%d", &i);
		fflush(stdin);

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

		if ((i > 3 || i < 1) || (j < 1 || j > 3))
		{
			printf("\nERRO: Jogada invalida!\n");
			jogada = 0;
			continue;
		}
		else
			jogada = 1;

		if (matriz[i - 1][j - 1] != ' ')
		{
			printf("\nERRO: Essa jogada ja foi efetuada!\n");
			jogada = 0;
			continue;
		}
		else
			jogada = 1;

	} while (!jogada);

	matriz[i - 1][j - 1] = simbolo;
}

// aqui é verificado se houve empate
bool isComplete()
{
    int i, j;

    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 3; j++)
        {
            if (matriz[i][j] == ' ')
            {
                return false;
            }
        }
    }
    return true;
}

// aqui é verificado se algum jogador ganhou
bool isSequence()
{
	// Linhas
	if (matriz[0][0] == matriz[0][1] && matriz[0][1] == matriz[0][2] && matriz[0][0] != ' ')
	{
		return true;
	}
	if (matriz[1][0] == matriz[1][1] && matriz[1][1] == matriz[1][2] && matriz[1][0] != ' ')
	{
		return true;
	}
	if (matriz[2][0] == matriz[2][1] && matriz[2][1] == matriz[2][2] && matriz[2][0] != ' ')
	{
		return true;
	}
	// Colunas
	if (matriz[0][0] == matriz[1][0] && matriz[1][0] == matriz[2][0] && matriz[0][0] != ' ')
	{
		return true;
	}
	if (matriz[0][1] == matriz[1][1] && matriz[1][1] == matriz[2][1] && matriz[0][1] != ' ')
	{
		return true;
	}
	if (matriz[0][2] == matriz[1][2] && matriz[1][2] == matriz[2][2] && matriz[0][2] != ' ')
	{
		return true;
	}
	// Diagonais
	if (matriz[0][0] == matriz[1][1] && matriz[1][1] == matriz[2][2] && matriz[0][0] != ' ')
	{
		return true;
	}
	if (matriz[2][0] == matriz[1][1] && matriz[1][1] == matriz[0][2] && matriz[2][0] != ' ')
	{
		return true;
	}

	return false;
}

Procure entender bem o que está sendo feito no jogo. Caso tiver alguma dúvida fique a vontade para perguntar, ok?

adicionado 3 minutos depois

Perceba q eu faço uso do tipo de dado bool inserindo o arquivo de cabeçalho "stdbool.h". Caso preferir, usar os valores 0 para false e 1 para true

Link para o comentário
Compartilhar em outros sites

Sua função da jogada do computador sempre calcula uma posição aleatória entre todas as posições possíveis na velha, e quando a posição escolhida já está ocupada ele chama a função novamente, recursivamente.

 

Mas quanto mais jogadas se passarem menos posições livres existem, logo é menos provável que a posição sorteada seja uma das que ainda estão livres.

 

O que significa que existe uma grande chance do seu programa ficar chamando a função de jogada do computador recursivamente muitas e muitas vezes sem dar sorte de cair numa posição livre, até que atinge o limite de chamadas recursivas e o programa trava.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

8 horas atrás, isrnick disse:

Sua função da jogada do computador sempre calcula uma posição aleatória entre todas as posições possíveis na velha, e quando a posição escolhida já está ocupada ele chama a função novamente, recursivamente.

 

Mas quanto mais jogadas se passarem menos posições livres existem, logo é menos provável que a posição sorteada seja uma das que ainda estão livres.

 

O que significa que existe uma grande chance do seu programa ficar chamando a função de jogada do computador recursivamente muitas e muitas vezes sem dar sorte de cair numa posição livre, até que atinge o limite de chamadas recursivas e o programa trava.

Então eu devo retirar a recursividade para o problema parar e fazer outra função para o computador não marcar em uma posição que já está marcada?

Link para o comentário
Compartilhar em outros sites

Recursividade funciona bem quando se tem um limite finito as chamadas a própria função, mas sua função pode ficar rodando recursivamente indefinidamente, pois depende de valores aleatórios.

 

Mas eu diria que o problema está na lógica, o modo que eu faria seria sortear apenas as posições livres, tal que nunca sorteia uma posição já ocupada, assim nunca há conflito.

 

Por exemplo, poderia obter o número de posições ainda vazias na velha, depois obter um número n aleatório entre 1 e o número de posições vazias, aí você preenche a n-ésima posição vazia da matriz (percorre a matriz até contar n posições não preenchidas e põe o 'O' na posição final).

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

13 minutos atrás, Leandro Arnold disse:

Então eu devo criar uma outra matriz para armazenar as posições vazias e marcar o aleatório em cima delas?

 

Não, sua matriz já indica casas vazias com o caractere '0', então a posição está "vazia" se tiver o caractere '0' nela.

count = 0;
for(i = 0; i < 3; i++) {
    for(j = 0; j < 3; j++) {
        if (matriz[i][j] == '0') //Se estiver "vazia"
            count++;  //Incrementa o contador
      
        if (count == n)  //Na n-ésima posição "vazia"
            matriz[i][j] = 'O'; //Jogada do Computador
    }
}

Onde n seria um número aleatório entre 1 e a quantidade de posições ainda vazias na matriz ( = 9 - jogadas se o número de jogadas for contado corretamente).

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Então o código ficaria assim amigo?

 

void computadorjoga(){//função para criar as jogadas randomicas do pc
int count=0, n;
	 srand(time(NULL));
	 linha= rand()%3;
	 coluna= rand()%3;
	 
	 for(linha=0;linha<=3;linha++){
	 	for(coluna=0;coluna<=3;coluna++){
	      if(jogodaveia[linha][coluna]=='0'){//se o espaço do tabuleiro estiver em branco, o computador marca
	 	     count++;
	       }
	      if(count==n){
	      	jogodaveia[linha][coluna]=='O';
		  }
	 }
   }
}

 

Link para o comentário
Compartilhar em outros sites

Supondo que o número de jogadas esteja correto:

void computadorjoga(){//função para criar as jogadas randomicas do pc
    int i, j, count, n;
    
    n = rand() % (9-jogadas) + 1;
    
    count = 0;
    for(i = 0; i < 3; i++) {
        for(j = 0; j < 3; j++) {
            if (matriz[i][j] == '0') //Se estiver "vazia"
                count++;  //Incrementa o contador
      
            if (count == n){  //Na n-ésima posição "vazia"
                matriz[i][j] = 'O'; //Jogada do Computador
                jogadas++;
                return;
            }
        }
    }
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

17 horas atrás, isrnick disse:

Supondo que o número de jogadas esteja correto:


void computadorjoga(){//função para criar as jogadas randomicas do pc
    int i, j, count, n;
    
    n = rand() % (9-jogadas) + 1;
    
    count = 0;
    for(i = 0; i < 3; i++) {
        for(j = 0; j < 3; j++) {
            if (matriz[i][j] == '0') //Se estiver "vazia"
                count++;  //Incrementa o contador
      
            if (count == n){  //Na n-ésima posição "vazia"
                matriz[i][j] = 'O'; //Jogada do Computador
                jogadas++;
                return;
            }
        }
    }
}

 

Muito obrigado pela ajuda. Agora o programa não trava mais amigo.

Me desculpe pelo monte de perguntas que te enviei.

 

Abração!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...