• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Localhost

Jogo Tic-Tac - Ajuda

7 mensagens neste tópico

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 (:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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];

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora