Jump to content

Jogo Tic-Tac - Ajuda


Localhost
 Share

Recommended Posts

Olá pessoal, hoje lembrei-me de fazer o jogo tic-tac ou mais conhecido por jogo do galo. O jogo já está praticamente feito, só falta mesmo fazer a parte da verificação de quem ganha mas isso penso que seja fácil e que faço rapidamente. O problema é que o meu jogo tem dois bugs por enquanto que eu não consigo resolver. Antes de mais nada está aqui o código:

#include <stdio.h>

int table();
int get_move(); 
int get_c_move();
int startup();
int help();
int check();

int tablex[2][2];

int startup()
{
int num;
printf("################################\n##Game Programmed by Localhost##\n################################\n\n");
printf("What do you want to do?\n");
printf("1- Play\n2- Get Help\n3- Be an asshole and exit\n");
printf("You choose: ");
scanf("%i", &num);
switch(num)
{
	case 1:
		table();
		get_move();
		return(0);
	case 2:
		help();
		return(0);
	case 3:
		system("clear");
		return(0);
}
}

int main()
{
system("clear");
startup();
return(0);	
}

int help()
{
printf("This is a game develped by Localhost, is a very well-known game. You will play against your computer. Just put three x's in a row.\n");
}

int table()
{
system("clear");
printf(" _%c_|_%c_|_%c_\n", tablex[0][0],tablex[0][1],tablex[0][2]);
printf(" _%c_|_%c_|_%c_\n", tablex[1][0],tablex[1][1],tablex[1][2]);
printf("  %c | %c | %c\n\n", tablex[2][0], tablex[2][1], tablex[2][2]);
}

int get_move()
{
int l,c;
printf("Qual é a linha que quer jogar? ");
scanf("%i", &l);
printf("Qual é a coluna que quer jogar? ");
scanf("%i", &c);
c-=1;
l-=1;
if(l > 3 || c > 3)
{
	printf("Não existe essa posição no tabuleiro\n");
	get_move();
}
if(l < 0 || c < 0)
{
	printf("Não existe essa posição no tabuleiro\n");
	get_move();
}
if(tablex[l][c] == 'X' || tablex[l][c] == 'O')
{
	printf("Posição ocupada.Tente novamente\n");
	get_move();
}	
else
{	
	tablex[l][c] = 'X';
	table();
	get_c_move();
}		
return(0);
}

int get_c_move()
{
int lc,cc;
srand(time(NULL));
lc = rand() % 3 + 0;
cc = rand() % 3 + 0;
if(tablex[lc][cc] == 'X' || tablex[lc][cc] == 'O')
{
	get_c_move();
}	
else
{
	tablex[lc][cc] = 'O';
	table();
	get_move();
}
return(0);
}

Os problemas são os seguintes:

- Quando eu escolho uma sitio para colocar o X ou o pc escolhe um sitio para colocar o O o tabuleiro fica desfigurado, já tentei pensar em como resolver isso mas não sei.

- O outro problema é quando eu jogo numa determinada posição (ou o pc) o X ou o O ficam em dois sitios (em dois quadrados) ficando como se jogasse duas vezes, este aqui nem percebo porque é que acontece.

Alguém me podia ajudar com isto? Obrigado (:

here since 2009

Link to comment
Share on other sites

Uma coisa que me chamou logo atenção foi no tipo de matriz(int)! Estás a colocar caracteres num array de inteiros.

Não tive a ver mais a fundo, porque já se faz um pouco tarde =)

EDIT:Há e eu pelo menos no switch case uso no fim de cada case um break; Tu tens return(0) não sei se isso de alguma forma possa prejudicar o jogo :S

Já foi uma ajuda 🙂

Cumps

@Pedro Lopes

Link to comment
Share on other sites

LOL, tipo isso do int da matriz é porque se puseres do tipo char na verdade estás a declarar uma matriz mas é uma matriz de strings onde são dois vectores, ou seja, o primeiro [ ] é o número de chars e o segundo [ ] é o numero de strings, ou seja isso ia dar errado.

Quanto ao break, se reparares eu no final de cada função tenho um return 0, o que o break ia fazer era quebrar o laço, ou seja, ia ter ao return 0, sendo exactamente a mesma coisa. Eu acho que do código que tenho está tudo certo, só falta mesmo é esses dois problemas que eu tenho. Mas obrigado (:

EDIT: Desculpa eu quando disse que ao pôr uma matriz de chars ia dar errado não tenho a certeza mas penso que é exactamente a mesma coisa... Mas vou experimentar.

EDIT[2]: Acabei agora de experimentar mudar para char, o jogo manteve-se igual inclusive o segundo problema. O primeiro é mesmo um problema de estética eheheh

here since 2009

Link to comment
Share on other sites

if(tablex[lc][cc] == 'X' || tablex[lc][cc] == 'O')
        {
                get_c_move();
        }      

Péssimo. Faz um ciclo while com isso sff.

LOL, tipo isso do int da matriz é porque se puseres do tipo char na verdade estás a declarar uma matriz mas é uma matriz de strings onde são dois vectores, ou seja, o primeiro [ ] é o número de chars e o segundo [ ] é o numero de strings, ou seja isso ia dar errado.

Errado. Se queres utilizar uma matriz de caracteres declaras uma matriz de caracteres e não uma matriz de inteiros. Uma matriz de caracteres pode ser interpretada como um vector de strings caso em que cada string terá que ter um '\0' como caracter de terminação que é a convenção do C. Toda a utilização que estás a fazer é de uma matriz de caracteres pelo que não há motivo nenhum para não a declarares como char.

Por falar na matriz... Onde é que a inicializas? Em lado nenhum. Inicializar a matriz com um caracter de espaço ' ' em todas as posições era suficiente para te resolver o problema do "tabuleiro desfigurado". Nunca deves utilizar nada que não esteja previamente inicializado em C.

E já que estamos com a mão na massa... Porque é que declaras uma matriz 2x2 quando precisas de uma matriz 3x3?

Não respondo a dúvidas por mensagem.

Link to comment
Share on other sites

Ok, obrigado, deu tudo certo (:

Mas só uma coisa? Tanto as matrizes como os vectores nao começam não começam na posição 0? Estou a dizer isto porque (0,1,2) = 3.

Sim, começam. Mas não te podes esquecer que quando declaras um array o número que colocas entre parêntesis rectos é a quantidade de posições na memória que queres reservar. Pelo que para um array com as posições (0,1,2) tens que declarar:

char arraydechar[3];

Não respondo a dúvidas por mensagem.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.