Ir ao conteúdo

Posts recomendados

Postado

Olá pessoal, tudo bem com vocês? 
Bem, recentemente venho estudando linguagem de programação C e peguei uma atividade aparentemente simples para fazer um jogo da velha funcionar e depois otimizá-lo. 

Inicialmente, o código veio incompleto para que eu preenchesse as lacunas e com vários erros de sintaxe, então precisava consertar tudo e fazer o mesmo rodar; isso eu já fiz, porém, preciso agora otimizar o mesmo para que funcione melhor.

Poderiam me dar uma força?

#include <stdio.h>

int main (void) {
	
	char Matriz[3][3]; //Declaração da matriz para o jogo
	char O = 'O', X = 'X';
	int jogadas = 0, j, i;
	
	for (i = 0; i < 3; i++) //Inicialização da matriz do jogo
		for (j = 0; j < 3; j++)
			Matriz[i][ j] = ' ' ;
	
	while (jogadas <= 9) 
	{
		printf (" JOGO DA VELHA \n");
		
		for (i = 0; i < 3; i++) 
		{
			printf ("\t\t %c  | %c | %c\n",Matriz [i] [0], Matriz [i] [1], Matriz
			[i] [2]);
			
			if (i < 3-1) {
				printf ("\t\t ---+---+--- \n");
			}			
		}
		
		printf ("\nINSIRA AS COORDENADAS, ");
		
		if (jogadas % 2)
			printf ("JOGADOR 2\n");
		else
			printf ("JOGADOR 1\n");
	
		printf ("LINHA :");
		scanf ("%d",&i);
		
		printf ("COLUNA: ");
		scanf ("%d",&j); //Parâmetros para entrada de dados da coluna
		
		if (Matriz [i-1] [j-1] == ' ') 
		{
			if (jogadas%2)
				Matriz [i-1] [j-1] = X;
			else
				Matriz [i-1] [j-1] = O;
		
			jogadas++;
		}
	
		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, VOCÊ VENCEU!!!\n");
			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, VOCÊ VENCEU!!!\n");
			break;
		}
	
		if (jogadas==9) 
		{
			// Condição para que a partida termine empatada
			printf ("PARTIDA EMPATADA");
			break;
		}
	}
	
	return (0);
}

 

  • Amei 1
Postado

Funcionar melhor em que sentido?

 

você pode colocar as partes do código que se repetem em uma chamada de função:

#include <stdio.h>

int verificar_vitoria(char Matriz[3][3], char O)
{
    	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))
		{
			return 1;
		}
		return 0;
}

int main (void) {
	
	char Matriz[3][3]; //Declaração da matriz para o jogo
	char O = 'O', X = 'X';
	int jogadas = 0, j, i;
	
	for (i = 0; i < 3; i++) //Inicialização da matriz do jogo
		for (j = 0; j < 3; j++)
			Matriz[i][ j] = ' ' ;
	
	while (jogadas <= 9) 
	{
		printf (" JOGO DA VELHA \n");
		
		for (i = 0; i < 3; i++) 
		{
			printf ("\t\t %c  | %c | %c\n",Matriz [i] [0], Matriz [i] [1], Matriz
			[i] [2]);
			
			if (i < 3-1) {
				printf ("\t\t ---+---+--- \n");
			}			
		}
		
		printf ("\nINSIRA AS COORDENADAS, ");
		
		if (jogadas % 2)
			printf ("JOGADOR 2\n");
		else
			printf ("JOGADOR 1\n");
	
		printf ("LINHA :");
		scanf ("%d",&i);
		
		printf ("COLUNA: ");
		scanf ("%d",&j); //Parâmetros para entrada de dados da coluna
		
		if (Matriz [i-1] [j-1] == ' ') 
		{
			if (jogadas%2)
				Matriz [i-1] [j-1] = X;
			else
				Matriz [i-1] [j-1] = O;
		
			jogadas++;
		}
	
	
	    if (verificar_vitoria(Matriz, O)) 
	    {
	        printf("\n\a\t\tJogador 1, VOCÊ VENCEU!!!\n");
			break;
	    }
	
		if (verificar_vitoria(Matriz, X)) 
		{
			printf ("\n\n\n\n\a\t\tJogador 2, VOCÊ VENCEU!!!\n");
			break;
		}
	
		if (jogadas==9) 
		{
			// Condição para que a partida termine empatada
			printf ("PARTIDA EMPATADA");
			break;
		}
	}
	
	return (0);
}

Não irá alterar a forma de funcionamento, mas deixa o código mais iteligível.

  • Curtir 2
Postado
1 hora atrás, zZsmithZz disse:

Tenho um pouco de dificuldade de buscar cosias um pouco mais antigas:'( Vou conferir. valeu

 

coisas da semana passada? Não sei se entendi

 

Eis o que eu particularmente sugeri lá:
 

O programa não está ok. Mas não muito bom de ler, rodar ou jogar. Do ponto de vista da interface, é muito chato digitar linha e coluna se só tem 9 casinhas na tela. Podia por exemplo mostrar apenas algo como

| X | O | X | 
| 4 | 5 | 6 |
| 7 | O | 9 |

 

E o cara digita o número da célula que quer. Linha e Coluna é exagero.

 

O programa está difícil de ler com aquela matriz de duas dimensões e aqueles IF gigantes. Se só são dois jogadores porque não usar uma matriz para cada um? Fica mais fácil de identificar vitoria e pode ficar mais fácil de ler o programa... E quando um ganha o outro perde afinal.

 

E pouco eficiente: só existem essas 8 combinações decisivas, as 3 linhas e as 3 colunas e as duas diagonais. Então pode usar constantes já na compilação e comparar com valores fixos.

  • Obrigado 1

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