Ir ao conteúdo
  • Cadastre-se

Rafael Domingues Corrêa

Membro Pleno
  • Posts

    35
  • Cadastrado em

  • Última visita

Tudo que Rafael Domingues Corrêa postou

  1. int jogadaComputador(){ int jogada; // Armazena inteiro da jogada srand(time(NULL)); // Recolhe semente para o número randômico através do relógio do computador /** srand() é necessário pois o computador não é criativo, então essa função altera o valor de rand() fazendo com que a máquina some a pilha de números pseudo-randômicos ao horário atual (coisa que nunca se repete) **/ while((jogada = rand()%9) == 0){}; // Enquanto número randomizado for 0 (zero) /** Pois zero é uma jogada inválida no seu aplicativo **/ return jogada; // Envia o número da jogada} Ta aí, meu querido.
  2. Eu fiz uma implementação bem simples, de jogadas randômicas. Dê uma olhadinha: #include <stdio.h>#include <stdlib.h>#include <time.h>int jogadaComputador(){ int jogada; srand(time(NULL)); while((jogada = rand()%9) == 0){}; return jogada;}int main(){// Caractere '32' na tabela ASCII representa campos vazios ou espaço ' '.// Caractere '88' na tabela ASCII representa 'X'.// Caractere '79' na tabela ASCII representa 'O'.char bloco[3][3];int jogada=0;int jogador=1;int posicao=0; printf("###################################\n"); printf("########## JOGO DA VELHA ##########\n"); printf("###################################\n\n\n"); int x, y; for(x=0; x<3; x++){ for(y=0;y<3;y++){ bloco[x][y]=32; // Parece confuso mas isso e um espaco } }while(jogada<9){ for(x=0;x<3;x++){ for(y=0;y<3;y++){ if(y!=2) printf(" %c |",bloco[x][y]) ; else printf(" %c",bloco[x][y]); } if(x!=2) printf("\n--- --- ---\n"); } printf("\n\n"); if(jogador == 1) { printf("Jogador %d Digite a posicao (1-9): ", jogador); scanf("%d", &posicao); } else { posicao = jogadaComputador(); } printf("\n");switch(posicao){ case 1: if(jogador==1){ if(bloco[0][0]==32){ bloco[0][0]=88; jogador=2; jogada++; } }else{ if(bloco[0][0]==32){ bloco[0][0]=79; jogador=1; jogada++; } } break; case 2: if(jogador==1){ if(bloco[0][1]==32){ bloco[0][1]=88; jogador=2; jogada++; } }else{ if(bloco[0][1]==32){ bloco[0][1]=79; jogador=1; jogada++; } } break; case 3: if(jogador==1){ if(bloco[0][2]==32){ bloco[0][2]=88; jogador=2; jogada++; } }else{ if(bloco[0][2]==32){ bloco[0][2]=79; jogador=1; jogada++; } } break; case 4: if(jogador==1){ if(bloco[1][0]==32){ bloco[1][0]=88; jogador=2; jogada++; } }else{ if(bloco[1][0]==32){ bloco[1][0]=79; jogador=1; jogada++; } } break; case 5: if(jogador==1){ if(bloco[1][1]==32){ bloco[1][1]=88; jogador=2; jogada++; } }else{ if(bloco[1][1]==32){ bloco[1][1]=79; jogador=1; jogada++; } } break; case 6: if(jogador==1){ if(bloco[1][2]==32){ bloco[1][2]=88; jogador=2; jogada++; } }else{ if(bloco[1][2]==32){ bloco[1][2]=79; jogador=1; jogada++; } } break; case 7: if(jogador==1){ if(bloco[2][0]==32){ bloco[2][0]=88; jogador=2; jogada++; } }else{ if(bloco[2][0]==32){ bloco[2][0]=79; jogador=1; jogada++; } } break; case 8: if(jogador==1){ if(bloco[2][1]==32){ bloco[2][1]=88; jogador=2; jogada++; } }else{ if(bloco[2][1]==32){ bloco[2][1]=79; jogador=1; jogada++; } } break; case 9: if(jogador==1){ if(bloco[2][2]==32){ bloco[2][2]=88; jogador=2; jogada++; } }else{ if(bloco[2][2]==32){ bloco[2][2]=79; jogador=1; jogada++; } } break; default: printf("Valor Invalido!\n\n"); break; } if((bloco[0][0]==88 && bloco[0][1]==88 && bloco[0][2]==88)|| (bloco[1][0]==88 && bloco[1][1]==88 && bloco[1][2]==88)|| (bloco[2][0]==88 && bloco[2][1]==88 && bloco[2][2]==88)|| (bloco[0][0]==88 && bloco[1][0]==88 && bloco[2][0]==88)|| (bloco[0][1]==88 && bloco[1][1]==88 && bloco[2][1]==88)|| (bloco[0][2]==88 && bloco[1][2]==88 && bloco[2][2]==88)|| (bloco[0][0]==88 && bloco[1][1]==88 && bloco[2][2]==88)|| (bloco[0][2]==88 && bloco[1][1]==88 && bloco[2][0]==88)) { for(x=0;x<3;x++){ for(y=0;y<3;y++){ if(y!=2) printf(" %c |", bloco[x][y]) ; else printf(" %c", bloco[x][y]); } if(x!=2) printf("\n--- --- ---\n"); } printf("\n\n\a\t\tJOGADOR %d VENCEU!!!\n", jogador-1); break; } if((bloco[0][0]==79 && bloco[0][1]==79 && bloco[0][2]==79)|| (bloco[1][0]==79 && bloco[1][1]==79 && bloco[1][2]==79)|| (bloco[2][0]==79 && bloco[2][1]==79 && bloco[2][2]==79)|| (bloco[0][0]==79 && bloco[1][0]==79 && bloco[2][0]==79)|| (bloco[0][1]==79 && bloco[1][1]==79 && bloco[2][1]==79)|| (bloco[0][2]==79 && bloco[1][2]==79 && bloco[2][2]==79)|| (bloco[0][0]==79 && bloco[1][1]==79 && bloco[2][2]==79)|| (bloco[0][2]==79 && bloco[1][1]==79 && bloco[2][0]==79)) { for(x=0;x<3;x++){ for(y=0;y<3;y++){ if(y!=2) printf(" %c |", bloco[x][y]) ; else printf(" %c", bloco[x][y]); } if(x!=2) printf("\n--- --- ---\n"); } printf("\n\n\a\t\tJOGADOR %d VENCEU!!!\n", jogador+1); break; } if(jogada==9){ for(x=0;x<3;x++){ for(y=0;y<3;y++){ if(y!=2) printf(" %c |",bloco[x][y]) ; else printf(" %c",bloco[x][y]); } if(x!=2) printf("\n--- --- ---\n"); } printf("\n\n"); printf("\n\n\a\t\tO JOGO EMPATOU!\n"); } }} Eu só criei uma função que retorna o valor da jogada, não 0 (zero). Falou, um abraço.
  3. Eu vou escrever um código com renderização de vetor de caracteres com captura de eventos pra dar uma ilustrada em como poderia ser feito. Eu mesmo já desenvolvi um joguinho onde uma nave marcava ponto ao destruir os inimigos. Eu usei métodos de renderização gráfica, só que aplicada para terminal (prompt de comando). O conceito é simples, é só usar um pouco de metologia de games, que é uma das minhas especialidades. Um abraço, eu vou publicar um código sample. ok?
  4. Para chamar uma função através de uma variável, você deve se certificar que ela é um ponteiro para função. Pois uma variável comum só é capaz de receber dados de uma função. Estude o código abaixo: #include <stdio.h>void calculadora(){ printf("Nao faz nada.\n");}int main(){ void (*pFuncao)(); //Ponteiro para função pFuncao = &calculadora; //Recebe o endereço da função pFuncao(); //Chama função através do ponteiro return 0;} Um ponteiro para função é muito útil para aplicar em struct's, assim podendo criar métodos para os dados da estrutura, por exemplo. Aí você já começa a entrar em POO (programação orientada a objetos).
  5. Você esqueceu-se que você deve fazer o bubbleSort para todos os dados da estrutura. Está aqui o código corrigido e comentado. #include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct est_dados{ char nome[100]; int idade;} dados;int main(){ dados Pessoas[3], aux; // 'aux' deve ser uma estrutura semelhante a dados int i, j; for(i=0; i < 3; i++) { printf("Digite seu nome: "); fflush(stdin); gets(Pessoas[i].nome); printf("\nDigite sua idade: "); scanf("%d", &Pessoas[i].idade); system("cls"); } for(j=2; j>=1; j--) { for(i=0; i < j; i++) { if(Pessoas[i+1].idade < Pessoas[i].idade) { aux = Pessoas[i]; //Passa todos os dados de 'Pessoas[i]' para 'aux' Pessoas[i] = Pessoas[i+1]; // Inverte valores Pessoas[i+1] = aux; // Recupera dados de 'aux' } } } for(i=0; i < 3; i++) { puts(Pessoas[i].nome); } return 0;} Sempre que usar uma estrutura e precisar ordená-la, use uma variável auxiliar com o mesmo padrão e passe os dados tudo de uma vez!
  6. Sim, é possível você implementar Máquina vs. Jogador, mas você precisará instruir a máquina para não fazer uma jogada inválida (como por exemplo, jogar numa lacuna onde já está preenchida). Mas para dificultar para o jogador você pode implementar um algorítmo padrão. Ou colocar um tempo limite para a jogada do próximo jogador, o que reduzirá o tempo de pensamento do jogador. É bom um desafiozinho, hehew.
  7. Mais tarde dou uma checada na sua implementação. Agora estou sem tempo
  8. Para capturar eventos acima, abaixo e etc... você precisa usar função de captura de eventos do teclado. Segue abaixo o código exemplo. Dê uma estudada. #include <stdio.h>#include <conio.h> //Importa kbhit necessário para capturarr eventosint main(){ char key; //Armazena caractere asc do { if(kbhit()) { // 'kbhit()' captura um evento do teclado key = getch(); // 'getch()' envia o evento para uma variável /** Ele devolve o evento como um inteiro de 1 byte Se você quiser estudar os eventos basta usar um comando que imprime o inteiro correspondente ao evento do teclado, assim: printf("%i\n", key); **/ switch(key) //Compara o evento { case 72: //Valor do evento 'tecla para cima precionada' printf("Acima corresponde ao evento %i.\n", key); break; case 80: printf("Abaixo corresponde ao evento %i.\n", key); break; case 75: printf("Esquerda corresponde ao evento %i.\n", key); break; case 77: printf("Direita corresponde ao evento %i.\n", key); break; case 13: printf("Enter corresponde ao evento %i.\n", key); break; case 27: printf("Esc corresponde ao evento %i.\n", key); return 0; //Fecha o programa com sucesso; break; } } } while(1); return 0;} Espero ajudar.
  9. Usar o esc seria sim trabalhoso. E quanto mais funções você colocasse no programa (ou seja, mais operadores), mais implementações você teria que usar para usar o 'esc'. É melhor usar o 'Ctrl+C' do sistema operacional mesmo.
  10. Eu testei seu código. O problema está na leitura do arquivo. Os métodos utilizados não carregam os dados na memória corretamente. Estude esse código que faz essa tarefa: #include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/stat.h>int main(){ int i, //Controlador de loop; qNum = 1; //Onde será armazenado a quantidade de valores FILE *fp; //Ponteiro de arquivo struct stat dadosDoArquivo; //Estrutura de dados valiosos de arquivo if((fp = fopen("ordenar.txt", "r"))) //Se arquivo aberto com sucesso { stat("ordenar.txt", &dadosDoArquivo); //Lê dados valiosos do arquivo } else //Se não encontrado { printf("O arquivo nao foi encontrado.\n"); fclose(fp); //Destrói o ponteiro return 0; //Fecha o programa } char dados_str[dadosDoArquivo.st_size]; //Variável onde será armazenadoo os dados do arquivo /** dadosDoArquivo.st_size indica o tamanho do conteúdo do arquivo em bytes **/ for(i=0; i<dadosDoArquivo.st_size; i++) //Enquanto não carregado todos os dados { dados_str[i] = fgetc(fp); //Pega caractere por caractere if(dados_str[i] == ' ') //Se achar espaço qNum++; //Haverá um número a mais nos dados } dados_str[i] = '\0'; //Substitui o último caractere para indicar fim de frase int dados_ptr[qNum]; //cria Array de inteiros onde será armazenado os valores char *pch = strtok(dados_str, " \0"); //Ponteiro que controla tokens de uma string i = 0; while (pch != NULL) //Enquanto houver tokens { dados_ptr[i] = atoi(pch); //Converte token em inteiro i++; //Passa para o próximo número pch = strtok (NULL, " "); //Procura próximo token } /** A partir daqui você cria suas implementações **/ //Exibe os números do arquivo como dados inteiros for(i=0; i<qNum; i++) printf("%i, ", dados_ptr[i]); return 0;}
  11. Eu acho mais conveniente para o usuário do aplicativo se você criar um vetor de renderização de caracteres. Assim será possível ele navegar com as setas do teclado pelo jogo da velha. Ele também poderá usar uma tecla para confirmar a jogada, por exemplo a tecla 'x' ou enter. Para confirmar a jogada substitua um caractere minúsculo por um maiúsculo na posição indicada pelo jogador. Para ilustrar, uma tela antes da confirmação da jogada: ║x║X═╬═╬═ ║O║ ═╬═╬═ ║O║ Uma tela depois da jogada ter sido confirmada O║X║X═╬═╬═x║O║ ═╬═╬═ ║O║ Se já tiver um ideia de como implementar, beleza. Se não, na dúvida de como fazer renderização de vetor de caracteres, dê um toque.
  12. Dica: Procure por notícias ou posts na internet sobre seu problema, pois pode ser um bug de atualização de sistema operacional. Um ponto de restauração anterior as vezes não desfaz a atualização de sistema, por definição da própria Microsoft®. Se o caso não for esse: Tenha em mãos o manual do notebook ou a caixa do mesmo. Verifique a listagem dos itens que são enviados junto com o produto. Exemplo: "Nesta caixa contém: 1 Notebook 1 Fonte de alimentação 110/220V 1 Manual de instrução e assim por diante..." Se houver na descrição a presença de 1 CD, mas não veio junto com o restante do produto, há um erro de embalamento e você pode requerir o item faltante a fornecedora. Se não houver na descrição, verifique se há disponibilidade, no site da montadora do notebook, de fazer um download de um disco de recuperação do seu modelo de dispositivo. Se o problema persistir, é melhor consultar um técnico na localidade pra analisar de perto o problema. Pode ser que ele nem lhe cobre um preço para lhe falar mais sobre o problema. Mas, qualquer dúvida pode falar!
  13. Pode não ser o caso. Experimente em outra máquina pra ver se funciona. Pode ser um defeito de fabricação. Nunca se sabe!
  14. Se seu sistema operacional não for uma cópia original da Microsoft® estará sujeito a um mal funcionamento. Tente instalar uma versão anterior. Se for uma cópia original, verifique se veio junto com seu notebook um CD de recuperação. Use-o para restaurar o sistema operacional e os drivers da máquina. Obs.: Se não veio um disco de recuperação é provável que o vendedor do produto tenha instalado um sistema operacional na máquina não padrão ao de fábrica do fornecedor. Nesse caso a responsabilidade de manutenção fica com ele, pois há a possibilidade de erros de instalação, drivers incompatíveis, contaminação por malwares não detectáveis, e muitos outros fatores. O notebook que estou usando para publicar esta resposta é um exemplo. Ele foi comprado com um sistema operacional não padrão. Ou seja, o vendedor fez modificações na máquina. Isso tem se tornado muito comum no comércio atual. Mas pode prejudicar o consumidor.
  15. É possível usar o 'esc' a qualquer momento, sim, mas você terá que reestruturar todo seu programa (seria melhor criar um novo código, e nem sempre isso é viável, pois as vezes não temos tempo, como numa prova). É melhor usar o Ctrl+C padrão do sistema operacional. Quanto a zerar a calculadora, voce só terá que implementar os switch-case já existentes no seu aplicativo. Adicione 'z' ou 'c', qualquer letra serve, como se fosse um operador. As calculadoras sempre usam zerar como um operador, é por isso que existe o botão 'C' nelas. Esse 'C' significa o operador 'clear (zerar)'. Lembre-se de explicar ao usuário do aplicativo o que a letra simboliza. Assim será só necessário tratar o caso numa switch-case já existente. Espero tê-lo ajudado a entender.
  16. Seu problema está na abstração. Você não entendeu plenamente a questão e criou uma função caixa() que não corresponde ao pedido no enunciado enunciado. Leia com atenção seu enunciado e projete novamente a função.
  17. Não há a necessidade de usar 'esc'. Todo aplicativo console por padrão recebe o comando 'Ctrl+C' para encerrar a aplicação. É perder tempo fazer isso. Mas se quiser usar o 'esc' pesquise o valor dele a tabela ASCII (verá que o valor é 27), basta implementálo no switch-case. switch(&caractere) //Escolha{ //Outros casos... //... case 27: //Caso for 'esc' (27 na tabela ASCII) return 0; //Encerra o programa com sucesso} E você pode zerar o valor inicial, implementando uma nova opção no switch-case. Imprimindo por exemplo: "Precione 'z' para zerar a calculadora". switch(&caractere) //Escolha{ //Outros casos... //... case '\': //Caso for 'esc' (27 na tabela ASCII) NF = 0; break;} Qualquer dúvida dê um toque.
  18. Estude esse código que escrevi para você ler uma palavra apenas direto do arquivo. #include <stdio.h>#include <stdlib.h>#include <time.h>#define NUM_PALAVRAS 6 //Define o número de palavras no arquivoint main(){ int indexPalavra, //Variável do controle do index da palavra i, j; //Variáveis de controle de loop FILE *fp; //Ponteiro de arquivo char palavra[100]; //Varíavel pra armazenar a palavra fp = fopen("lista.txt", "r"); //Abre o arquivo if(fp) //Se arquivo existir { srand(time(NULL)); //Pega a semente do número randômico indexPalavra = rand()%NUM_PALAVRAS; //Gera o número da palavra (index) for(i=0, j=0; j<indexPalavra; i++) //Enquanto não achar o index { if(fgetc(fp) == '\n') //Se achar próxima palavra j++; //Passa para o próximo index; /** Enquanto isso o ponteiro 'fp' armazena em si mesmo a posição do arquivo que é navegada por 'fgetc()'. A cada consulta de caractere a posição do arquivo é passada pra frente **/ } } else //Se não achar arqquivo { printf("Lista nao encontrada.\n"); fclose(fp); //destrói o ponteiro return 0; //Fecha o programa com sucesso } //Basta ler a palavra agora i = -1; do { i++; palavra[i] = fgetc(fp); //Lê letra por letra if(palavra[i] == '\n') //Se caractere lido for de próxima linha break; //Terminou a palavra } while(palavra[i] != EOF); //Enquanto não fim do arquivo palavra[i] = '\0'; //Substitui o último caractere da palavra para indicar fim de frase //Feche o arquivo fclose(fp); //Daqui pra frente você implementa o jogo como quiser printf("Palavra: %s\n", palavra); return 0; //Fecha o programa com sucesso} Repare que o arquivo é lido caractere por caractere. O index é definido por cada nova linha (o caractere '\n'). Espero que ajude, Falou.
  19. A lógica para manusamento do aquivo está errada. Estude o caso correto e depois faça suas implementações. #include "iostream"#include "fstream"using namespace std;int main (){ //Aqui vão as variáveis para armazenar seus dados ofstream ponteiro; //Ponteiro do arquivo ponteiro.open("ponteiro.txt", fstream::app); //'fstream::app' indica que dados serão adicionados no fim do arquivo /** ofstream.open() cria uma arquivo se não achar um **/ if(ponteiro.is_open()) //Se foi possível abrir o arquivo { cout<< "Arquivo aberto!!!" << endl; } else //Se não foi possível abrir o arquivo { cout << "Nao foi possivel abrir o arquivo" << endl; ponteiro.close(); //Destrói o ponteiro return 0; //Fecha o programa com sucesso } //Aqui vão as intrução de leitura e escrita do arquivo... return 0; //Fecha o programa com sucesso} Qualquer dúvida, dá um toque. Falou.
  20. Então cada servidor deve ter seu projeto, nesse caso. Não há como compilar dois ou mais executáveis por projeto (a menos que a IDE permita subprojetos, o que eu ainda desconheço). Sobre minha segunda opinião, o que citei acima vale também. Ou seja, cada excutável terá seu projeto. Quanto ao uso de DLL's, é o mesmo cada DLL terá seu projeto. Uma DLL é como um programa só que com extensão diferente, em vez de *.exe usa-se *.dll e ela não possui uma função main() e, geralmente, em vez de devolver um dado em arquivo ou imagem na tela, ela devolve um dado em memória para o aplicativo que a solicitou. Ela é muito usada em aplicativos muito segmentados (que geralmente são muito grandes), ou quando vários aplicativos usam a mesma função. Na pasta "C:\Windows\system32" você encontra muitas DLL's que são usadas pela maioria dos aplicativos para windows (as vezes, chamamos essas DLL's em nossos programas sem se dar conta usando uma função padrão). Quanto ao seu problema. É melhor criar um header com as funções que todos os programas usam (como por exemplo <funcoes.h>), e usá-lo em todos os projetos, assim você vai criar projetos mas compactos e facilitará sua vida. Para ilustrar: 1) Arquivo <minhasFuncoes.h> /** nesse arquivo vai todas as funções que uso nos 3 projetos **/void funcao1(){ //execução return}void funcao2(){ //execução return}//E assim por diante... Esse arquivo pode ser adicionado junto com os outros headers do seu compilador (desde que não haja conflitos de nome, ou seja, tenha um nome igual com os outros headers do seu compilador) para ser usado futuramente, assim: #include <minhasFuncoes.h> Ou pode ser colocado em um diretório qualquer (mas deve ser referenciado o arquivo com nome completo de diretório. Por exemplo:) #include "C:/meusHeaders/minhasFuncoes.h" //Deve estar entre aspas ("") pois se refere a um diretório diferente dos headers do compilador 2) Agora basta adicionar esse header em cada projeto seu: /** Projeto 1 **/#include <stdio.h>#include <minhasFuncoes.h> //Inclui as funcoes usadas por todos os projetos/** Se estiver em um diretório diferente do de headers do compiador digitar assim#include "[Drive:]/[Path]/minhasFuncoes.h"onde [Drive:] indica a letra da partição e [Path] o Diretório do arquivo**/int main(){ funcao1(); funcao2(); return 0;} Faça assim para cada projeto. Espero que tenha esclarecido
  21. Você pode usar a própria biblioteca do windows, se estiver desenvolvendo pra windows é claro, em <windows.h>. É mais simples usá-la e não precisa configurar, pois ela é padrão nos compiladores. Você poderia colocar um áudio no jogo usando uma thread (função executada simultâneamente com outra do programa), por exemplo. Mas no caso de desenvolvimento de jogos em especial, existe uma biblioteca livre chamada SDL (Simple Directmedia Library), que é muito útil em todos os apectos, desde criar gráficos, a carregar imagens e fontes de caracteres, e até fazer mixação de áudio.
  22. Você só pode ter uma função main() por projeto. O que você poderia fazer nesse caso é um programa com múltiplas funções. Aí seria necessário criar um menu de acesso para cada função do projeto. você poderia também compilar programas com parâmetros de entrada e usá-los como extensão de um aplicativo central. Ou mesmo, programar DLL's (o que seria desnecessário em projetos pequenos).
  23. Dica: Estrutura do arquivo pode ser tipo CSV, onde cada dado é separado por vígulas. O mapa pode ser representado por qualquer caractere dentro do arquivo usando espaçamento alternado. Um exemplo de arquivo seria: 10, 10,oqoooooooo,oqooqooqqo,oqqqqqqqoo,oooooqoooo,oqqqoqoooo,oqoooqqqqo,oqqqqqooqo,oooooqqqoo,ooqqqqoqoo,oooooooqoo Ou poderia usar um arquivo com dados de cordenadas, mais complexo, por sinal: 10, 10,1, 0, 1, 1, 5, 1, 1, 2, 2, 2, 3, 2, 4, 2,5, 2, 6, 2, 7, 2, 8, 2, 8, 3, 2, 4, 8, 4,2, 5, 3, 5, 4, 5, 5, 5, 6, 5, 7, 5, 8, 5,3, 6, 8, 6, 3, 7, 5, 7, 6, 7, 7, 7, 8, 7,1, 8, 2, 8, 3, 8, 5, 8, 5, 9 Onde o primeiro par representa a área do mapa e cada par de números seguintes representa uma coordenada do mapa onde caminhar é perimitido (o oposto seria possível também). Esse método é melhor quando se exige criptografação dos dados. Mas ele pode ser mantido nessa estrutura para permitir moodificações no mapa. O próximo passo seria construir uma função que permite calcular colisões. Isso é simples comparando a posição do jogador com as coordenadas indicadas no mapa usando um simples comando de 'se': int colisao(int map_x, int map_y, int posJogador_x, posJogador_y){ if(map_x == posJogador_x && map_y == posJogador_y) return 1; //Colidiu else return 0; //Não colidiu} Claro, haverá a necessidade de implementação, onde será necessário comparar a posição do jogador de duas formas possíveis: 1) Simples: comparar com todas as coordenadas do mapa (gasta mais processo e deixa o aplicativo mais lento, inviável em mapa muito grande); 2) Algorítmica: comparar a posição do jogador com as posições mais próximas do jogador, separando assim uma área específica do mapa como um todo; Dúvidas na implementação dê um toque.
  24. Carregue o arquivo *.CVS inteiro na memória e use a biblioteca <string.h> para gerenciar os dados em memória. Repare nesse código: #include <stdio.h>#include <string.h> //É com essa biblioteca que você vai gerenciar os dadosint main (){ char texto[] = {"Nome,Sobrenome,Idade,Peso\n\Rafael,Domingues Correa,20,59.0\n\Pablo,Picasso,67,61.3"}; //Dados supositórios char *pch; //Ponteiro para cada frase printf ("Separando texto em partes:\n\n"); pch = strtok(texto, ","); //A função strtoc recebe o endereço dos dados, e os caracteres de separação /** No caso de arquivos CSV a 'vírgula' (,) é o caractere separador **/ while (pch != NULL) //Enquanto houver frases { printf("%s\n", pch); pch = strtok(NULL, ","); //Procura próxima frase /** Nesse caso não há mais necessidade de enviar o endereço, pois strtok() armazena-o numa variável global de <string.h> **/ } return 0;} Basta fazer a implementação de leitura de arquivo com <stdio.h> e <sys/stat.h> E usar um espaço de memória alocado, com <stdlib.h> para armazenar os dados de acordo com a nova estrutura. Não é necessário criar um vetor, um array já será o suficiente. Qualquer dúvida dê um toque!

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!