Skip to content

Instantly share code, notes, and snippets.

@Mathsellas
Last active July 23, 2017 01:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Mathsellas/9d1da30b763132a8389070ccb30ebf1a to your computer and use it in GitHub Desktop.
Save Mathsellas/9d1da30b763132a8389070ccb30ebf1a to your computer and use it in GitHub Desktop.
Jogo da forca em c, com implementação em cgi
#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