Jump to content

Jogo do Galo


improvável
 Share

Recommended Posts

Pessoal eu criei este programa talvez um pouco rudimentar para uma aula de laboratório de programação em c. Mas ele nao verifica se foi feita sequencia de linha/ coluna ou numa diagonal, e eu nao estou a ver o porque

#include <stdio.h>
#include <stdlib.h>

#define ESPACO ' '

//Declaracao de funcoes
int Play(char *, char , int);
int Winner(char *, int);
void Imprimir(char *);
void Ini(char *);

int main()
{
int loop = 1, posicao = 0;
char str[10] = {0};
char ch;
char v[9];
int player = 0;
int playsuccess = 0;
int win = 0;
int n_jogadas;

Ini(v);

for(n_jogadas = 0; n_jogadas< 9 && win == 0; n_jogadas++) // so se sai do loop caso seja encontrado um winner ou o número de jogadas seja superior ao numero de quadrados para preencher
{

player = n_jogadas%2 + 1;//Identifica o player, se e o 1 ou o 2

printf("Player %d - Insira a posicao que quer preencher:\n", player);
fgets(str, 10, stdin);
sscanf(str,"%d", &posicao);

if(player==1)//escolhe o char conforme o numero do player
ch = 'X';
else
ch = '0';

playsuccess=Play(v, ch, posicao);//se a posiçao nao estiver ocupada playsuccess = 1 caso contrario e 0 e o jogador e obrigado a repetir a escolhar uma nova posicao
printf("%d\n", playsuccess);
if(playsuccess != 1)
{
printf("A posicao selecionada ja se encontra preenchida\n");
n_jogadas--;
}

Imprimir(v);
win = Winner(v, player);

}


printf("Jogador %d ganhou o jogo\n", player);

return EXIT_SUCCESS;
}

// Exercício 9
int Play(char *v, char ch, int posicao)
{
if (v[posicao] == ESPACO)
{
v[posicao] = ch;
return 1;
}
else
return 0;
}

int Winner(char *v, int player)
{

//Verifica a existencia de sequencia de linha
if( v[0] != ESPACO && v[3] != ESPACO && v[6] != ESPACO)
{
if((v[0]== v[1]&&v[1] == v[2])|| (v[3]== v[4]&&v[4] == v[5])||(v[6]== v[7]&&v[7] == v[8]))
{
printf("Sequencia de linha\n");
return player;
}
}


//Verifica a existencia de sequencia de coluna
if( v[0] != ESPACO && v[1] != ESPACO &&v[2] != ESPACO)
{
if((v[0]== v[3]&&v[3] == v[6])|| (v[1]== v[4]&&v[4] == v[7])||(v[2]== v[5]&&v[5] == v[8]))
{
printf("Sequencia de Coluna\n");
return player;
}
}

//Verifica aexistencia de sequencia numa diagonal
if ((v[0]!=ESPACO)&&(v[2]!=ESPACO))
{
if((v[0]==v[4]&&v[0] == v[8])||(v[2]==v[4]&&v[2] == v[6]))
{
printf("Sequencia de diagonal\n");
return player;
}
}

else
return 0;
}

void Imprimir(char *v)
{
int i= 0;

for(i = 0; i < 9; i++)
{
printf("| %c |", v[i]);
if( i == 2 || i == 5 || i == 8 )
{
printf("\n---------------\n");
}
}

}

void Ini(char *v)
{
int i;
for( i = 0; i <9 ; i ++)
v[i] = ESPACO;
}

Edited by improvável
Link to comment
Share on other sites

olha para os prmeiros [TTif's[/TT] das verificações:


//Verifica a existencia de sequencia de linha
if( v[0] != ESPACO && v[3] != ESPACO && v[6] != ESPACO) // para verificar tens de ter algo diferente de ESPACO em TODAS as primeiras posições
{
// ...
}

//Verifica a existencia de sequencia de coluna
if( v[0] != ESPACO && v[1] != ESPACO &&v[2] != ESPACO) // para verificar tens de ter algo diferente de ESPACO em TODAS as primeiras posições
[/Code]
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

olha para os prmeiros [TTif's[/TT] das verificações:


//Verifica a existencia de sequencia de linha
if( v[0] != ESPACO && v[3] != ESPACO && v[6] != ESPACO) // para verificar tens de ter algo diferente de ESPACO em TODAS as primeiras posições
{
// ...
}

//Verifica a existencia de sequencia de coluna
if( v[0] != ESPACO && v[1] != ESPACO &&v[2] != ESPACO) // para verificar tens de ter algo diferente de ESPACO em TODAS as primeiras posições
[/Code]

Se eu nao fizer assim ele dá-me sequencia de linha, mas percebo a tua questão. o problema é como faço para ele só verificar sequencias que nao de espaços

Link to comment
Share on other sites

Era mais intuitivo usares uma matriz tipo char v[3][3], só mesmo por uma questão de ser mais fácil visualizar o tabuleiro.

Não vi como estás a armazenar as jogadas no teu vetor mas se fosse numa matriz bastava fazeres algo assim:

char fst = v[0][0];

if (fst != ' ' && fst == v[1][1] && fst == v[2][2])
  // encontrado...

fst = [0][2];
if (fst != ' ' && fst == v[1][1] && fst == v[2][0])
  // encontrado...

Agora aplica isto ao teu vetor (depende de como estás a guardar a informação).

Cumprimentos!

Edited by Localhost

here since 2009

Link to comment
Share on other sites

Sim eu pensei fazer dessa forma, o meu professor pede um vector para representar o tabuleiro. eu teria de converter as coordenadas vectoriais em matriciais e trabalhar depois com as matriciais. De facto seria mais fácil.

Só estava era a tentar resolver o problema sem ter de recorrer a essa forma.

Obrigado por ambas as respostas 😉

Tenho uma outra questão:

Porventura, conhecem algum tipo de workshop ou explicação sobre programação em c. Eu sinto que se tivesse algo para além das aulas conseguiria evoluir mais neste tipo de linguagem, e talvez percebendo o c, fosse mais fácil para mim entender o modo de escrita de outras linguagens

Link to comment
Share on other sites

se eu te dissesse estaria a resolver o problema ...

a ideia base está correcta:

- verificar se não é espaço

- verificar se todos são iguais

agora é só corrigir o problema que te disse

ps: não necessitas de estar a reescrever o código para alterar a para um array bidimensional:

#define WIDTH  3
#define HEIGHT 3

#define cell(array, x, y) ((array)[(y) * WIDTH + (x)])

int main(void) {
 int matrix[WIDTH * HEIGHT];

 cell(matrix, 0, 0) = 4;
 cell(matrix, 1, 1) = cell(matrix, 0, 0);

 return 0;
}
Edited by HappyHippyHippo
  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
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.