Tutoriais

Programar o jogo da cobrinha

Essa página apresenta conceitos de programação com a linguagem C

Compilador

O software gerado por esse tutorial pode ser compilado a partir do Dev-C++ ou similares.

Base do código

Digitar o código
int main(void){
	return 0;
}
E salvar como 'snake.cpp'

Desenhar caracteres na tela

Incluir
#include<stdio.h>
no início do arquivo.

Incluir
printf("%c",1);
dentro da função main.

Se compilar e executar ainda não dá para ver nada porque o programa executa e fecha muito rápido.

Vamos por uma pausa:
#include<conio.h>
(depois da declaração da biblioteca stdio)
getch();
(depois do printf)

Caracter posição meio da tela

Para desenhar no meio da tela é preciso incluir a biblioteca windows.h

E antes do printf:
COORD p={10,10};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),p);
Essa linha coloca o cursor na décima coluna da décima linha
Eu acho que esse código que permite colocar texto no meio da tela merece ser difundido.

void mgotoxy(int x,int y){
	COORD p={x,y};
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),p);
}
O Código até aqui fica
#include<windows.h>
#include<stdio.h>
#include<conio.h>
void mgotoxy(int x,int y){
	COORD p={x,y};
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),p);
}
int main(void){
	mgotoxy(7,7);
	printf("%c",1);
	getch();
	return 0;
}

Paredes do jogo

Vamos declarar uma variavel int x e usar um 'for' para desenhar cada uma das quatro paredes
int x;
for(x=0;x<18;x++){
	mgotoxy(0,x);
	printf("%c",219);
}
for(x=0;x<26;x++){
	mgotoxy(x,0);
	printf("%c",219);
}
for(x=0;x<18;x++){
	mgotoxy(26,x);
	printf("%c",219);
}
for(x=0;x<27;x++){
	mgotoxy(x,18);
	printf("%c",219);
}

Movimentando letras no prompt

for(x=2;x<26;x++){
	mgotoxy(x-1,8);
	printf(" ");
	mgotoxy(x,8);
	printf("%c",219);
	Sleep(200);
}

Dirigindo o objeto

Vamos dar direção a esse ponto, de acordo com o teclado
Vamos declarar uma variavel int 'direcao'
Se direcao==0 entao o ponto se move para a esquerda
Se direcao==1 entao o ponto se move para a cima
Se direcao==2 entao o ponto se move para a direita
Se direcao==3 entao o ponto se move para a baixo
vamos inicializar com 2

Vamos criar as variaveis int cx e cy que vão armazenar a coordenada do ponto

Vamos criar uma variavel char tecla

E vamos substituir aquele for por dois while. Na condição do segundo while vamos usar a função kbhit()
#include<windows.h>
#include<stdio.h>
#include<conio.h>
void mgotoxy(int x,int y){
	COORD p={x,y};
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),p);
}
int main(void){
	int x,direcao=2,cx=0,cy=7;
	char tecla='a';
	for(x=0;x<18;x++){
		mgotoxy(0,x);
		printf("%c",219);
	}
	for(x=0;x<26;x++){
		mgotoxy(x,0);
		printf("%c",219);
	}
	for(x=0;x<18;x++){
		mgotoxy(26,x);
		printf("%c",219);
	}
	for(x=0;x<27;x++){
		mgotoxy(x,18);
		printf("%c",219);
	}
	while(tecla!='s'){
		while(tecla!='s'&&!(tecla=kbhit())){
			if(direcao==0)cx--;
			if(direcao==1)cy--;
			if(direcao==2)cx++;
			if(direcao==3)cy++;
			mgotoxy(cx,cy);
			printf("%c",219);
			Sleep(200);
			if(cy==0||cy==18||cx==0||cx==26)tecla='s';
		}
		if(tecla!='s')tecla=getch();
		if(tecla=='K')direcao=0;
		if(tecla=='H')direcao=1;
		if(tecla=='M')direcao=2;
		if(tecla=='P')direcao=3;
		if(cy==0||cy==18||cx==0||cx==26)tecla='s';
	}
	getch();
	return 0;
}
Ralei um pouco pra achar e entender a função kbhit(). Agora disponibilizo aqui um exemplo de como utilizá-la. Ela é importante.

Apagar o rastro da cobra

Vamos transformar cx e cy em arrays, assim agente pinta o primeiro elemento e apaga o ultimo.

