improvável Posted April 8, 2015 at 03:21 PM Report Share #580908 Posted April 8, 2015 at 03:21 PM (edited) 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 April 8, 2015 at 03:46 PM by improvável Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted April 8, 2015 at 03:30 PM Report Share #580909 Posted April 8, 2015 at 03:30 PM olha para os prmeiros [TTif's[/TT] das verificações: //Verifica a existencia de sequencia de linhaif( 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 colunaif( 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 Portugol Plus Link to comment Share on other sites More sharing options...
improvável Posted April 8, 2015 at 03:36 PM Author Report Share #580911 Posted April 8, 2015 at 03:36 PM olha para os prmeiros [TTif's[/TT] das verificações: //Verifica a existencia de sequencia de linhaif( 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 colunaif( 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 More sharing options...
Localhost Posted April 8, 2015 at 03:45 PM Report Share #580912 Posted April 8, 2015 at 03:45 PM (edited) 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 April 8, 2015 at 03:46 PM by Localhost here since 2009 Link to comment Share on other sites More sharing options...
improvável Posted April 8, 2015 at 03:49 PM Author Report Share #580914 Posted April 8, 2015 at 03:49 PM 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 More sharing options...
Localhost Posted April 8, 2015 at 03:50 PM Report Share #580915 Posted April 8, 2015 at 03:50 PM Lê a minha assinatura, hehe. Cumprimentos! here since 2009 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted April 8, 2015 at 03:52 PM Report Share #580916 Posted April 8, 2015 at 03:52 PM (edited) 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 April 8, 2015 at 03:56 PM by HappyHippyHippo 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now