albero di Natale animato in C e graphics

L’albero di Natale di Yasb? L’abbiamo fatto in C/C++ e l’uso della libreria graphics facendolo diventare un albero di Natale animato. Ecco il risultato.

Albero C/C++ e graphics

Ebbene si, il vostro albero di Natale apparirà sul desktop esattamente come lo vedete in figura animazioni comprese.

Se volete compilare il codice dell’albero di Natale animato con dev-cpp dovete prima installare la libreria graphics seguendo la guida che trovate qui.

Codice del programma Albero di Natale animato

Ecco di seguito il codice suddiviso per funzioni.

#include <stdlib.h>
#include <iostream>
#include <graphics.h>
using namespace std;
void albero();
void palline();
void neve(int xy[]);
void finestra();
void camino();
void legno();
void fuoco(int xy[]);
void pavimento();
int main()
{
    int gd=DETECT,gm;
    initwindow(600,600);
    srand(time(NULL));
    int xy[2];  //xy[0] x neve --- xy[1]  y neve
    int f[2];   //f[0] x fuoco  ---- f[2] y fuoco
    while(1)
    {
            if(kbhit()==0)
            {
                cleardevice();
                pavimento();
                albero();
                finestra();
                camino();
                legno();
                fuoco(f);
                neve(xy);
                palline();
                delay(300);
            }
            else
                break;            
    }
     
    getch();
    closegraph();
}

void palline()
{    
     //PALLINE
     setcolor(WHITE);
     line(200,300,200,305);   //1
     circle(200,315,10);
     line(400,300,400,305);   //6
     circle(400,315,10);
     line(180,350,180,355);   //2
     circle(180,365,10);
     line(420,350,420,355);   //7
     circle(420,365,10);
     line(160,400,160,405);   //3
     circle(160,415,10);
     line(440,400,440,405);   //8
     circle(440,415,10);
     line(160,450,160,455);   //4
     circle(160,465,10);
     line(440,450,440,455);   //9
     circle(440,465,10);
     line(350,450,350,455);   //5
     circle(350,465,10);
     line(250,450,250,455);   //10
     circle(250,465,10);
     //COLORE
     setfillstyle(1,(rand()%16));  
     floodfill(200,315,WHITE);  //1
     floodfill(250,465,WHITE);  //10
     setfillstyle(1,(rand()%16));  
     floodfill(400,315,WHITE);  //6
     floodfill(350,465,WHITE);  //5
     setfillstyle(1,(rand()%16));  
     floodfill(180,365,WHITE);  //2
     floodfill(440,465,WHITE);  //9
     setfillstyle(1,(rand()%16));  
     floodfill(420,365,WHITE);  //7
     floodfill(160,465,WHITE);  //4
     setfillstyle(1,(rand()%16));  
     floodfill(160,415,WHITE);  //3
     floodfill(440,415,WHITE);  //8
     return;
}

void albero()
{    
     setcolor(BROWN);
     moveto(300,175);   //Stella
     lineto(285,185);  
     lineto(292,170);  
     lineto(280,165);  
     lineto(292,165);
     lineto(300,150);
     lineto(308,165);
     lineto(320,165);
     lineto(308,170);
     lineto(315,185);
     lineto(300,175);
     arc(355,270,75,115,125);  //scia
     arc(365,292,75,115,125);
     moveto(385,150);
     lineto(370,155);
     lineto(395,170);
     setfillstyle(1,YELLOW);      //Colora stella
     floodfill(300,165,BROWN);
     floodfill(375,165,BROWN);     //Colora scia
     

     setcolor(LIGHTGREEN);
     line(300,176,300,449);//Linea divisione
     moveto(300,175); //Parte sinistra
     lineto(200,300);
     lineto(250,280);
     lineto(180,350);
     lineto(250,310);
     lineto(160,400);
     lineto(250,360);
     lineto(160,450);
     lineto(440,450);
     moveto(300,175); //Parte destra
     lineto(400,300);
     lineto(350,280);
     lineto(420,350);
     lineto(350,310);
     lineto(440,400);
     lineto(350,360);
     lineto(440,450);
     setcolor(BROWN);
     moveto(280,510); //TRONCO
     lineto(280,451);
     lineto(320,451);
     lineto(320,510);
     arc(300,510,180,0,20);
     setfillstyle(3,LIGHTGREEN);  //Colora parte sinistra
     floodfill(290,400,LIGHTGREEN);
     setfillstyle(6,LIGHTGREEN);  //colora parte destra
     floodfill(310,400,LIGHTGREEN);  
     setfillstyle(9,BROWN);      //Colora tronco
     floodfill(290,460,BROWN);
     
     return;
}

