Ir ao conteúdo
  • Cadastre-se

Rafael Domingues Corrêa

Membro Pleno
  • Posts

    35
  • Cadastrado em

  • Última visita

  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.

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...