terça-feira, 22 de fevereiro de 2011

Forca em C

Aí o código fonte do projeto Forca em C, procurei comentar tudo para que pudessem entender.
É um jogo que utiliza os recursos da bilbioteca graphics.h, bem simples mas bem didático e até
divertido. Aproveitem! O executável pra jogar se encontra no link abaixo.

Baixe tudo aqui: http://www.4shared.com/file/e5I61g_L/Forca.html

Fonte:

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<graphics.h>

/*
Nome do Programa: Forca em C
Autor: Fernando Vieira
Co-Autores:
Testes: Luiza Allen
Blog: http://fgaexplica.blogspot.com
Aluno da UNB - Gama, DF
Comentário: O jogo é para facilitar o aprendizado da biblioteca graphics.h, se divirtam e alterem
como quiser! Dúvidas entrem no blog.
*/


//funções utilizadas

void fillrectangle(int x, int y, int width, int heigth) //criei pra facilitar o uso da bar
{
     bar(x, y, x+width, y+heigth);   //bar pegava x e y inicial e x e y final, aqui o final vem com a soma da largura e altura
}

void preencher(char letra, int pos)  //preenchendo os espaços
{   
      //coordenadas do primeiro espaço
      char texto[1];   //string que receberá o texto a ser escrito na tela
     
      //a string recebe a letra e o caracter \0 que define o final de uma string
      texto[0]=letra;
      texto[1]='\0';
     
      outtextxy((65+20/2)+30*pos, 135-1, texto);    //pos é a posição e identifica em qual dos espaços será escrita a letra
}

void desenha_parte(int erros)     //pega o número do erro cometido e desenha parte correspondente
{
     switch(erros)
     {
                  case 1: fillellipse(88+2, 30+20+10, 10, 10);  //cabeça
                          break;
                  case 2: moveto(80+2+10, 30+20+10+10);         //corpo
                          linerel(0, 35);
                          break;                 
                  case 3: moveto(80+2+10-1, 30+20+10+10+5);     //braço à direita
                          linerel(-15, 10);
                          break;                                           
                  case 4: moveto(80+2+10+1, 30+20+10+10+5);     //braço à esquerda
                          linerel(15, 10);
                          break;         
                  case 5: moveto(80+2+10, 30+20+10+10+35);      //perna à direita
                          linerel(-10, 25);
                          break;                                                                                                        
                  case 6: moveto(80+2+10, 30+20+10+10+35);      //perna à esquerda
                          linerel(10, 25);
                          break;                                                                          
                  default:
                          break;       
     }
}


//main

  int driver, mode, key=0;
  int j,i, x, y, largura, altura, erros, acertos;
  char *palavra, palavra2[50], *dica, dica2[50], letra, *palavras[50], *dicas[50];
  bool acabou=false;

  int main()
  {
      initwindow(600,400);

      printf("Digite 0 para jogar sozinho ou 1 para jogar com duas pessoas: ");     
      scanf("%d",&j);
      getchar();     //tava capturando algo desnecessário, coloquei aí para pegar
    
      if(j!=1)
      {
            //jogar de um      
            palavras[0]="abacaxi";
            dicas[0]="fruta";
            palavras[1]="banana";
            dicas[1]="fruta";           
            palavras[2]="ronaldo";
            dicas[2]="jogador";           
            palavras[3]="neymar";
            dicas[3]="jogador";                       
            palavras[4]="difícil";
            dicas[4]="???";                       
            palavras[5]="lapiseira";     
            dicas[5]="objeto";                       
            palavras[6]="bola";           
            dicas[6]="objeto";                                   
            palavras[7]="computador";               
            dicas[7]="objeto";                                     
            palavras[8]="escrivaninha";     
            dicas[8]="objeto";                                   
            palavras[9]="golfe";     
            dicas[9]="esporte";                                   
            palavras[10]="futebol";
            dicas[10]="esporte";                                               
            palavras[11]="porco";            
            dicas[11]="animal";                                               
            palavras[12]="touro";     
            dicas[12]="esporte";                                               
            palavras[13]="cavalo";     
            dicas[13]="esporte";                                               
           
            srand(time(NULL));          //definindo o número aleatório pela hora atual do sistema
            i=rand()%14;                //pegando um número de 0 à 13
            palavra=palavras[i];
            dica=dicas[i];
      }
      else
      {
            printf("Digite a palavra: ");
            gets(palavra2);            //tô passando para uma string de tamanho limitado porque não estava lendo direto...
            palavra=palavra2;
           
            printf("Digite a dica: "); 
            gets(dica2);
            dica=dica2;                //tô passando para uma string de tamanho limitado porque não estava lendo direto...
      }
     
      system("cls");
     
      outtextxy(50,10,"Forca");
     
      //colocando a dica na tela
      outtextxy(130,10,dica);          //mostrando a dica
     
      //desenhando a forca
      x=20;
      y=150;
      largura=40;
      altura=5;
     
      fillrectangle(x, y, largura, altura);       
      fillrectangle(x=x+18, y, 5, -120);      //x=38
      fillrectangle(x, y=y-120, 50, 5);       //y=30
      fillrectangle(x=x+50, y, 5, 20);        //x=88

      //desenhando espaços para letras
      x=65;
      y=150;
      largura=25;
      altura=5;
           
      for(i=0; i < strlen(palavra); i++)
      {
       fillrectangle(x+30*i, y, largura, altura);        //cada uma está separada por 30 pixels no eixo x (horizontalmente)           
      }
     
      while(!acabou)         //enquanto não tiver alcançado uma condição para acabar (ganhar ou perder)
      {
       bool acerto=false;                   //variável que informa se houve acerto com a letra escolhida
       printf("Escolha uma letra: ");
       letra = getchar();                   //pegando a letra
       for(i=0; i < strlen(palavra); i++)   //verificação letra a letra
       {
              if(palavra[i]==letra)  //verificando se a letra escolhida é igual a alguma da palavra
              {
               preencher(letra, i);  //preenchendo a letra na posição
               acertos++;            //acumulando os acertos, letras que já foram descobertas
               acerto=true;          //quer dizer que a letra escolhida aparece na palavra
              }
              if(strlen(palavra)-1==i && !acerto) //na última letra se não teve nenhum acerto
              {
               erros++;               //acumula o número de errros
               desenha_parte(erros);  //desenha a parte correspondente ao erro
              }
       }
       getchar();                     //tava capturando algo desnecessário, coloquei aí para pegar
       if(erros==6){acabou=true; cleardevice(); outtextxy(50,50,"Enforcado! MUAHAHAHAHAHA"); outtextxy(50,70, palavra);}
       if(acertos==strlen(palavra)){acabou=true; cleardevice(); outtextxy(50,50,"Você venceu... Como pôde??? AHHHHHHHH!");}
      }

      system("pause");     //esperando o pressionamento de uma tecla qualquer pelo usuário
      closegraph();        //fechando a tela da parte gráfica
      return 0;
  }

2 comentários:

  1. "Você venceu... Como pôde??? AHHHHHHHH!"

    Hahaha.
    O jogou compilou direitinho, o arquivo e as explicações ficaram bem detalhadas, muito bom.

    ResponderExcluir
  2. kkkkkkkkkk

    Obrigado Binha, que bom que gostou!
    Em breve sairão outras coisas legais
    em computação gráfica básica.

    Abração

    ResponderExcluir