JemanPT Posted December 30, 2007 at 09:09 PM Report Share #157179 Posted December 30, 2007 at 09:09 PM Viva, Estou no 1º ano de Engenharia Multimédia e estou a desenvolver o jogo do galo... há semanas (sou iniciante) para apresentar no diia 15 de Janeiro. O jogo já está a bulir, mas não consigo pôr a imprimir a ensagem quando o jogador introduz uma casa já ocupada void Jogador1() { //declaração e inicializacao das variaveis para os dados do jogador 1 int x, y; do { do { printf("\n\n j1, introduza a linha e a coluna: "); scanf("%d %d", &x, &y); } while(x<=1 && x>=4); x--; y--; //porque os indices começam a 0 /*if(matrix[x][y]!=' ') matrix[x][y] = 'X'; else printf("\n Posicao ja ocupada");*/ } while(matrix[x][y]!=' '); matrix[x][y] = 'X'; } Outra coisa que queria era pôr os nommes dos jogador, ma está a dar erro... main() { printf("\n***************************************\n"); printf("** Jogo do Galo **\n"); printf("***************************************\n"); /* char n1, n2; printf("\n\nNome do jogador 1: "); scanf("%c", &n1); printf("Nome do jogador 2: "); scanf("%c", &n2); void Jogador1 = n1; void Jogador2 = n2; */ int Vencedor = ' '; /* perim... Podem-me dar umas dicas? Obrigado Link to comment Share on other sites More sharing options...
merlin3000 Posted December 30, 2007 at 10:40 PM Report Share #157189 Posted December 30, 2007 at 10:40 PM Da mesma forma que verificas se a casa que se pretende alterar já está ou não preenchida no while, basta-te alterar o if que tens comentado para: if(matrix[x][y]!=' ') printf("\n Posicao ja ocupada"); Quanto ao nome tens que enviar o nome por parametro (para isso tens que alterar a função) para a função de jogador ou declarar os nomes como variável global. Outra opção seria o nome aparecer antes de chamares a função do jogador. Já agora o que pretendias fazer com void Jogador1 = n1; void Jogador2 = n2; Criar é Divertido Link to comment Share on other sites More sharing options...
JemanPT Posted December 31, 2007 at 01:13 AM Author Report Share #157214 Posted December 31, 2007 at 01:13 AM Pois... isso do if, por acaso já o tinha feito, mas não deu resultado... qd o faço, aparece a mensgem em todas as jogadas; devo estar a oôr no sitio errado (achp q n, mas ) char n1, n2; void Jogador1() { //declaração e inicializacao das variaveis para os dados do jogador 1 int x, y; do { do { printf("\n\n %c, introduza a linha e a coluna: ", &n1); scanf("%d %d", &x, &y); } while(x<=1 && x>=4); x--; y--; //porque os indices começam a 0 } while(matrix[x][y]!=' '); matrix[x][y] = 'X'; if(matrix[x][y]!=' ') printf("\n Posicao ja ocupada"); } Relativamente ao nome... deve ser do sono pq não estou a conseguir main() { printf("\n***************************************\n"); printf("** Jogo do Galo **\n"); printf("***************************************\n"); printf("\n\nNome do jogador 1: "); scanf("%c", &n1); printf("Nome do jogador 2: "); scanf("%c", &n2); int Vencedor = ' '; /* perimite controlar se existe vencedor ou nao */ inicializa_matriz(); do { ... } while(Vencedor == ' '); if(Vencedor=='X') printf("\n\n j1, venceu o jogo! \n\n"); else if (Vencedor=='0') printf("\n\n j2, venceu o jogo! \n\n"); else printf("\n\n Empate! \n\n"); Vizualiza_Matriz(); void inicializa_matriz(); void Jogador1(); void Jogador2(); void Vizualiza_Matriz(); char Verifica_Vencedor(); char Empate(); system("PAUSE"); return 0; } Nem acredito que estou encalhado aqui... tá bem que andei semana para fazer o jogo, mas... é normal demorar tanto??? Obrigado Link to comment Share on other sites More sharing options...
mogers Posted December 31, 2007 at 01:52 AM Report Share #157218 Posted December 31, 2007 at 01:52 AM Às vezes ficamos mesmo "cegos" 😉 Acontece a todos, convem fazer umas pausas. matrix[x][y] = 'X'; if(matrix[x][y]!=' ') printf("\n Posicao ja ocupada"); Tás a colocar o 'X' antes do if, por isso é natural que a posição (x,y) seja sempre X Tens outro erro: do { ... }while(x<=1 && x>=4); Cuidado com as condições! Tu queres repetir a leitura se o X dado for menor que 1 ou maior que 3. Já agora... porque não validas também o Y ? Em relação ao nome, tu tens variaveis char. Só consegues ler um caracter. Para leres uma string tens de usar um array de char's e ler com char nome[20]; scanf("%s" , nome ); // nome já é um apontador para a posição de memória onde queres o resultado. Não leva o & PS: Para postar o código coloca code=c na tag. Fica mais legivel. "What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação. Link to comment Share on other sites More sharing options...
merlin3000 Posted December 31, 2007 at 04:15 AM Report Share #157228 Posted December 31, 2007 at 04:15 AM Pelo que percebi a ideia seria que quando fosse detectada uma jogada inválida ele imprimisse para o ecrã uma mensagem de aviso e em seguida repetisse o pedido. Nesse caso o if teria que estar dentro do while, onde o tinhas no primeiro post por exemplo. Para leres o nome tens que fazer o que o mogers já disse e declarar arrays de caracteres. Agora para ler o scanf não é o mais indicado porque só te vai ler até ao primeiro espaço. Podes tentar usar um gets por exemplo: char n1[50]; gets(n1); O problema do gets é que não há maneira de verificar se inseriste mais caracteres do que n1 aguenta. Podes usar fgets em vez de gets: char n1[50]; fgets( n1, 50, stdin ); O que tens aqui é uma função que leva o array de caracteres que queres usar, o tamanho máximo de caracteres que queres que sejam inseridos no array (se inserires caracteres a mais ele simplesmente ignora-os) e a stream de onde vêm os caracteres que no teu caso fica stdin. Com o 50 como limite máximo podes inserir 49 caracteres (tudo o resto é desprezado) ele reserva 1 para por o 0 que vai terminar a string. Uma coisa é que ao contrário do gets o fgets inclui o caracter '\n' que é adicionado quando carregas em ENTER. Se não o quiseres terás que o retirar manualmente. Embora já seja menos uma fonte de prováveis erros o fgets também tem os seus problemas. Se leres o valor null para a string quando a fores a imprimir ele vai pensar que a string termina aí. Mas no caso de leres algo escrito do teclado isso não deve acontecer. Terás é que ter cuidado se algum dia usares o fgets para ler de uma fonte que não controlas, como por exemplo um ficheiro. Criar é Divertido Link to comment Share on other sites More sharing options...
JemanPT Posted December 31, 2007 at 02:11 PM Author Report Share #157244 Posted December 31, 2007 at 02:11 PM Jesus Crist... só aqui já revi quase a mat toda e aprendi umas tanta novas. vcs sao uns optimos prof's. Relatiivamente á condição, tirei a validação do Y pq nãp funcionava e não ? while(x<=1 && x>=4 || y<=1 && y>=4); Obrigado pelos ensinamentos Link to comment Share on other sites More sharing options...
mogers Posted December 31, 2007 at 03:51 PM Report Share #157263 Posted December 31, 2007 at 03:51 PM Mas essa condição não está bem 😉 Podes pensar em português normal. Tu queres repetir o ciclo se: -> o X não estiver no intervalo [1,3] ou o Y não estiver no intervalo [1,3] isto é, -> Se ( Not ( X >= 1 e X <= 3 ) ou Not ( Y >= 1 e Y <= 3 ) ) ou seja: while( ( !( x >= 1 && x <= 3 ) ) || ( ! ( y >= 1 && y <= 3 ) ) ); ou se preferires -> Se ( X < 1 ou X > 3 ) ou ( Y < 1 ou Y > 3 ) ou seja: while( x < 1 || x > 3 || y < 1 || y > 3 ); "What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação. Link to comment Share on other sites More sharing options...
JemanPT Posted December 31, 2007 at 04:55 PM Author Report Share #157269 Posted December 31, 2007 at 04:55 PM Exacto.Já tem mais lógica. se puseres o if, ele imprime a mensgem de erros em toda as jogada a partir da colocação do 3º "O" ? while( x < 1 || x > 3 || y < 1 || y > 3 ); //while(x<=1 && x>=4); if(matrix[x][y]!=' ') printf("\n Posicao incorrecta ou ja ocupada! Jogue novamente."); x--; y--; //porque os indices começam a 0 de resto, tudo a rolar como eu kerie... com menu e tudo 😉 Link to comment Share on other sites More sharing options...
mogers Posted December 31, 2007 at 05:57 PM Report Share #157272 Posted December 31, 2007 at 05:57 PM O decremento das variaveis não devia ser antes do if ? O melhor é voltares a colar aí o teu código. Deve ser uma coisa pequena... "What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação. Link to comment Share on other sites More sharing options...
JemanPT Posted December 31, 2007 at 06:40 PM Author Report Share #157274 Posted December 31, 2007 at 06:40 PM É claro que devia! O único erro que agora tem deve dizer respeito á condição... O while é tipo repete até á condição ser V, ou seja, até para de serem introduzidos valores que não pertençam ao intervalo 1 e 3 certo? logo, não passa para o printf do erro e sim para o que pede a posição. já tetei subtituir o while com if, mas... Tenho de chegar la porra. té já Link to comment Share on other sites More sharing options...
mogers Posted December 31, 2007 at 07:04 PM Report Share #157276 Posted December 31, 2007 at 07:04 PM Não. While - Repetir Enquanto. Repete enquanto a condição for verdadeira. Ou seja, só repete o ciclo se a condição for falsa. "What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação. Link to comment Share on other sites More sharing options...
JemanPT Posted December 31, 2007 at 07:23 PM Author Report Share #157279 Posted December 31, 2007 at 07:23 PM Exacto... se o jogador introduzir valores entre 1 e 3 (inclusive), ele sai do ciclo. Se é assim, é obvio que ele não me imprime a mensagem de erro, caso digite 1 e 4, por exemplo porque torna ao ciclo, ou seja, ao: do { printf("\n\n %s, introduza a linha e a coluna: ", n2); scanf("%d %d", &x, &y); } Já experimentei por if(x<1||x>3||y<1||y>3) printf("\n Posicao incorrecta ou ja ocupada! Jogue novamente."); dentro do ciclo, mas nada Link to comment Share on other sites More sharing options...
merlin3000 Posted December 31, 2007 at 07:29 PM Report Share #157280 Posted December 31, 2007 at 07:29 PM Estás a por esse if dentro do while que valida se as posições estão ou não correctas? Assim devia funcionar. Criar é Divertido Link to comment Share on other sites More sharing options...
JemanPT Posted December 31, 2007 at 07:42 PM Author Report Share #157282 Posted December 31, 2007 at 07:42 PM void Jogador2() { //declaração e inicializacao das variaveis para os dados do jogador 1 int x, y; do { do { printf("\n\n %s, introduza a linha e a coluna: ", n2); scanf("%d %d", &x, &y); //JÁ PUS AQUI } while(x<1||x>3||y<1||y>3); //JÁ PUS AQUI //while(x<=1 && x>=4); x--; y--; //porque os indices começam a 0 //JÁ PUS AQU if(matrix[x][y]!=' ') printf("\n Posicao incorrecta ou ja ocupada! Jogue novamente."); } while(matrix[x][y]!=' '); //JÁ PUS AQUI matrix[x][y] = 'O'; } :fartnew2: Link to comment Share on other sites More sharing options...
merlin3000 Posted December 31, 2007 at 07:56 PM Report Share #157285 Posted December 31, 2007 at 07:56 PM Epah é estranho não ter funcionado no primeiro sítio que disseste que puseste. Eu fiz um pequeno teste e funciona. Só alterei os printfs para distinguir as situações e eliminei os comentários. Mas funcionou. Vê se era assim que estavas a fazer. void Jogador2() { //declaração e inicializacao das variaveis para os dados do jogador 1 int x, y; do { do { printf("\n\n %s, introduza a linha e a coluna: ", n2); scanf("%d %d", &x, &y); if(x<1||x>3||y<1||y>3) printf("\n Posicao incorrecta! Jogue novamente."); } while(x<1||x>3||y<1||y>3); x--; y--; //porque os indices começam a 0 if(matrix[x][y]!=' ') printf("\n Posicao ja ocupada! Jogue novamente."); } while(matrix[x][y]!=' '); matrix[x][y] = 'O'; } Criar é Divertido Link to comment Share on other sites More sharing options...
JemanPT Posted January 1, 2008 at 02:15 AM Author Report Share #157301 Posted January 1, 2008 at 02:15 AM Antes de mais, UM BOM 2008. Relativamente ao jogo, já funciona... desta vez não consegui aproveitar para aprender, pois não sei o que tinha mal; tenho a certeza que já tinha posto o if dentro do ciclo e não funcionou... talvez me teha esquecido de desactivado algum outro codigo ? Mais uma vez, obrigado pelos esinamentos e um bom 2008. 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