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