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;
  }

sexta-feira, 18 de fevereiro de 2011

Entrada e Saída em C

Este post descreve superficialmente algumas das funções de "entrada" (input) e de "saída" (output) mais importantes da linguagem C. Todas estão na biblioteca stdio. Portanto, seu programa deve ter um #include <­stdio.h> para usar essas funções.

- printf

A função printf (print formatted) exibe na tela do monitor uma lista formatada de números, caracteres, strings, etc.

Sintaxe da função:

printf (string_de_controle,lista_de_argumentos);

Na string_de_controle teremos uma descrição de tudo que a função vai colocar na tela. Isto é feito usando-se os códigos de controle, que usam a notação %. Com isso, indicamos quais, de qual tipo e em que posição estão as variáveis a serem apresentadas.

Alguns dos códigos %:

Código

Significado

%d

Inteiro

%f

Float

%c

Caractere

%s

String

%%

Coloca na tela um %

Alguns exemplos de printf() e o que eles exibem:

printf ("Teste %% %%") Teste % %

printf ("%f",40.345) 40.345000

printf ("%2.2f",40.345) 40.34

printf ("Um caractere %c e um inteiro %d",'D',120) → Um caractere D e um inteiro 120

printf ("%s e um exemplo","Este") Este e um exemplo

printf ("%s%d%%","Juros de ",10) Juros de 10%

Códigos de Barra Invertida

Código

Significado

\b

Retrocesso (“backspace”)

\n

Nova linha (“new line”)

\t

Tabulação horizontal (“tab”)

\“

Aspas duplas

\‘

Aspas simples

\0

Nulo (0 em decimal)

\\

Barra invertida

\a

Sinal sonoro (“beep)

Exemplos:

printf ("Ola! Eu esto\bu vivo!"); Ola! Eu estu vivo!

printf ("Ola! Eu esto\nu vivo!"); Ola! Eu esto

u vivo!

printf ("Ola! Eu esto\tu vivo!"); Ola! Eu Esto u vivo!

printf ("\"Ola! Eu estou vivo! \""); "Ola! Eu estou vivo!"

printf ("Ola! Eu esto\0u vivo!"); Olá! Eu esto

printf (“\\Ola! Eu estou vivo!\\"); \Olá! Eu estou vivo!\


- scanf

A função scanf (scan format) lê do teclado e "formata" uma lista de números, caracteres, strings, etc.

Sintaxe da função:

scanf (string_de_controle,lista_de_argumentos);

Usando a função scanf() podemos pedir dados ao usuário. Devemos ficar atentos a fim de colocar o mesmo número de argumentos que o de códigos de controle na string de controle. Outra coisa importante é lembrar-se de colocar o & antes das variáveis da lista de argumentos.

Exemplo:

#include <­stdio.h>

int main ()

{

char Ch;

scanf("%c", &Ch);

printf ("Voce pressionou a tecla %c",Ch);

return(0);

}


- gets e getchar(),

Assim como scanf(), leem uma string do teclado.

getchar() lê apenas um caractere.

gets() lê uma string até o final da linha ou até que não haja mais dados para ler, e adiciona o terminador de string "\0".

Sintaxe da função get:

gets(nome_da_string);

Exemplo:

#include <­stdio.h>

int main ()

{

char exemplo[10];

printf ("Digite o seu nome: ");

gets (exemplo);

printf ("O nome é: %s", exemplo);

return(0);

}

O programa pede ao usuário que entre uma string, que será armazenada na string exemplo. A função retorna o próprio exemplo.
Gets
não é uma função segura, pois com essa função pode ocorrer um estouro da quantidade de posições que foi especificada na string. Por exemplo, se no código a cima o usuário digitar como entrada:

Ricardo Pereira Neto

Ou seja, digitar um total de 20 caracteres: 21 posições (incluindo o '\0' ) serão utilizadas para armazenar a string. Como a string exemplo[] só tem 10 caracteres, os 11 caracteres adicionais serão colocados na área de memória subsequente à ocupada por ela, escrevendo uma região de memória que não está reservada à string. Este efeito é conhecido como "estouro de buffer" e pode causar problemas imprevisíveis.

Sintaxe da função getchar:

variavel = getchar();

Esta função retorna o valor inteiro referente ao código ASCII do caractere lido, porém você pode atribuir este valor a uma variável do tipo caractere. Caso ocorra um erro, ela retorna EOF.

Exemplo da utilização de getchar:

#include <­std­io.h>

int main()

{

char caracter;

printf("\n");

printf("Utilizando getchar()\n");

printf("--------------------\n");

printf("\n");

printf("Entre com um caracter :");

caracter = getchar();

printf("\nVocê digitou o caracter %c\n\n",caracter);

return(0);

}

Fonte: Curso de Linguagem C - UFMG (com adaptações)

Link direto para Apostila: http://migre.me/3U6Yp