Tutorial Como programar um jogo em C

Passo 1

Abrir o Dev-C++ ou Code::Blocks e Criar um novo arquivo (Ctrl+N)

Passo 2

Digitar o código
main()
{
}
E salvar como 'snake.cpp'

Passo 3

Compilar e executar (F9)

Passo 4

Vamos começar a desenhar na tela
Digite
printf("%c",1);
dentro da função main.
Se você executar dará erro pois a função printf está declarada na biblioteca stdio.h
Vamos incluir
#include<stdio.h>
no início do arquivo.
E salvar e compilar e executar.
Ainda não deu pra ver nada porque o programa executou e fechou muito rápido.
Vamos por uma pausa.
Digite
getch();
depois do printf
E digite
#include<conio.h>
depois da declaração da biblioteca stdio
O Código até aqui fica:
#include<stdio.h>
#include<conio.h>
main()
{	printf("%c",1);
	getch();
}
Pode salvar, compilar e executar (F9)
Esse é o começo da codificação do jogo

Passo 5

Vamos desenhar no meio da tela
Pra isso inclua a biblioteca windows.h
E antes do printf digite
COORD p={10,10};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),p);
Essa linha coloca o cursor na décima coluna da décima linha
Eu ralei um pouco pra chegar até essa linha... antigamente eu usava a função gotoxy mas ela não é disponível para todos windows
Vamos criar a função mgotoxy
void mgotoxy(int x,int y)
{	COORD p={x,y};
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),p);
}
E vamos chamar a função antes do printf
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);
}
main()
{	mgotoxy(7,7);
	printf("%c",1);
	getch();
}

Passo 6

Vamos desenhar as 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);
}

Passo 7

Vamos começar a movimentar
for(x=2;x<26;x++)
{	mgotoxy(x-1,8);
	printf(" ");
	mgotoxy(x,8);
	printf("%c",219);
	Sleep(500);
}

Passo 8

Já temos um ponto se movendo na tela
Vamos dar direção a esse ponto, de acordo com o teclado
Vamos declarar uma variavel int 'd'
Se d==0 entao o ponto se move para a esquerda
Se d==1 entao o ponto se move para a cima
Se d==2 entao o ponto se move para a direita
Se d==3 entao o ponto se move para a baixo
vamos inicializar d 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);
}
main()
{   int x,d=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(d==0)cx--;
            if(d==1)cy--;
            if(d==2)cx++;
            if(d==3)cy++;
            mgotoxy(cx,cy);
            printf("%c",219);
            Sleep(500);
            if(cy==0||cy==18||cx==0||cx==26)tecla='s';
        }
        if(tecla!='s')tecla=getch();
        if(tecla=='K')d=0;
        if(tecla=='H')d=1;
        if(tecla=='M')d=2;
        if(tecla=='P')d=3;
        if(cy==0||cy==18||cx==0||cx==26)tecla='s';
    }
    getch();
}
Ralei um pouco pra achar e entender a função kbhit(). Agora disponibilizo a utilização dela aqui.

Passo 9

Vamos 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 t 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);
}
main()
{   int x,d=2,cx[300]={1,2},cy[300]={7,7},t=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=t;x>0;x--)
            {   cx[x]=cx[x-1];
                cy[x]=cy[x-1];
            }
            if(d==0)cx[0]--;
            if(d==1)cy[0]--;
            if(d==2)cx[0]++;
            if(d==3)cy[0]++;
            mgotoxy(cx[t],cy[t]);
            printf(" ");
            mgotoxy(cx[0],cy[0]);
            printf("%c",219);
            Sleep(500);
            if(cy[0]==0||cy[0]==18||cx[0]==0||cx[0]==26)tecla='s';
        }
        if(tecla!='s')tecla=getch();
        if(tecla=='K')d=0;
        if(tecla=='H')d=1;
        if(tecla=='M')d=2;
        if(tecla=='P')d=3;
        if(cy[0]==0||cy[0]==18||cx[0]==0||cx[0]==26)tecla='s';
    }
    getch();
}
Agora vamos gerar e desenhar a maçã
Vamos declarar duas variaveis int mx e my
Vamos incluir a biblioteca iostream e a time.h
e para gerar a maçã em um ponto aleatório:
#include<time.h>
#include<iostream>
    srand(time(NULL));
    mx=(rand()%25)+1;
    my=(rand()%17)+1;
Para desenhar a maçã digite
mgotoxy(mx,my);
printf("%c",1);
depois do printf da ponta

Passo 10

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(mx==cx[0]&&my==cy[0])
{	t++;
	mx=(rand()%25)+1;
	my=(rand()%17)+1;
}

Passo 11

Falta fazer o fim do jogo:
Se a ponta da cobra estiver sobre ela mesma o jogo acaba
for(x=1;x<t;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);
}
main()
{   int x,d=2,cx[300]={1,2},cy[300]={7,7},t=1,mx,my;
    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));
    mx=(rand()%25)+1;
    my=(rand()%17)+1;
    while(tecla!='s')
    {   while(tecla!='s'&&!(tecla=kbhit()))
        {   for(x=t;x>0;x--)
            {   cx[x]=cx[x-1];
                cy[x]=cy[x-1];
            }
            if(d==0)cx[0]--;
            if(d==1)cy[0]--;
            if(d==2)cx[0]++;
            if(d==3)cy[0]++;
            mgotoxy(cx[t],cy[t]);
            printf(" ");
            if(mx==cx[0]&&my==cy[0])
            {   t++;
                mx=(rand()%25)+1;
                my=(rand()%17)+1;
            }
            mgotoxy(cx[0],cy[0]);
            printf("%c",219);
            mgotoxy(mx,my);
            printf("%c",1);
            Sleep(500);
            for(x=1;x<t;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')d=0;
        if(tecla=='H')d=1;
        if(tecla=='M')d=2;
        if(tecla=='P')d=3;
        if(cy[0]==0||cy[0]==18||cx[0]==0||cx[0]==26)tecla='s';
    }
    getch();
}

Executáveis

cobra.exe - Executável básico resultante desse tutorial
snakeGF.exe - Executável gerado pelo Gustavo Fabro que seguiu esse tutorial e depois implementou algumas melhorias
snakeJC.exe - Executável gerado pelo João Castro que seguiu esse tutorial e depois implementou algumas melhorias

Se você quiser divulgar sua versão aqui mande um email com o código-fonte para schio.rodrigo@gmail.com

Voltar para a página com links para outros Tutoriais

http://www.mminhaaplicgea.appspot.com/index.php?mdl=122

Comentar (Facebook)