Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Karolinne

"Problema jogo da velha".

Recommended Posts

Boa noite gente,

 

estou com o seguinte problema no codigo do meu jogo da velha ( que segue abaixo) no tratamento de erro na hora que o usuario vai digitar a linha e a coluna não pode aceitar caracteres do tipo A..b..c...&*(#$ etc..somente os numeros 1 2 e 3. Bom tentei de muitas formas e nao consegui..

talvez vcs possam me ajudar.

Vou postar o codigo inteiro(pra quem quiser rodar e ver) e somente o codigo que quero corrigir..

obrigada.

 

 

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int main()
{
   char matriz[3][3], valor, jog1[60], jog2[60], resp; //Declarando as variaveis.
   int linha=0, coluna=0, i=0, j=0, empate=0, venceu=0,cont=1, jogada=0, verifica[3][3];
   do
   {
	  jogada=1;			  //Menu
	  empate=0;
	  venceu=0;
	  fflush(stdin);  
	  printf("		   JOGO DA VELHA\n");
	  printf("		   ==== == =====\n\n\n\n");
	  printf("JOGADOR 1: "); gets(jog1); //Pegando os nomes dos jogadores
	  printf("**********\n");		 
	  printf("JOGADOR 2: "); gets(jog2);
	  printf("***************************************************************\n");
	  printf("JOGADOR 1: %s = \"X\"\n", jog1); //Mostra as letras do jogador.
	  printf("JOGADOR 2: %s = \"O\"\n", jog2);
	  printf("***************************************************************\n");
	  printf("PRESSIONE \"ENTER\" PARA CONTINUAR..."); getchar();
	  system("cls");
	  for(i = 0; i <= 3; i++)
	  {
		 for(j = 0; j <= 3; j++)
		 {
			matriz[i][j]  =' '; //esvazia os vetores.
			verifica[i][j]=' '; //esvazia os vetores.
		 }
	  }
	  
	  do
	  {
		 if(jogada <= 10) system("cls");  
		 printf("\n");
		 for(i = 1; i <= 3; i++)
		 {
			for(j = 1; j <= 3; j++)
			{
			   //controla o preenchimento dos valores.
			   if(matriz[i][j] == 'X' || matriz[i][j] == 'O')
			   printf(" %2c  ",matriz[i][j]); //mostra os valores colocados.
			   else
			   printf("	 "); //deixa em branco espaços ainda não informados.
			   if(j <= 2)
			   printf("%c", -77); //desenha as colunas.
			}
			printf("\n");
			if(i <= 2) //controla a exibição da última linha do desenho.
			for(cont = 1; cont <= 15; cont++)
			{
			   printf("%c", -60); //desenha as linhas.
			   if(cont == 5 || cont == 10) 
			   printf("%c", -59); //coloca o caractere '+' na junção das linhas e colunas.
			}
			printf("\n");
		 }
		 
		 if(venceu==1)
		 {
			printf("***************************************************************\n\n");
			if (jogada%2 == 0)printf("RESULTADO: >>> \"JOGADOR 1\" VENCEU <<<\n");
			else printf("RESULTADO: >>> \"JOGADOR 2\" VENCEU <<<\n");
			goto FIM; //termina o jogo
		 }
		 if(empate == 1)
		 {
			printf("***************************************************************\n\n");
			printf("RESULTADO: >>> O JOGO EMPATOU <<<\n");
			goto FIM; //termina o jogo
		 }
		 
		 if(jogada % 2 != 0) //Impar = jogador 1, Par = jogador 2.
		 {
			printf("VEZ DO JOGADOR 1: %s = \"X\"\n", jog1);
			valor= 'X';
		 }
		 else
		 {
			printf("VEZ DO JOGADOR 2: %s = \"O\"\n", jog2);
			valor= 'O';
		 }
		 printf("***************************************************************\n\n");
		 VOLTA:;
	   
		do { //Pegando as linhas
		printf("INFORME O NUMERO DA LINHA.: ");
		scanf ("%d", &linha);
		if (linha > 3 || linha < 1) printf("Linha esta entre 1 e 3\n");
		} while (linha !=3 && linha != 2 && linha != 1);	
		
	   
		do { //Pegando as colunas
		printf("INFORME O NUMERO DA COLUNA: ");
		scanf("%d",&coluna);
		 if(coluna > 3 || coluna < 1) printf("Coluna esta entre 1 e 3\n");		
		}while (coluna !=1 && coluna !=2 && coluna!=3); 
		 
		 if(verifica[linha][coluna]==1) //verifica se a jogada já foi feita
		 {
			printf("***** Esta jogada ja foi feita!! ******\n");
			goto VOLTA;
		 }
		 else
		 {
			matriz[linha][coluna]=valor; // coloca o valor no jogo "X" ou "O".
			verifica[linha][coluna]=1;   // coloca valor 1 em jogadas já feitas
		 }
		 //Fazendo a verificação das linhas
		 if(matriz[1][1]=='X' && matriz[1][2]=='X' && matriz[1][3]=='X') venceu=1;
		 if(matriz[2][1]=='X' && matriz[2][2]=='X' && matriz[2][3]=='X') venceu=1;
		 if(matriz[3][1]=='X' && matriz[3][2]=='X' && matriz[3][3]=='X') venceu=1;
		 if(matriz[1][1]=='O' && matriz[1][2]=='O' && matriz[1][3]=='O') venceu=1;
		 if(matriz[2][1]=='O' && matriz[2][2]=='O' && matriz[2][3]=='O') venceu=1;
		 if(matriz[3][1]=='O' && matriz[3][2]=='O' && matriz[3][3]=='O') venceu=1;			
		 //Fazendo a verificação das colunas.
		 if(matriz[1][1]=='X' && matriz[2][1]=='X' && matriz[3][1]=='X') venceu=1;
		 if(matriz[1][2]=='X' && matriz[2][2]=='X' && matriz[3][2]=='X') venceu=1;
		 if(matriz[1][3]=='X' && matriz[2][3]=='X' && matriz[3][3]=='X') venceu=1;
		 if(matriz[1][1]=='O' && matriz[2][1]=='O' && matriz[3][1]=='O') venceu=1;
		 if(matriz[1][2]=='O' && matriz[2][2]=='O' && matriz[3][2]=='O') venceu=1;
		 if(matriz[1][3]=='O' && matriz[2][3]=='O' && matriz[3][3]=='O') venceu=1;
		 //Fazendo a verificação das diagonais.
		 if(matriz[1][1]=='X' && matriz[2][2]=='X' && matriz[3][3]=='X') venceu=1;
		 if(matriz[1][3]=='X' && matriz[2][2]=='X' && matriz[3][1]=='X') venceu=1;
		 if(matriz[1][1]=='O' && matriz[2][2]=='O' && matriz[3][3]=='O') venceu=1;
		 if(matriz[1][3]=='O' && matriz[2][2]=='O' && matriz[3][1]=='O') venceu=1;
		 
		 jogada++; //incrementa as jogadas
		 if(jogada > 9) empate=1; //jogo empatou
	  }while(jogada >1 );
	  FIM:;
	  printf("\n****************************************************************\n");
	  printf("DESEJA JOGAR NOVAMENTE (S/N): ");
	  scanf("%s",&resp);
	  system("cls"); //Limpa a tela para recomeçar o jogo.
   }while(resp=='s' || resp=='S');	
}

 

 

 

 

 

Codigo separado..

 

do { //Pegando as linhas
		printf("INFORME O NUMERO DA LINHA.: ");
		scanf ("%d", &linha);
		if (linha > 3 || linha < 1) printf("Linha esta entre 1 e 3\n");
		} while (linha !=3 && linha != 2 && linha != 1);	
		
	   
		do { //Pegando as colunas
		printf("INFORME O NUMERO DA COLUNA: ");
		scanf("%d",&coluna);
		if(coluna > 3 || coluna < 1) printf("Coluna esta entre 1 e 3\n");
		}while (coluna !=1 && coluna !=2 && coluna!=3);

Compartilhar este post


Link para o post
Compartilhar em outros sites

O número vai estar entre 1 e 3 quando

 

numero >= 1 && numero <= 3

 

Agora, quanto a suprimir os outros caracteres e tal:

Você poderia tentar ler como char e converter para inteiro. Aí, no caso, o número estaria entre 1 e 3 quando numero >= (int)'1' && numero <= (int)'3' porque eu tenho quase certeza que a representação numérica dos números em caracteres é diferente dos números em si. Mas a moral é a mesma, e daí essa comparação já iria se ver livre de outros caracteres porque eles tem outras representações numéricas diferentes.

Agora pra impedir uma string inteira de porcaria digitada aí acho que ia requerer algum trabalho a mais.

 

Até :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

José Enesio...obrigada pela resposta..

mas ainda nao consegui fazer o danado aceitar somente os numeros 1 2 e 3

alguem tem outra solução?

 

 

obrigada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

você naum pode fazer algo do tipo:

if (num == 1 || num == 2 || num == 3) printf("ok");
else printf("not ok");

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites
char matriz[3][3], valor, jog1[60], jog2[60], resp; //Declarando as variaveis.
gets(jog1); //Pegando os nomes dos jogadores
printf(" %2c ",matriz[j]); //mostra os valores colocados.

 

A própria linguagem define o que é uma declaração de variáveis. Isso não acrescenta nada ao entendimento do código. Não comente.

 

A linha com printf faz com que a necessidade de informar o nome do jogador seja subentendida. Também não precisa comentar. E não use gets (tá cheio de tópico sobre isso).

 

A única coisa que o printf faz é mostrar coisas na tela...

 

 

 

printf(" JOGO DA VELHA\n");

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

printf("JOGADOR 1: "); gets(jog1); //Pegando os nomes dos jogadores

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

printf("JOGADOR 2: "); gets(jog2);

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

printf("JOGADOR 1: %s = \"X\"\n", jog1); //Mostra as letras do jogador.

printf("JOGADOR 2: %s = \"O\"\n", jog2);

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

printf("PRESSIONE \"ENTER\" PARA CONTINUAR..."); getchar();

system("cls");

 

if(matriz[j] == 'X' || matriz[j] == 'O')

printf(" %2c ",matriz[j]); //mostra os valores colocados.

else

printf(" "); //deixa em branco espaços ainda não informados.

if(j <= 2)

printf("%c", -77); //desenha as colunas.

 

do { //Pegando as linhas

printf("INFORME O NUMERO DA LINHA.: ");

scanf ("%d", &linha);

if (linha > 3 || linha < 1) printf("Linha esta entre 1 e 3\n");

} while (linha !=3 && linha != 2 && linha != 1);

 

Siga um padrão. Uma hora você coloca a próxima função na mesma linha, em outra fica na linha seguinte. No segundo caso, você deixa de identar o comando do if-else mas identa o for. No terceiro, a mesma coisa.

 

 

fflush(stdin);

 

Isso é extensão do padrão e deve ser evitado, a não ser que você tenha certeza que ninguém do mundo vai tentar executar o código num Sun Studio ou num UNIX.

 

printf("%c", -59); //coloca o caractere '+' na junção das linhas e colunas.

 

Precisava desse comentário realmente? Não era mais fácil colocar '+' diretamente?

 

printf("%c", -77);

 

O que vem a ser isso?

 

 

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

#define MAXNOME 60
#define SIMBOLO1 'X'
#define SIMBOLO2 'O'
#define VAZIO ' '

void menu(char jog1[MAXNOME], char jog2[MAXNOME]) {
printf("\t\t\tJOGO DA VELHA\n");
printf("\t\t\t==== == =====\n");
printf("JOGADOR 1: ");
scanf("%60s",jog1);
printf("JOGADOR 2: ");
scanf("%60s",jog2);

printf("JOGADOR 1: %s = \"%c\"\n", jog1,SIMBOLO1);
printf("JOGADOR 2: %s = \"%c\"\n", jog2,SIMBOLO2);
}


void imprime(char matriz[3][3]) {
int i,j;
for(i=0;i<3;i++) {
	for(j=0;j<3;j++) {
		if(matriz[i][j] != VAZIO)
		   printf(" %c ",matriz[i][j]);
		else
			 printf("	");
		if (j < 2) printf("|");

	}
	puts("");
}
puts("");
}



int verificaLinhas(char matriz[3][3],int vezAtual) {
int i,j;
for(i=0;i<3;i++) {
	for(j=0;j<3 && matriz[i][j] == ((vezAtual == 0)? SIMBOLO1:SIMBOLO2);j++);
	if (j == 3) return 1;
}
return 0;
}




int verificaColunas(char matriz[3][3],int vezAtual) {
int i,j;
for(i=0;i<3;i++) {
	for(j=0;j<3 && matriz[j][i] == ((vezAtual == 0)? SIMBOLO1:SIMBOLO2);j++);
	if (j == 3) return 1;
}
return 0;
}


// Retorna 1 se a diagonal principal estiver com 3 simbolos do mesmo jogador.
int verificaDiagonalPrincipal(char matriz[3][3],int vezAtual) {
char simbolo = (vezAtual == 0)? SIMBOLO1 : SIMBOLO2;
int i;
for(i=0; i<3 && matriz[i][i] == simbolo; i++);
return (i == 3);
}


int verificaDiagonalSecundaria(char matriz[3][3], int vezAtual) {
char simbolo = (vezAtual == 0)? SIMBOLO1 : SIMBOLO2;
int i,j = 2;
for(i=0; i<3 && matriz[i][j] == simbolo;i++,j--);
return (i == 3);
}


int isVitoria(char matriz[3][3], int vezAtual) {
if (verificaLinhas(matriz, vezAtual) || verificaColunas(matriz,vezAtual) || verificaDiagonalPrincipal(matriz,vezAtual) || verificaDiagonalSecundaria(matriz,vezAtual))
	return 1;
return 0;
}


int isEmpate(char matriz[3][3]) {
int i,j;
for(i=0;i<3;i++) {
	for(j=0;j<3 && matriz[i][j] != VAZIO;j++);
	if (j < 3) return 0;
}

return (i == 3);
}


void Joga(char matriz[3][3], int vezAtual){
int linha,coluna;
printf("Jogador %d:\n",(vezAtual == 0)? 1:2);
do {
	do {
		printf("Digite a linha:");
		scanf("%d",&linha);
	} while (linha < 1 || linha > 3);

	do {
		printf("Digite a coluna:");
		scanf("%d",&coluna);
	} while (coluna < 1 || coluna > 3);
} while (matriz[linha-1][coluna-1] != VAZIO);

matriz[linha-1][coluna-1] = (vezAtual == 0)? SIMBOLO1:SIMBOLO2;
}


int main(){
  char matriz[3][3], jog1[60], jog2[60], resp;
  int jogador = 0;
  int vezAtual;

  while(1) {

   menu(jog1,jog2);
  memset(matriz,VAZIO,9);
  vezAtual = 0;
  while(1){
	 Joga(matriz,vezAtual);
	 imprime(matriz);
	 if(isVitoria(matriz,vezAtual)) {
		printf("O JOGADOR %d VENCEU.\n",(vezAtual == 0)? 1:2);
		break;
	 } else if (isEmpate(matriz)) { // Se não houve vitória e não existem espacos vazios, entao o jogo terminou empatado.
		printf("RESULTADO: >>> O JOGO EMPATOU <<<\n");
		break;
	 }

	 printf("VEZ DO JOGADOR %d.\n",(vezAtual == 0)? 1:2);
	 vezAtual = (vezAtual+1)%2;

  };

  printf("\n****************************************************************\n");
  printf("DESEJA JOGAR NOVAMENTE (S/N): ");
  scanf("%c",&resp);
  puts("");
  if (resp == 'n' || resp == 'N')
	break;
  };

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, você queria uma ajuda? Não reparou que eu reformatei teu programa inteiro e deixei funcionando?

 

Quer ajuda e ignora conscientemente notas sobre boas práticas em programação? Dá licença,viu...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpa...mas

o jogo continua bugado. Mta gentileza de sua parte FORMATAR meu codigo inteiro, porém nao funciona...

digita um "A" ao invés de 1 2 ou 3..nas linhas e colunas e vê o que acontece.

Bom..meu professor exigiu esse tratamento de erro....

 

Obrigada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se for usar as funcoes do ctype eh bom ler a linha e a coluna como char, e nao como inteiro. E depois fazer a conversao necessaria na hora de usar esses dados para marcar a jogada na matriz.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.