Aulas de C

Started by _Dr4k0_, 08 de June , 2006, 09:31:09 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

_Dr4k0_

Pessoal aqui vai o código fonte de um joguinho da cobra em c.
Olha: lembra das dicas que eu passei? Então eu coloquei elas dentro de um cabeçalho(Crie um biblioteca .h!) com elas dentro chamada funçoes.h vocês irão perceber. Basta apenas pegar as dicas colocar e salvar como funçoes.h

Abraços,


#include
#include
#include
#include
#include "funcoes.h"

#define CODCORPO 178
#define CODBORDA 219

struct scobra {
short col, lin;
};

struct salimento {
short col, lin, valor;
};

struct srecorde {
char nome[11];
short pontos;
};

FILE *parq;
short tamcobra;

//Protótipos dos procedimentos e funções
void desenha_borda();
void espera(short tempo);
void gera_alimento(salimento *al);
void escreve_alimento(salimento al);
void desenha_cobra(scobra cobra[]);
bool colidiu(scobra cobra[]);
void fim_jogo(short pontos);

main() {
short aumento, i, pontos, tespera, smcol, smlin;
char tc;
bool turbo;
scobra c[500];
salimento alim;
srecorde r;

//Verifica se o arquivo de recordes existe antes de criá-lo
parq = fopen("rec.dat", "rb");
if (parq == NULL) {
parq = fopen("rec.dat", "wb");
r.pontos = 0;
strcpy(r.nome, "nononono");
fwrite(&r, sizeof(r), 1, parq); //escreve o recorde no arquivo
}
fclose(parq);
SetCursorPos(1, 1);
srand(time(NULL));
cursor_off();
do {
c[0].col = 20;
c[0].lin = 12;
c[1].col = 19;
c[1].lin = 12;
tamcobra = 1;
aumento = 0;
smcol = 1;
smlin = 0;
pontos = 0;
tespera = 100;
turbo = false;
clrscr();
textcolor(WHITE);
gotoxy(24, 11);
printf("Controles: SETAS | Sair: ESC");
gotoxy(21, 13);
printf("Pressione ENTER para iniciar o jogo...");
do {
tc = getch();
if (tc == 27)
exit(0);
} while (tc != 13);
clrscr();
desenha_borda();
gera_alimento(&alim);
textcolor(WHITE);
gotoxy(3, 25);
printf("Pontos: 0");
parq = fopen("rec.dat", "rb"); //abre o arquivo para leitura
fread(&r, sizeof(r), 1, parq); //lê o nome e os pontos do recordista
fclose(parq);
gotoxy(55, 25);
printf("Recorde: %d [%s]", r.pontos, r.nome);
while (tc != 27) {
if (turbo) //Verifica se está em alta velocidade
espera(20);
else
espera(tespera);

escreve_alimento(alim);
desenha_cobra(c);
if (kbhit()) { //Verifica se uma tecla foi pressionada
tc = getch();
if (tc == -32)
tc = getch();
switch (tc) {
case 72: //Seta para cima
smcol = 0;
smlin = -1;
break;
case 80: //Seta para baixo
smcol = 0;
smlin = 1;
break;
case 75: //Seta para esquerda
smcol = -1;
smlin = 0;
break;
case 77: //Seta para direita
smcol = 1;
smlin = 0;
break;
case 32: //Espaço para ligar/desligar o turbo
turbo = !turbo;
} //fim switch
} //fim if

//Verifica colisão
if (colidiu(c)) { //Se a função colidiu retornar true o jogo terminou
fim_jogo(pontos);
break;
}

//Verifica se a cobra pegou um número (alimento)
if (c[0].col == alim.col && c[0].lin == alim.lin) {
pontos += alim.valor;
textcolor(WHITE);
gotoxy(3, 25);
printf("Pontos: %d", pontos);
for (i = 400; i < 550; i+=15)
Beep(i, 1);
aumento += alim.valor;
tespera -= 2;
gera_alimento(&alim);
}

//Aumenta o tamanho da cobra
if (aumento > 0) {
tamcobra++;
aumento--;
}

//Movimenta as partes da cobra
for (i = tamcobra; i >= 1; i--)
c = c[i - 1];
c[0].col = c[0].col + smcol;
c[0].lin = c[0].lin + smlin;

//Verifica se está passando por uma das 4 passagens laterais
if (c[0].col == 81 && c[0].lin == 12)
c[0].col = 1;
else if (c[0].col == 0 && c[0].lin == 12)
c[0].col = 80;
else if (c[0].lin == 0 && c[0].col == 40)
c[0].lin = 24;
else if (c[0].lin == 25 && c[0].col == 40)
c[0].lin = 1;

} //fim while
} while (true);
}