void camino()
{
     setcolor(WHITE);
     rectangle(20,420,130,505);   //Telaio interno
     rectangle(15,415,135,505);   //Telaio esterno
     line(20,505,30,495);         //Bordo interno sinistro
     line(30,495,30,420);
     line(130,505,120,495);         //Bordo interno destro
     line(120,495,120,420);
     line(30,495,120,495);          //Linea bordo interno superiore
     line(20,504,130,504);          //Linea bordo interno superiore
     rectangle(10,505,140,509);   //Marmo
     setfillstyle(6,LIGHTGRAY);      //Colora bordo interno sinistro
     floodfill(22,422,WHITE);
     setfillstyle(3,LIGHTGRAY);      //Colora bordo interno destro
     floodfill(122,422,WHITE);
     setfillstyle(2,LIGHTGRAY);      //Colora bordo interno centrale
     floodfill(50,500,WHITE);
     setfillstyle(9,LIGHTGRAY);      //Colora telaio
     floodfill(17,425,WHITE);
     setfillstyle(9,LIGHTGRAY);      //Colora marmo
     floodfill(12,507,WHITE);
     return;
}

void legno()
{
     setcolor(BROWN);
     circle(47,495,7);
     arc(103,495,260,90,7);
     line(47,501,103,501);
     line(47,488,103,488);
     setfillstyle(9,BROWN);      //Colora tronco
     floodfill(47,495,BROWN);
     floodfill(70,495,BROWN);
     return;
}

void fuoco(int xy[])
{
     //movimento
     if(xy[0]==0)    //Laterale
         xy[0]=xy[0]+4;
     else
         xy[0]=0;
     if(xy[1]==0)    //verticale
         xy[1]=xy[1]+6;
     else
         xy[1]=0;
     setcolor(RED);
     moveto(50,488);  //FUOCO ESTERNO
     lineto(60+xy[0],460-xy[1]);
     lineto(65+xy[0],475-xy[1]);
     lineto(75+xy[0],450-xy[1]);
     lineto(85+xy[0],475-xy[1]);
     lineto(90+xy[0],460-xy[1]);
     lineto(100,488);
     lineto(50,488);
     moveto(55,488);  //FUOCO INTERNO
     lineto(60+xy[0],470-xy[1]);
     lineto(65+xy[0],485-xy[1]);
     lineto(75+xy[0],460-xy[1]);
     lineto(85+xy[0],485-xy[1]);
     lineto(90+xy[0],470-xy[1]);
     lineto(95,488);
     lineto(50,488);
     setfillstyle(1,LIGHTRED);      //Colora fuoco esterno
     floodfill(52,487,RED);
     setfillstyle(1,YELLOW);      //Colora fuoco interno
     floodfill(57,487,RED);     
     
     return; 
}

void finestra()
{
     setcolor(BROWN);
     rectangle(450,170,550,300);   //Telaio interno
     rectangle(445,165,555,305);   //Telaio esterno
     rectangle(498,170,502,300);   //Divisione finestra
     setcolor(WHITE);
     rectangle(441,306,560,310);   //Marmo
     /*setfillstyle(4,CYAN);  
     floodfill(451,171,BROWN);       //Colora parte sinistra
     floodfill(503,171,BROWN);      //colora parte destra*/
     setfillstyle(9,LIGHTGRAY);  
     floodfill(442,307,WHITE);       //Colora marmo
     setfillstyle(9,BROWN);  
     floodfill(446,166,BROWN);       //Colora telaio
     setcolor(CYAN);
     line(460,240,485,200);      //Lucentezza finestra sinistra
     line(460,270,485,230);      //Lucentezza finestra sinistra
     line(515,240,540,200);      //Lucentezza finestra destra
     line(515,270,540,230);      //Lucentezza finestra destra
     return;
}

void neve(int xy[])
{
     setcolor(WHITE);
     //movimento
     if(xy[0]==0)    //Laterale
         xy[0]=xy[0]+5;
     else
         xy[0]=0;
     if(xy[1]<120)    //verticale
         xy[1]=xy[1]+10;
     else
         xy[1]=0;
     //batuffolo 1
     line(455+xy[0],171+xy[1],461+xy[0],175+xy[1]);
     line(461+xy[0],171+xy[1],455+xy[0],175+xy[1]);
     line(458+xy[0],171+xy[1],458+xy[0],175+xy[1]);
     //batuffolo 2
     line(455+xy[0]+25,171+xy[1],461+xy[0]+25,175+xy[1]);
     line(461+xy[0]+25,171+xy[1],455+xy[0]+25,175+xy[1]);
     line(458+xy[0]+25,171+xy[1],458+xy[0]+25,175+xy[1]);
     //batuffolo 3
     line(455+xy[0]+52,171+xy[1],461+xy[0]+52,175+xy[1]);
     line(461+xy[0]+52,171+xy[1],455+xy[0]+52,175+xy[1]);
     line(458+xy[0]+52,171+xy[1],458+xy[0]+52,175+xy[1]);
     //batuffolo 4
     line(455+xy[0]+77,171+xy[1],461+xy[0]+77,175+xy[1]);
     line(461+xy[0]+77,171+xy[1],455+xy[0]+77,175+xy[1]);
     line(458+xy[0]+77,171+xy[1],458+xy[0]+77,175+xy[1]);
     return;
}

void pavimento()
{
    line(0,510,280,510);
    line(320,510,600,510);
    return;
}