Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.

Lucas Assunção de Sousa

Membros Plenos
  • Total de itens

    22
  • Registro em

  • Última visita

  • Qualificações

    N/D

Reputação

16

Informações gerais

  • Cidade e Estado
    Lins/SP
  • Sexo
    Masculino
  1. Obrigado @devair1010 Eu consegui resolver, extremamente agradecido!
  2. Ai, consegui resolver o problema, entretanto: struct embarcacoes { int submarino; int destroyer; int hidro_aviao; int porta_aviao; }; typedef struct embarcacoes barcos; barcos qt_barcos = {3, 3, 2, 2}; int total_de_barcos = 10; struct almirante { char nome[100]; int placar; int disparos; struct embarcacoes; }; struct almirante jogador; void imprime_portaaviao () { int l, c, direcao; do { direcao = rand() % 2; l = 1 + (rand() % TAMANHO); c = 1 + (rand() % TAMANHO); if(direcao == 0) { if((l == TAMANHO || l >= TAMANHO - 4)) { if(arena_inimigo[l][c] == AGUA && arena_inimigo[l - 1][c] == AGUA && arena_inimigo[l - 2][c] == AGUA && arena_inimigo[l - 3][c] == AGUA && arena_inimigo[l - 4][c] == AGUA) for(i = l; i < l + 4; i++) { arena_inimigo[i - 4][c] = PORTAAVIAO; } } else { if(arena_inimigo[l][c] == AGUA && arena_inimigo[l + 1][c] == AGUA && arena_inimigo[l + 2][c] == AGUA && arena_inimigo[l + 3][c] == AGUA && arena_inimigo[l + 4][c] == AGUA) for(i = l; i < l + 4; i++) { arena_inimigo[i][c] = PORTAAVIAO; } } } else { if(c == TAMANHO || c >= TAMANHO - 4) { if(arena_inimigo[l][i] == AGUA && arena_inimigo[l][c - 1] == AGUA && arena_inimigo[l][c - 2] == AGUA && arena_inimigo[l][c - 3] == AGUA && arena_inimigo[l][c - 4] == AGUA) for(i = c; i < c + 4; i++) { arena_inimigo[l][i - 4] = PORTAAVIAO; } } else { if(arena_inimigo[l][i] == AGUA && arena_inimigo[l][c + 1] == AGUA && arena_inimigo[l][c + 2] == AGUA && arena_inimigo[l][c + 3] == AGUA && arena_inimigo[l][c + 4] == AGUA) for(i = c; i < c + 4; i++) { arena_inimigo[l][i] = PORTAAVIAO; } } } qt_barcos.porta_aviao--; } while (qt_barcos.porta_aviao != 0); } Entretanto para evitar que as embarcações se colocassem em cima de outras, eu fiz essa condição longa, e ela às vezes não imprime todas as partes do porta avião. O que pode estar errado?
  3. @devair1010 Poderia me explicar o que está acontecendo? Eu estou tentando fazer com que as embarcações que tenham mais unidades não possam sair dos extremos ou que sejam colocados além dos extremos, mas não está indo. O que pode tá acontecendo de errado? void imprime_portaaviao () { int l, c, direcao; do { direcao = rand() % 2; l = 1 + (rand() % TAMANHO); c = 1 + (rand() % TAMANHO); do { if(direcao == 0) { for(i = l; i < l + 4; i++) { arena_inimigo[i][c] = PORTAAVIAO; qt_barcos.porta_aviao--; total_de_barcos--; } } else { for(i = c; i < c + 4; i++) { arena_inimigo[l][i] = PORTAAVIAO; qt_barcos.porta_aviao--; total_de_barcos--; } } } while ((l >= 1 && l <= TAMANHO) && (c >= 1 && c <= TAMANHO)); } while (qt_barcos.porta_aviao == 0); } Basicamente estou tentando impedir que a fila de "P's saiam do limite da linha e do limite da coluna, mas nem isso está adiantando.
  4. @devair1010 Obrigado pela ajuda, acho que eu notei porque nem todos estão sendo impressos, a condição que eu coloquei antes de alocar na matriz para segurar que as embarcações não sejam colocadas em cima das outras, vou tentar achar uma outra maneira de checar isso antes de alocar. Obrigado!
  5. Boa tarde, Estou trabalhando em um jogo de Batalha Naval e estou tendo dificuldades na hora de alocação dos barcos. Basicamente as embarcações possuem mais de uma unidade na matriz (com exceção do submarino que é apenas uma) e são alocadas tanto na vertical quanto na horizontal (exemplo o portão avião, pode ser tanto em "PPPP" ou "P P P P" Para isso eu sorteio um número que define a direção da posição, se for 0 é horizontal, se for 1 é vertical, mas não está sendo alocado. Esse é o código que escrevi, alguém sabe o que tem de errado? Grato! #include <stdio.h> #include <stdlib.h> #include <locale.h> #include <windows.h> #include <time.h> #define AGUA '~' #define ERRO 'X' #define TAMANHO 11 #define SUBMARINO 'S' #define DESTROYER 'D' #define HIDROAVIAO 'H' #define PORTAAVIAO 'P' char arena[TAMANHO][TAMANHO], arena_inimigo[TAMANHO][TAMANHO]; int linha, coluna; struct embarcacoes { int submarino; int destroyer; int hidro_aviao; int porta_aviao; }; typedef struct embarcacoes barcos; barcos qt_barcos = {3, 3, 2, 2}; struct almirante { char nome[100]; int placar; int disparos; struct embarcacoes }; struct almirante jogador; void prepara_tabuleiro () { int l, c; for(l = 1; l < TAMANHO; l++) { for(c = 1; c < TAMANHO; c++) { arena_inimigo[l][c] = AGUA; arena[l][c] = AGUA; } } } int imprime_submarino () { int l, c, direcao; l = 0; c = 0; srand((unsigned)time(NULL)); do { direcao = rand() % 2; l = rand() % TAMANHO; c = rand() % TAMANHO; if(direcao == 0) { for(l = 0; l < l + 1; l++) { if(arena_inimigo[l][c] == AGUA) { arena_inimigo[linha][c] = SUBMARINO; return 0; } } } else { for(c = 0; c < c + 1; c++) { arena_inimigo[l][coluna] = SUBMARINO; return 0; } } } while(qt_barcos.submarino != 0); } int imprime_destroyer () { int l, c, direcao; l = 0; c = 0; srand((unsigned)time(NULL)); do { direcao = rand() % 2; l = rand() % TAMANHO; c = rand() % TAMANHO; if(direcao == 0) { for(l = 0; l < l + 2; l++) { if(arena_inimigo[l][c] == AGUA) { arena_inimigo[linha][c] = DESTROYER; return 0; } } } else { for(c = 0; c < c + 2; c++) { arena_inimigo[l][coluna] = DESTROYER; return 0; } } } while(qt_barcos.destroyer != 0); } int imprime_hidroaviao () { int l, c, direcao; l = 0; c = 0; srand((unsigned)time(NULL)); do { direcao = rand() % 2; l = rand() % TAMANHO; c = rand() % TAMANHO; if(direcao == 0) { for(l = 0; l < l + 3; l++) { if(arena_inimigo[l][c] == AGUA) { arena_inimigo[linha][c] = HIDROAVIAO; return 0; } } } else { for(c = 0; c < c + 3; c++) { arena_inimigo[l][coluna] = HIDROAVIAO; return 0; } } } while(qt_barcos.hidro_aviao != 0); } int imprime_portaaviao () { int l, c, direcao; l = 0; c = 0; srand((unsigned)time(NULL)); do { direcao = rand() % 2; l = rand() % TAMANHO; c = rand() % TAMANHO; if(direcao == 0) { for(l = 0; l < l + 4; l++) { if(arena_inimigo[l][c] == AGUA) { arena_inimigo[linha][c] = PORTAAVIAO; return 0; } } } else { for(c = 0; c < c + 4; c++) { arena_inimigo[l][coluna] = PORTAAVIAO; return 0; } } } while(qt_barcos.porta_aviao != 0); } void imprimeTabuleiro () { int l, c; for(l = 1; l < TAMANHO; l++) { for(c = 1; c < TAMANHO; c++) { printf(" \t%c", arena[l][c]); } printf("\n"); } } int controles () { int vida_inimiga; int l, c; jogador.disparos = 999; vida_inimiga = 36; do { //Exibe principais informações na tela printf("Almirante %s\n", jogador.nome); printf("Disparo Restantes: %i/46\n", jogador.disparos); printf("Vida Inimiga: %i/36\n\n", vida_inimiga); printf("Informe a linha: "); scanf("%i", &l); printf("Informe a coluna: "); scanf("%i", &c); printf("\n"); if(l >= 1 && l < TAMANHO && c >= 1 && c < TAMANHO && arena_inimigo[l][c] == AGUA) { switch(arena_inimigo[l][c]) { case AGUA: arena[l][c] = ERRO; system("cls"); imprimeTabuleiro(); jogador.disparos--; printf("Errou\n"); break; case SUBMARINO: arena[l][c] = 'S'; imprimeTabuleiro(); jogador.disparos--; vida_inimiga--; printf("Acertou!\n"); break; case HIDROAVIAO: arena[l][c] = 'H'; imprimeTabuleiro(); jogador.disparos--; vida_inimiga--; printf("Acertou!\n"); break; case DESTROYER: arena[l][c] = 'D'; imprimeTabuleiro(); jogador.disparos--; vida_inimiga--; printf("Acertou!\n"); break; case PORTAAVIAO: arena[l][c] = 'P'; imprimeTabuleiro(); jogador.disparos--; vida_inimiga--; printf("Acertou\n"); break; default: printf("ErrROU!\n"); } } if(vida_inimiga == 0) { system("cls"); puts("FIM DO JOGO"); puts("VOCÊ VENCEU!"); puts(""); jogador.placar = jogador.placar + 1; printf("Jogador: %s\nPlacar: %i", jogador.nome, jogador.placar); puts(""); getchar(); exit(1); } if(jogador.disparos == 0) { system("cls"); puts("FIM DO JOGO"); puts("VOCÊ PERDEU"); jogador.placar = jogador.placar + 0; printf("Jogador: %s\nPlacar: %i", jogador.nome, jogador.placar); puts(""); getchar(); exit(1); } } while (vida_inimiga != 0 && jogador.disparos != 0); } int main () { setlocale(LC_ALL,"Portuguese"); prepara_tabuleiro(); imprime_submarino(); imprime_destroyer(); imprime_hidroaviao(); imprime_portaaviao(); imprimeTabuleiro(); controles(); getch(); return 0; }
  6. @devair1010 Obrigado por responder! Bem, após pesquisar bastante sobre referências na internet eu acabei achando um que tinha essa função que fazia exatamente o que quero. Tudo parece funcionar de perfeita maneira, entretanto eu não estou conseguindo alocar numa matriz principal que é exibida na tela, ou seja, é uma arena vazia em que o jogador tá atirando. Como o código é bastante grande e está separado em várias funções, resolvi colocar ele pra baixar do que colocar aqui. SinglePlayer.rar
  7. Olá à todos! Estou com uma dúvida sobre o raciocínio de como elaborar um código: Tempos atrás algumas gentis pessoas me ajudaram a corrigir meu jogo de Batalha Naval E estou numa fase que agora estou tentando melhorar o código dele, e uma das coisas que queria fazer desde o começo é que e não estou conseguindo terminar o raciocínio é colocar as embarcações de modo aleatório na arena. Meu pensamento se resume a eu tentar criar uma função que sorteia ou número 1 e 2, caso de 1 imprime ele em posição vertical e 2 na horizontal da arena. Porém, outro problema que é encontro é que são algumas embarcações com um porta-aviões, possui mais de um na arena, e cada um deles precisa ter 3 espaços. E são nessas partes eu travo e não consigo mais pensar.
  8. Como você não falou o que o programa faz, deu a entender que você realiza a checagem de dois valores e eles não estão imprimindo de maneira certa, apenas lixo de memória. Eu fiz uma versão minha desse programa: #include <stdio.h> #include <stdlib.h> #include <locale.h> main () { setlocale(LC_ALL,"portuguese"); int sorteado[6], aposta[6], cont, acertos[6]; cont = 0; puts("Informe os números sorteados"); for(cont = 0; cont < 6; cont = cont + 1) { scanf("%i", &sorteado[cont]); } puts("Informe os números da aposta"); for(cont = 0; cont < 6; cont = cont + 1) { scanf("%i", &aposta[cont]); } for(cont = 0; cont < 6; cont = cont + 1) { if(sorteado[cont] == aposta[cont]) { acertos[cont] = aposta[cont]; } } puts("Números sorteados"); for(cont = 0; cont < 6; cont = cont + 1) { printf("%i\n\n", sorteado[cont]); } puts("Números acertados"); for(cont = 0; cont < 6; cont = cont + 1) { printf("%i\n", acertos[cont]); } } A minha versão funciona certa se os números forem colocados em ordem (6,5,4,3,2,1...) O que poderia resolver esse problema é que antes de realizar a checagem seria organizar os dois vetores em ordem para depois realizar a checagem.
  9. Olá a todos! Estou começando a estudar OpenGL e estou seguindo a apostila fornecida pelo meu professor, porém estou com um problema. No momento que adicionei as funções para fazer com o desenho (um triângulo vermelho) não sofra mudanças em suas dimensões após a janela ser alterada, mas mesmo assim ainda não funciona, mesmo dando rebuild no projeto. #include <windows.h> #include <gl/glut.h> int altura, largura; //Função que for chamada sempre que for preciso para desenhar na tela void desenha(void) { //Limpa a janela de visualização glClearColor(1.0f,1.0f,1.0f,0.0f); //Especifica a cor da tela de fundo para branco glClear(GL_COLOR_BUFFER_BIT); //Define a cor do desenho como vermelho glColor3f(1,0,0); //Desenha o triângulo glBegin(GL_TRIANGLES); glVertex2f(-15.0f,-7.0f); glVertex2f(0.0f,7.0f); glVertex2f(15.0f,-7.0f); glEnd(); glFlush(); //Executa os comandos OpenGL } //Função que inicializa o ambiente de trabalho void inicializacao() { //Dimensões do viewport glViewport(0,0,largura,altura); //Define a janela de visualização 2D glMatrixMode(GL_PROJECTION); gluOrtho2D(-20.0f,20.0f,-10.0f,10.0f); glMatrixMode(GL_MODELVIEW); } //Redesenha a janela void AlteraTamanhoJanela(GLsizei w, GLsizei h) { //Evita divisão por zero if(h == 0) { h = 1; } if(w == 0) { w = 1; } largura = w; altura = h; //Dimensões da ViewPort glViewport(0,0,largura, altura); glMatrixMode(GL_PROJECTION); glLoadIdentity(); //Estabelece Janela de Seleção if(largura <= altura) { gluOrtho2D(-20.0f, 20.0f,-10.0f * altura / largura, 10.0f * altura / largura); } else { gluOrtho2D(-20.0f * altura / largura, 20.0f * altura / largura, -10.0f, 10.0f); } glMatrixMode(GL_MODELVIEW); } //Função que sempre for pressionada uma tecla ASCII void teclado(unsigned char tecla, int x, int y) { if(tecla == 27) //Se pressionou tecla ESC, sai do programa { exit(0); } } //Programa principal int main(void) { glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); //Modo de exibição da GLUT glutInitWindowSize(600,400); //Tamanho inicial em pixel da janela GLUT glutInitWindowPosition(100,100); //Posição Inicial da janela glut glutCreateWindow("Trabalho de Programação II - OpenGL"); //Título da janela glutDisplayFunc(desenha); //Registra a função de redesenho a tela glutReshapeFunc(AlteraTamanhoJanela); //Função para redesenhar glutKeyboardFunc(teclado); //Registra a função para tratamento de teclas inicializacao(); glutMainLoop(); //Inicia o processamento e aguarda interações do usuário return 0; } TrabalhoOpenGL.rar
  10. Bom dia, Eu estava curioso e gostaria de saber se existe alguma maneira de fazer com que esse trecho do meu código inicie de uma maneira como se alguém tivesse digitando na tela, letra a letra normalmente nesse trecho especifico do meu código. Existe algum comando especifico ou precisa de fazer de alguma maneira? Obrigado. void introducao () { puts("Bem-vindo ao Batalha Naval"); printf("\n"); puts("Você é um almirante que tem a missão de derrubar as embarcações inimigas\ne dar vantagem para o seu país na guerra"); puts("Suas Embarcações"); printf("\nSubmarino = SSS ou \nS\nS\nS"); printf("\nHidro-Avião = H em V ou > ou <"); printf("\nPorta-Aviões = PPP ou \nP\nP\nP"); printf("\nDestroyer = DDD ou \nD\nD\nD"); printf("\n"); printf("\n"); puts("Qual seu nome?"); fflush(stdin); gets(jogador.nome); }
  11. Nossa! Não sabia que podia usar o switch dessa maneira, só usava em casos para fazer menus simples. Obrigado@TYSQUARE89 você me ajudou bastante. Só uma dúvida, o que significa o "?" na sintaxe? Esse é novo para mim.
  12. Oh, perdão! #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <locale.h> struct almirante //Perfil e dados dos jogadores { char nome[100]; int placar; }; void batalha_naval () //Jogo { char campo[14][14]; //Campo int hidro_cont, porta_cont, des_cont; int l, c; int c1 = 0, l1 = 0; int vida = 36; struct almirante jogador; jogador.placar = 0; //Placar hidro_cont = 0; porta_cont = 0; des_cont = 0; char inimigo[14][14] = { //Arena do jogo {0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 4}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0}, {4, 4, 4, 0, 0, 0, 2, 3, 2, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0}, {0, 3, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0}, {0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, {0, 3, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0}, {0, 3, 3, 3, 3, 3, 2, 0, 2, 0, 0, 1, 0, 2} }; //Desenha a arena for(l = 0; l < 14; l = l + 1) { for(c = 0; c < 14; c = c + 1) { campo[l][c] = '~'; printf(" \t%c" , campo[l][c]); } printf("\n"); } //Condição para continuar jogando while (vida != 0) { printf("Vida: %i\n", vida); printf("Informe a linha: "); scanf("%i", &l); printf("Informe a coluna: "); scanf("%i", &c); printf("\n"); c1 = c; l1 = l; if(inimigo[l][c] == 0) { for(l = 0; l < 14; l = l + 1) { for(c = 0; c < 14; c = c + 1) { if(l == l1 && c == c1) { campo[l][c] = '*'; } printf(" \t%c" , campo[l][c]); } printf("\n"); } puts("Errou"); } if(inimigo[l][c] == 1) { for(l = 0; l < 14; l = l + 1) { for(c = 0; c < 14; c = c + 1) { if(l == l1 && c == c1) { campo[l][c] = 'S'; vida = vida - 1; } printf(" \t%c" , campo[l][c]); if(campo[l][c] == 'S') { vida = vida - 0; } } printf("\n"); } puts("Submarino destruído"); } if(inimigo[l][c] == 2) { for(l = 0; l < 14; l = l + 1) { for(c = 0; c < 14; c = c + 1) { if(l == l1 && c == c1) { campo[l][c] = 'H'; vida = vida - 1; hidro_cont = hidro_cont + 1; if(hidro_cont == 3) { hidro_cont = 0; } } printf(" \t%c", campo[l][c]); } printf("\n"); } puts("Hidro-Avião destruído"); } if(inimigo[l][c] == 3) { for(l = 0; l < 14; l = l + 1) { for (c = 0; c < 14; c = c + 1) { if(l == l1 && c == c1) { campo[l][c] = 'P'; vida = vida - 1; porta_cont = porta_cont + 1; if(porta_cont == 4) { porta_cont = 0; } } printf(" \t%c", campo[l][c]); } printf("\n"); } puts("Porta-aviões destruído"); } if(inimigo[l][c] == 4) { for(l = 0; l < 14; l = l + 1) { for(c = 0; c < 14; c = c + 1) { if(l == l1 && c == c1) { campo[l][c] = 'D'; vida = vida - 1; if(l == c) { des_cont = des_cont + 1; if(des_cont == 3) { } } } printf(" \t%c", campo[l][c]); } printf("\n"); } puts("Destroyer destruído"); } if(vida == 0) { system("cls"); puts("FIM DO JOGO"); jogador.placar = jogador.placar + 1; printf("Placar: %i", jogador.placar); } } } main () { setlocale(LC_ALL,"portuguese"); batalha_naval (); getch(); return 0; } Eu só coloquei a condição quando um submarino é atingido, para testar se funcionasse. Todas os números "1" na matriz representam um submarino. Quando eu digito 0 e 1 (coordenadas) para atingir um submarino e digito novamente, a vida é extraída do mesmo jeito.
  13. Usei mais por formalidade mesmo, o que não entendo é porque a condição não está funcionando. Isso que, quando uso uma mesma coordenada que já foi descoberta, a vida ainda é subtraída. Pensei que usando essa condição resolveria o problema, mas não adiantou.
  14. Olá novamente, percebi um erro lógico no meu código, quando digito em uma mesma posição onde o setor está localizado, a vida é subtraída mesmo assim. Eu já tentei fazer isso. if(inimigo[l][c] == 1) { for(l = 0; l < 14; l = l + 1) { for(c = 0; c < 14; c = c + 1) { if(l == l1 && c == c1) { campo[l][c] = 'S'; vida = vida - 1; } if(campo[l][c] == 'S') { vida = vida - 0; } printf(" \t%c" , campo[l][c]); } printf("\n"); } puts("Submarino destruído"); } E mesmo assim a vida é subtraída. Tentei colocar ela em diferentes posições e mesmo assim não funciona, o que estou fazendo de errado?

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×