Skip to content

Instantly share code, notes, and snippets.

@Mathsellas
Last active July 22, 2017 14:41
Show Gist options
  • Save Mathsellas/601ac852a2c5dffaa010ecc34ca0f5a6 to your computer and use it in GitHub Desktop.
Save Mathsellas/601ac852a2c5dffaa010ecc34ca0f5a6 to your computer and use it in GitHub Desktop.
Forca c
#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