Last active
July 23, 2017 01:02
-
-
Save Mathsellas/9d1da30b763132a8389070ccb30ebf1a to your computer and use it in GitHub Desktop.
Jogo da forca em c, com implementação em cgi
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <ctype.h> | |
#include <math.h> | |
#include <locale.h> | |
//--------------------Constantes para facilitar mudancas no codigo------------------------------------------------------------------------------------------- | |
#define MAX_letras 100 | |
#define MAX_alfabeto 27 | |
#define MAX_erros 6 | |
//------------------------------------------Cacar caracters em uma string------------------------------------------------------------------------------------- | |
int vvitoria(char vetor[]) | |
{ | |
int i, retorno = 0; | |
for(i=0;i<'\n';i++) | |
if(vetor[i] == '_') | |
retorno = 1; | |
return retorno; | |
} | |
//------------------------------------------------Palavra com letras maiúsculas------------------------------------------------------------------------------- | |
void maiuscular_palavra(char palavra[]) | |
{ | |
short int i; | |
for(i=0;i<strlen(palavra);i++) | |
palavra[i]=toupper(palavra[i]); | |
} | |
//--------------------------------------------------Limpeza de vetor------------------------------------------------------------------------------------------ | |
void limpar_vetor(char vetor_limpado[], int tamanho) | |
{ | |
memset(vetor_limpado, '_', tamanho); | |
} | |
//-------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
int main(int argc,char *argv[]) | |
{ | |
//----------------------------------------------------Variaveis------------------------------------------------------------------------------------------------- | |
setlocale(LC_ALL, "Portuguese");//acrescenta a acentuacao ABNT no codigo | |
int contadorerros = 0;//Recebe o numero aleatorio e o nível em que o player parou | |
short int venceu, acerto;//Variavel ira servir para definir se o player ganhou e caso acerte | |
int tamanho;//Armazenara o tamanho da palavra | |
char nome_arquivo[MAX_letras], palavra_final[MAX_letras]; //Recebera a palavra do digitada pelo player e o nome do arquivo que será criado | |
char letra_digitada[MAX_letras];//Armazenara a letra digitada | |
char *leitor, armazem_letra[MAX_alfabeto];//string responsalvel pela manipulacao das strigs passando pelos diferentes niveis | |
char nivel_atual[MAX_letras], letraf;//String que armazenara o nivel em que se encontra e letraf sera usada na manipulacao da letra digitada | |
int i, count = 0;//contadores | |
char *ldados;//ponteiro que irá ler os dados digitados pelo usuario | |
FILE *arquivo, *letrar;//usada para definir o arquivo | |
char palavra_digitada[MAX_letras], nome_arquivo1[MAX_letras];//armazenara a letra repetida da palavra, e o nome do segundo arquivo | |
char letra_repetida[MAX_alfabeto], nivel;//armazenara as letras repetidas pelo usuário | |
char teste[MAX_letras]; | |
//------------------------------------------------Fim Variaveis------------------------------------------------------------------------------------------------ | |
printf("%s%c%c\n","Content-Type:text/html;charset=UTF-8",13,10); | |
printf("<TITLE>ENFORCADOS</TITLE>"); | |
ldados = getenv("QUERY_STRING"); | |
memset(letra_repetida, '\0', MAX_alfabeto); | |
contadorerros = 0; | |
venceu = 0; | |
memset(armazem_letra, '\0', MAX_alfabeto); | |
//----------------------------------------------------------Determinacao do nivel----------------------------------------------------------------------------- | |
leitor = strstr(ldados,"nivel=");//Armazenara tudo que vier a frente do nivel= e ele mesmo isso caso ele exista; | |
if(ldados==NULL) | |
printf("<P>ERRO! DADO DE ENTRADA INVÁLIDO"); | |
else | |
{ | |
if(leitor != NULL) | |
{ | |
leitor += 6;//Usado para mostrar somente o caracter do numero | |
strcpy(nivel_atual, leitor);//copia o numero para a string nivel_atual | |
leitor++; | |
*leitor = '\0';//limpa a string da leitura | |
nivel = nivel_atual[0]; | |
} | |
else | |
nivel = 48;//se der erro reseta o nivel | |
//-------------------------------------------------Determinacao do nome do arquivo e variavel da palavra escolhida-------------------------------------------- | |
leitor = strstr(ldados,"palavra=");//assim como o da linha 43 sera usado para armazenar o nome | |
if(leitor != NULL) | |
{ | |
leitor += 8;//Usado para mostrar somente a palavra | |
strcpy(palavra_final, leitor); | |
leitor = palavra_final; | |
while (*leitor != '\0' && *leitor != '\n' && *leitor != '&') | |
leitor++; | |
*leitor = '\0';//retorna o vetor a posivao inicial leitor | |
strcpy(nome_arquivo, "/home/enc/744347/public_html/arquivos/arq-");//nomeia o endereco de acesso remoto | |
strcat(nome_arquivo, palavra_final); | |
strcat(nome_arquivo, ".dat"); | |
strcpy(nome_arquivo1, "/home/enc/744347/public_html/arquivos/camada-"); | |
strcat(nome_arquivo1, palavra_final); | |
strcat(nome_arquivo1, ".dat"); | |
/*leitor a cima ira concatenar o endereco de acesso remoto com o nome lido e finalizara | |
com o .dat para identificar o formato do arquivo criado*/ | |
} | |
else | |
nivel = 0;//se der erro reseta o nivel | |
//---------------------------------------------------------------Determinacao da letra digitada---------------------------------------------------------------- | |
leitor = strstr(ldados,"letra="); | |
if(leitor != NULL) | |
{ | |
leitor += 6; //Avancara 6 caracteres para ficar somente o caracter da letra digitada | |
strcpy(letra_digitada, leitor);//copia a letra para a string adequada | |
leitor = letra_digitada; | |
leitor ++; | |
*leitor = '\0';//retorna o vetor a posivao inicial | |
letraf = letra_digitada[0]; | |
} | |
else | |
letraf = '@'; | |
if(nivel == 48)//Caso for a primeira vez que o pragrama cgi rode | |
{ | |
memset(palavra_digitada, '\0', MAX_letras); | |
limpar_vetor(palavra_digitada, strlen(palavra_final)); | |
//---------------------------------------------------Corpo html------------------------------------------------------------------------------------------------ | |
printf("<head>\n");//incio do cabecalho | |
printf("<link href=\"forca.css\" rel=\"stylesheet\" type=\"text/css\"/>\n");//acesso ao css | |
printf("<body>\n");//inicia o corpo no html | |
printf("<H1>Jogo da Forca</H1>\n"); | |
printf("<img src=\"http://cap.dc.ufscar.br/~744347/0.jpg\" width=\"400\" height=\"300\">\n");//printa a imagem inicial da forca | |
printf("<form action=\"http://cap.dc.ufscar.br/~744347/cgi-bin/forca.cgi\">\n");//Linka o endereco de acesso nao remoto | |
printf("<br>"); | |
tamanho = strlen(palavra_final);//tamanho da palavra | |
for(i=0;i<tamanho;i++)//imprime a palavra | |
printf(" %c", palavra_digitada[i]); | |
printf("<br>\n"); | |
printf("<br>\n"); | |
printf("Digite a letra:\n"); | |
printf("<input type=\"text\" name=\"letra\" maxlength=\"1\">\n");//cria a area que sera digitada o input da letra a ser testada | |
printf("<input type=\"hidden\" name=\"nivel\" value=\"1\">\n");//cria um campo de submissao invisivel e seta o valor inicial como 1 | |
printf("<input type=\"hidden\" name=\"nome\" value=\"%s\">\n", palavra_final);//cria um campo de submissao invisivel e seta o valor como a palavra escolhida | |
printf("<input type=\"submit\" value=\"submit\">");//cria o botao de enviar os dados | |
printf("</form>\n");//fim do formulariol | |
printf("</body>\n");//fim do corpo | |
printf("</head>\n");//fim do cabecalho | |
//----------------------------------------------------------Fim html------------------------------------------------------------------------------------------- | |
maiuscular_palavra(palavra_final); | |
letra_repetida[count] = letraf; | |
//-------------------------------------------------------------Criacao dos arquivos------------------------------------------------------------------------- | |
letrar = fopen(nome_arquivo1, "w");//criara o arquivo que ira armazenar a letrar da palavra | |
if(letrar == NULL) | |
printf("Erro na criação do arquivo\n"); | |
else | |
fprintf(letrar,"%s", letra_repetida); | |
fclose(letrar); | |
arquivo = fopen(nome_arquivo, "w");//Cria um arquivo vazio, se o arquivo ja existir o conteudo eh descartado e setado como um novo e vazio arquivo | |
// O primeiro fopen se dá para criar o arquivo que na realidade ainda nao existe em teoria | |
if(arquivo == NULL)//Caso o arquivo nao consiga ser carregado | |
printf("<H3>ERRO NA CRIAÇÃO DO ARQUIVO<H3>\n");//Printa mensagem de erro caso o diretorio nao existir ou nao for encontrado | |
else | |
{ | |
fprintf(arquivo, "%s\n", palavra_digitada); | |
fprintf(arquivo, "%d\n", count); | |
fprintf(arquivo, "%d\n", tamanho); | |
fprintf(arquivo, "%s\n", palavra_final); | |
fprintf(arquivo, "%d\n", contadorerros); | |
/*Como se trata de um arquivo externo nao se pode printar somente com o printf sendo necessario o fprintf | |
para determinar o arquivo em que deve ser impresso os contadores*/ | |
} | |
fclose(arquivo);//fecha o arquivo | |
count++; | |
} | |
else //caso o nivel seja diferente de 0 ou seja se a pessoa já tiver digitada a palavra | |
{ | |
memset(palavra_digitada, '\0', MAX_letras); | |
//----------------------------------------------Abertura dos arquivos para leitura------------------------------------------------------------------------------ | |
letrar = fopen(nome_arquivo1, "r");//Abrira o arquivo que para ler a letrar da palavra | |
if(letrar == NULL) | |
printf("Erro na criação do arquivo\n"); | |
else | |
fscanf(letrar,"%s", letra_repetida); | |
fclose(letrar); | |
arquivo = fopen(nome_arquivo, "r");//abre o arquivo para leitura | |
if(arquivo == NULL)//Caso o arquivo nao consiga ser carregado | |
printf("<H3>ERRO NA LEITURA DO ARQUIVO<H3>\n");//Printa mensagem de erro caso o diretorio nao existir ou nao for encontrado | |
// | |
else | |
{ | |
fscanf(arquivo, "%s", palavra_digitada); | |
fscanf(arquivo, "%d", &count); | |
fscanf(arquivo, "%d", &tamanho); | |
fscanf(arquivo, "%s", palavra_final); | |
fscanf(arquivo, "%d",&contadorerros); | |
/*Assim como na linha 121 se trata de um arquivo externo entao devemos usar o fscanf | |
e determinar o arquivo de onde sera lido os dados*/ | |
} | |
fclose(arquivo);//fecha o arquivo | |
//-----------------------------------------------------Verificacao dos dados----------------------------------------------------------------------------------- | |
letra_repetida[count] = letraf; | |
acerto = 0;//seta variavel do acerto como valor falso | |
if(letraf >= 96 && letraf <= 123)//Verifica se a letra digitada eh maiuscula se nao for transforma ela. | |
letraf -= 32;//funcao para transformar em letra maiscula | |
for(i=0;i<tamanho;i++) | |
if(letraf == palavra_final[i])//verifica se o player acertou a palavra | |
{ | |
palavra_digitada[i] = palavra_final[i]; | |
acerto = 1; | |
} | |
if(acerto == 0) | |
contadorerros += 1; | |
if(vvitoria(palavra_digitada) == 0)//caso a palavra_digitada estiver completa retorna que o player venceu | |
venceu = 1; | |
letrar = fopen(nome_arquivo1, "w");//criara o arquivo que ira armazenar a letrar da palavra atual | |
if(letrar == NULL) | |
printf("Erro na criação do arquivo\n"); | |
else | |
fprintf(letrar,"%s", palavra_digitada); | |
fclose(letrar); | |
count++; | |
//-----------------------------------------------Sobreposicao do arquivo com os dados atulizados-------------------------------------------------------------- | |
arquivo = fopen(nome_arquivo, "w"); | |
if(arquivo == NULL) | |
printf("<H3>ERRO NA ATUALIZAÇÃO DOS DADOS<H3>\n");//Printa mensagem de erro caso o diretorio nao existir ou nao for encontrado | |
else//caso o arquivo tenha sido criado com sucesso | |
{ | |
fprintf(arquivo, "%s\n", palavra_digitada); | |
fprintf(arquivo, "%d\n", count); | |
fprintf(arquivo, "%d\n", tamanho); | |
fprintf(arquivo, "%s\n", palavra_final); | |
fprintf(arquivo, "%d\n", contadorerros); | |
/*Como se trata de um arquivo externo nao se pode printar somente com o printf sendo necessario o fprintf | |
para determinar o arquivo em que deve ser impresso os contadores*/ | |
} | |
fclose(arquivo); | |
//-------------------------------------------------Caso o player perca--------------------------------------------------------------------------------------- | |
if(contadorerros == MAX_erros)//caso o player chegue ao limite de erros | |
{ | |
printf("<head>\n");//incio do cabecalho | |
printf("<link href=\"forca.css\" rel=\"stylesheet\" type=\"text/css\"/>\n");//acesso ao css | |
printf("<body>\n");//define inicio do corpo de texto | |
printf("<img src=\"http://cap.dc.ufscar.br/~744347/6.jpg\" width=\"400\" height=\"300\">\n");//printa a imagem do personagem enforcado | |
printf("<H3>Voce Perdeu! </H3>\n");//informa que o player perdeu | |
printf("<H2>A palavra certa era: </H2>\n");//informa a palavra certa | |
for(i=0;i<tamanho;i++)//imprime letra a palavra a palavra | |
printf("%c", palavra_final[i]); | |
printf("</H2>\n");//fecha o formato de titulo | |
printf("</body>\n");//encerra o corpo do texto | |
printf("</head>\n"); | |
} | |
else | |
{ | |
//----------------------------------------------------Caso o player venca-------------------------------------------------------------------------------------- | |
if(venceu == 1)//Caso o player venca eh emitida a mensagem a ele da vitoria | |
{ | |
printf("<head>\n"); | |
printf("<link href=\"forca.css\" rel=\"stylesheet\" type=\"text/css\"/>\n");//acesso ao css | |
printf("<body>");//define inicio do corpo de texto | |
printf("<img src=\"http://cap.dc.ufscar.br/~744347/7.jpg\" width=\"400\" height=\"300\">\n");//printa a imagem do salvo | |
printf("<H1>VOCÊ GANHOU</H1>\n");//informa o player da vitoria | |
printf("</body>\n");//encerra o corpo do texto | |
printf("</head>\n"); | |
} | |
else | |
{ | |
//---------------------------------------------------Corpo html------------------------------------------------------------------------------------------------ | |
printf("<head>\n"); | |
printf("<link href=\"forca.css\" rel=\"stylesheet\" type=\"text/css\"/>\n");//acesso ao css | |
printf("<body>\n");//inicia o corpo no html | |
printf("<H1>Jogo da Forca</H1>\n"); | |
printf("<img src=\"http://cap.dc.ufscar.br/~744347/%d.jpg\" width=\"400\" height=\"300\">\n", contadorerros);//printa a imagem inicial da forca | |
printf("<form action=\"http://cap.dc.ufscar.br/~744347/cgi-bin/forca.cgi\">\n");//Linka o endereco de acesso nao remoto | |
printf("<br>\n"); | |
for(i=0;i<tamanho;i++)//imprime letra a palavra a palavra | |
printf(" %c", palavra_digitada[i]); | |
printf("<br>\n"); | |
for(i=1;i<'\n';i++) | |
printf(" %c", letra_repetida[i]); | |
printf("<br>\n"); | |
printf("<input type=\"text\" name=\"letra\" maxlength=\"1\">\n");//cria a area que sera digitada o input da letra a ser testada | |
printf("<input type=\"hidden\" name=\"nivel\" value=\"1\">\n");//cria um campo de submissao invisivel e seta o valor inicial como 1 | |
printf("<input type=\"hidden\" name=\"nome\" value=\"%s\">\n", palavra_final);//cria um campo de submissao invisivel e seta o valor inicial como o nome do jogador | |
printf("<input type=\"submit\" value=\"enviar\">\n");//cria o botao de enviar os dados | |
printf("</form>\n");//fim do formulario | |
printf("</body>\n");//fim do corpo | |
printf("</head>\n"); | |
//----------------------------------------------------------Fim html------------------------------------------------------------------------------------------- | |
} | |
} | |
} | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment