Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Leandro Arnold

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

Recommended Posts

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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado amigo, nem tinha me dado por conta.

Agora funciona certinho, e vou fazer as condições para o pc jogar.

 

Abração amigo!

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

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.

Editado por isrnick
  • Curtir 1

Compartilhar este post


Link para o post
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! 

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi seu código, obrigado por compartilhar.

 

O que não consigo resolver no meu, é o erro que aparece quando executo o programa para jogar contra o computador.

Às vezes trava, às vezes funciona.

Não sei o que está acontecendo.

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

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).

Editado por isrnick
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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';
		  }
	 }
   }
}

 

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×