Ir ao conteúdo
  • Cadastre-se

C Sugestões de melhorias para o programa


zZsmithZz

Posts recomendados

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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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