//
// Desenha as bordas da área de movimento da cobra
//
void desenha_borda() {
int i;

textcolor(LIGHTRED);
for (i = 1; i <= 80; i++) {
gotoxy(i, 1);
printf("%c", CODBORDA);
gotoxy(i, 24);
printf("%c", CODBORDA);
}
for (i = 1; i <= 24; i++) {
gotoxy(1, i);
printf("%c", CODBORDA);
gotoxy(80, i);
printf("%c", CODBORDA);
}
gotoxy(1, 12);
printf(" ");
gotoxy(80, 12);
printf(" ");
gotoxy(40, 1);
printf(" ");
gotoxy(40, 24);
printf(" ");
}

//
//Paralisa o programa por um determinado tempo (milesegundos)
//
void espera(short tempo) {
long t;

t = clock();
while (clock() <= t + tempo);
}

//
//Procedimento para gerar o alimento
//
void gera_alimento(salimento *al) {
al->col = rand() % 78 + 2;
al->lin = rand() % 22 + 2;
al->valor = rand() % 9 + 1;
}

//
//Verifica se a cobra colidiu com as bordas ou contra o próprio corpo
//Retorna: false (não colidiu) ou true (colidiu)
//
bool colidiu(scobra cobra[]) {
int i;
bool R = false;

//Verifica se colidiu com as bordas
if (((cobra[0].col < 2 || cobra[0].col > 79) && cobra[0].lin != 12) ||
((cobra[0].lin < 2 || cobra[0].lin > 23) && cobra[0].col != 40)) {
R = true;
} else //Verifica se colidiu com o próprio corpo
for (i = 1; i <= tamcobra - 1; i++)
if (cobra[0].col == cobra.col && cobra[0].lin == cobra.lin) {
R = true;
break;
}
return R;
}

void escreve_alimento(salimento al) {
textcolor(LIGHTCYAN);
gotoxy(al.col, al.lin);
printf("%d", al.valor);
}

//
//Desenha a cobra na tela
//
void desenha_cobra(scobra cobra[]) {
int i;

//Escreve o corpo da cobra
textcolor(LIGHTGREEN);
for (i = 1; i <= tamcobra - 1; i++) {
gotoxy(cobra.col, cobra.lin);
printf("%c", CODCORPO);
}
//Escreve a cabeça separadamente
textcolor(YELLOW);
gotoxy(cobra[0].col, cobra[0].lin);
printf("%c", CODCORPO);
//Escreve o espaço vazio no final para apagar o rastro
gotoxy(cobra[tamcobra].col, cobra[tamcobra].lin);
printf(" ");
}

//
//Escreve a msg de fim de jogo e grava o recorde
//
void fim_jogo(short pontos) {
srecorde r;
int i;

textcolor(WHITE);
gotoxy(35, 12);
printf("FIM DE JOGO");
for (i = 5000; i > 50; i-=25)
Beep(i, 1);
gotoxy(28, 13);
printf("Pressione qualquer tecla...");
getch();
parq = fopen("rec.dat", "rb"); //abre o arquivo para leitura
fread(&r, sizeof(r), 1, parq);
fclose(parq);
if (pontos > r.pontos) {
cursor_on();
do {
clrscr();
printf("Novo recorde!!!\n\n");
printf("Digite seu Nome (10 letras): ");
gets(r.nome);
} while (strlen(r.nome) > 10);
r.pontos = pontos;
parq = fopen("rec.dat", "wb"); //abre o arquivo para escrita
fwrite(&r, sizeof(r), 1, parq);
fclose(parq);
cursor_off();
}
}
100% Livre!!!Livre para escolher o que há de melhor no Windows e Linux. Livre de preconceito direto ou inverso!
Adote essa filosofia e tenha mais chance de sucesso profissional.

Ðark$pawn

Bom material... Mas, na minha opinião, não havia necessidade de tantos posts... Isso deveria ser feito apenas se a quantidade máxima de caracteres do post fosse excedida!!! ;)

rodweb

msm assim, bons post's*  ;)

_Dr4k0_

Quote from: "DarkSpawn"Bom material... Mas, na minha opinião, não havia necessidade de tantos posts... Isso deveria ser feito apenas se a quantidade máxima de caracteres do post fosse excedida!!! ;)

é por que as aulas o mkswd foi mi passando de pouco em pouco e não tdo de uma vez ai fui juntando os txt's e fui colocano kda txt em um.. pra não cortar aulas no meio etc..
100% Livre!!!Livre para escolher o que há de melhor no Windows e Linux. Livre de preconceito direto ou inverso!
Adote essa filosofia e tenha mais chance de sucesso profissional.

_Dr4k0_

Puts pessoal mi desculpem..

http://www.darkers.com.br/smf/index.php ... 421.0.html

não tinha visto que o Deamon Cheat já tinha começado a postar as aulas..

foi mal ae Deamon

se algum modera ou adm puder excluir o dele pq o meu eu já coloquei todas as aulas..
100% Livre!!!Livre para escolher o que há de melhor no Windows e Linux. Livre de preconceito direto ou inverso!
Adote essa filosofia e tenha mais chance de sucesso profissional.