Vamos criar uma variavel int tamanho que armazena o tamanho da cobra, pra podermos apagar o fim da cobra qdo ela andar
#include<windows.h>
#include<stdio.h>
#include<conio.h>
void mgotoxy(int x,int y){
	COORD p={x,y};
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),p);
}
int main(void){
	int x,direcao=2,cx[300]={1,2},cy[300]={7,7},tamanho=1;
	char tecla='a';
	for(x=0;x<18;x++){
		mgotoxy(0,x);
		printf("%c",219);
	}
	for(x=0;x<26;x++){
		mgotoxy(x,0);
		printf("%c",219);
	}
	for(x=0;x<18;x++){
		mgotoxy(26,x);
		printf("%c",219);
	}
	for(x=0;x<27;x++){
		mgotoxy(x,18);
		printf("%c",219);
	}
	while(tecla!='s'){
		while(tecla!='s'&&!(tecla=kbhit())){
			for(x=tamanho;x>0;x--){
				cx[x]=cx[x-1];
				cy[x]=cy[x-1];
			}
			if(direcao==0)cx[0]--;
			if(direcao==1)cy[0]--;
			if(direcao==2)cx[0]++;
			if(direcao==3)cy[0]++;
			mgotoxy(cx[tamanho],cy[tamanho]);
			printf(" ");
			mgotoxy(cx[0],cy[0]);
			printf("%c",219);
			Sleep(200);
			if(cy[0]==0||cy[0]==18||cx[0]==0||cx[0]==26)tecla='s';
		}
		if(tecla!='s')tecla=getch();
		if(tecla=='K')direcao=0;
		if(tecla=='H')direcao=1;
		if(tecla=='M')direcao=2;
		if(tecla=='P')direcao=3;
		if(cy[0]==0||cy[0]==18||cx[0]==0||cx[0]==26)tecla='s';
	}
	getch();
	return 0;
}

A maçã

Vamos declarar duas variaveis int macax e macay que armazenam a coordenada da maçã no plano

É preciso incluir as bibliotecas iostream e a time.h
#include<time.h>
#include<iostream>
	srand(time(NULL));
	macax=(rand()%25)+1;
	macay=(rand()%17)+1;
Para desenhar a maçã:
mgotoxy(macax,macay);
printf("%c",1);

Deglutindo

Quando a cobra passa sobre a maçã ela deve aumentar de tamanho e outra maçã deve ser gerada
Entre as linhas que apagam o fim da cobra e as linhas que desenham a ponta, Digite:
if(macax==cx[0]&macay==cy[0]){
	tamanho++;
	macax=(rand()%25)+1;
	macay=(rand()%17)+1;
}

Game Over

Só falta fazer o fim do jogo:
Se a ponta da cobra estiver sobre ela mesma o jogo acaba
for(x=1;x<tamanho;x++){
	if(cx[0]==cx[x]&cy[0]==cy[x])tecla='s';
}

Código Fonte

#include<windows.h>
#include<stdio.h>
#include<conio.h>
#include<time.h>
//#include<stdlib.h>
#include<iostream>
void mgotoxy(int x,int y){
	COORD p={x,y};
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),p);
}
int main(void){
	int x,direcao=2,cx[300]={1,2},cy[300]={7,7},tamanho=1,macax,macay;
	char tecla='a';
	//system("MODE con cols=27 lines=20");
	for(x=0;x<18;x++){
		mgotoxy(0,x);
		printf("%c",219);
	}
	for(x=0;x<26;x++){
		mgotoxy(x,0);
		printf("%c",219);
	}
	for(x=0;x<18;x++){
		mgotoxy(26,x);
		printf("%c",219);
	}
	for(x=0;x<27;x++){
		mgotoxy(x,18);
		printf("%c",219);
	}
	srand(time(NULL));
	macax=(rand()%25)+1;
	macay=(rand()%17)+1;
	while(tecla!='s'){
		while(tecla!='s'&&!(tecla=kbhit())){
			for(x=tamanho;x>0;x--){
				cx[x]=cx[x-1];
				cy[x]=cy[x-1];
			}
			if(direcao==0)cx[0]--;
			if(direcao==1)cy[0]--;
			if(direcao==2)cx[0]++;
			if(direcao==3)cy[0]++;
			mgotoxy(cx[tamanho],cy[tamanho]);
			printf(" ");
			if(macax==cx[0]&macay==cy[0]){
				tamanho++;
				macax=(rand()%25)+1;
				macay=(rand()%17)+1;
			}
			mgotoxy(cx[0],cy[0]);
			printf("%c",219);
			mgotoxy(macax,macay);
			printf("%c",1);
			Sleep(200);
			for(x=1;x<tamanho;x++){
				if(cx[0]==cx[x]&cy[0]==cy[x])tecla='s';
			}
			if(cy[0]==0||cy[0]==18||cx[0]==0||cx[0]==26)tecla='s';
		}
		if(tecla!='s')tecla=getch();
		if(tecla=='K')direcao=0;
		if(tecla=='H')direcao=1;
		if(tecla=='M')direcao=2;
		if(tecla=='P')direcao=3;
		if(cy[0]==0||cy[0]==18||cx[0]==0||cx[0]==26)tecla='s';
	}
	getch();
	return 0;
}