Last active
July 22, 2017 14:41
-
-
Save Mathsellas/601ac852a2c5dffaa010ecc34ca0f5a6 to your computer and use it in GitHub Desktop.
Forca c
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 26 | |
#define MAX_erros 6 | |
//------------------------------------------Cacar caracters em uma string------------------------------------------------------------------------------------- | |
int vvitoria(char vetor[]) | |
{ | |
int i, retorno = 0; | |
for(i=0;i<strlen(vetor);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() | |
{ | |
setlocale(LC_ALL, "Portuguese");//acrescenta a acentuacao ABNT no codigo | |
int nivel, 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;//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];//armazenara as letras repetidas pelo usuário | |
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; | |
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 = atoi(nivel_atual);//transforma a string em um numero | |
} | |
else | |
nivel = 0;//se der erro reseta o nivel | |
leitor = strstr(ldados,"nome=");//assim como o da linha 43 sera usado para armazenar o nome | |
if(leitor != NULL) | |
{ | |
leitor += 5;//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 | |
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; | |
} | |
else | |
letraf = '@'; | |
if(nivel == 0)//Caso for a primeira vez que o pragrama cgi rode | |
{ | |
memset(palavra_digitada, '\0', MAX_letras); | |
limpar_vetor(palavra_digitada, strlen(palavra_final)); | |
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 | |
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 | |
maiuscular_palavra(palavra_final); | |
printf("%s\n", palavra_final); | |
letra_repetida[count] = letraf; | |
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", palavra_digitada); | |
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 | |
{ | |
palavra_digitada[strlen(palavra_digitada)] = '\0'; | |
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", palavra_digitada); | |
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 | |
letra_repetida[count] = letraf; | |
acerto = 0;//seta variavel do acerto como valor falso | |
sscanf(ldados,"letraf=%c", &letraf);//transforma o dado lido em um caracter e armazena no vetor dedicado a isso | |
printf("%c\n", letraf); | |
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++; | |
arquivo = fopen(nome_arquivo, "w");//sobrepoe o arquivo que ja existe com os dados atualizados | |
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); | |
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: %s</H2>\n", palavra_final);//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 | |
{ | |
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 | |
{ | |
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"); | |
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=\"submit\">\n");//cria o botao de enviar os dados | |
printf("</form>\n");//fim do formulario | |
printf("</body>\n");//fim do corpo | |
printf("</head>\n"); | |
} | |
} | |
} | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment