Monday, April 29, 2013

#5 Grafika skupljanje vockica

// krugovi padaju sa vrha ekrana skupiti ih sto vise sa pokretnim kolicima
#include <graphics.h>
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#include<unistd.h>
// left and right arrow keys <- ->

const int LEFT_KEY=75;
const int RIGHT_KEY=77;

// pozicija tacne startna
const int screenMaxX=800;
const int screenMaxY=800;


 int tacnaWidth=200;
 int tacnaHeight=25;
 int tacna_Offset=30;
 int tacna_StartX=300;
 int tacna_StartY=800;// y se uvek nalazi na dnu ekrana i ne menja se

// min i max dokle po X-u moze ici tacna zavisi od
// velicine ekrana po X
// velicine tacne
// a meri se u odnosu na goenji levi ugao tacne :)

 int tacna_minX=0;
 int tacna_maxX=screenMaxX-tacnaWidth; // velicina tacne

 // trenutna pozicija tacne
int currentX=tacna_StartX;
int currentY=tacna_StartY;

// niz vocki
struct s_vocka{
       // prethodna pozicija
       int x;
       int y;
       colors boja;
       };
     
const int vockaMin=0;
const int vockaMax=20;
struct s_vocka vocke[vockaMax];
const int vocka_sirina=40;     // kolko je siroka vocka
const int vocka_rastojanje=40; // kolko je rastojanje izmedju vocki

const int vocka_korak=60; // korak pomeraja u pikselima
const int vocka_brzina=1; // brzina u  sekundama spustanja vocki

 int brojacVocki=0;
/* Skupiti sto vise vockica na tacnu  koristiti tastere LEFT i RIGHT <- -> za pomeranje tacne*/
 int random_number(int min_num, int max_num); // slucajan broj u intervalu od do
 void draw_tacna(int pozX, int pozY);
 void mov_tacna(int keyCode);
 void play_game();

 void vocke_popuni(int pozicija); // dodaj novu poziciju vocke
 void vocke_default(); // popuni osnovni niz sa vockama
 void vocke_ispisi();  // ispisi sadrzaj niza za proveru

 void vocke_crtaj(); // crtaj vocke u zavisnosti od brzine
 void vocke_crtaj_vocku(int pozicija);
 bool bingo_check(int tacnaX, int tacnaY, int vockaX,int vockaY, int vockaRadius); // provera da li je pokupio vocku

main ( )
{
  initwindow (screenMaxX,screenMaxY);/*otvara prozor velicine 800 x 800 piksela*/
     play_game();
   while (!kbhit( ));  /*zadržava prozor sa crtežom otvorenim*/
   closegraph( );
}

// Funkcije



void play_game(){
     // set random generato position
      srand(time(NULL));
     // Deafult pozicija tacne
     currentX=tacna_StartX;
     currentY=tacna_StartY;
     // postavi sve vocke na mesto
     vocke_default();
     //vocke_ispisi(); testira vocke
     draw_tacna(currentX,currentY);
   
 
       
     clock_t start = clock();
     /*Do something*/
     float seconds=0;
   
    // whait ? seconds then do something
    int j=-1;
    char c;
     while (j<0){
           Sleep(10);
            //usleep(10000);          
           if (seconds>=(float) vocka_brzina){
                start = clock(); // stavi sat na pocetak
                for (int i=vockaMin;i<vockaMax;i++){
                    vocke_crtaj_vocku(i); // crtaj vocku
                 }
                           
           }
           clock_t end = clock();
           seconds = (float)(end - start) / CLOCKS_PER_SEC;
         
           char txt[20];
           //sprintf(txt,"Vocke:%f",seconds);
           sprintf(txt,"Vocke:%d",brojacVocki);
           outtextxy(20,20,txt);
         
            if (kbhit()){
             c=getch();
              if (c=='q') exit(0);
              mov_tacna((int) c);
           }
     }
}

   void vocke_popuni(int pozicija){ // dodaj novu vocku na poziciju vocke
     if (pozicija>=vockaMin && pozicija <vockaMax){
        // vocka ulazi u niz kao slucajan broj pred ekran tj u minus
          vocke[pozicija].x=pozicija*(vocka_sirina)+vocka_rastojanje+int(vocka_sirina/2);
          vocke[pozicija].y= random_number(-screenMaxY,0);
          vocke[pozicija].boja=(colors)random_number(1,14);
     }
   }

 void vocke_default(){ // popuni osnovni niz sa vockama
 
    for (int i=vockaMin;i<vockaMax;i++){
        vocke_popuni(i);
        }
  }
 void vocke_ispisi(){
      char tekst[10];
      for (int i=vockaMin;i<vockaMax;i++){
        sprintf(tekst,"%d,%d|",vocke[i].x,vocke[i].y);
        outtextxy(20+i*70,100,tekst);
        }
  }


 void vocke_crtaj_vocku(int pozicija){ // crtaj vocke u zavisnosti

    if (vocke[pozicija].y<=screenMaxY){
       // brisi staru
       setcolor(BLACK);
       circle(vocke[pozicija].x,vocke[pozicija].y,(int)vocka_sirina/2);
     
       // povecaj za korak
      // vocke[pozicija].x=vocke[pozicija].x+vocka_korak;
      vocke[pozicija].y= vocke[pozicija].y+vocka_korak;
       // crtaj novu
       setcolor(WHITE);
       int radius=(int)(int)vocka_sirina/2;
       circle(vocke[pozicija].x,vocke[pozicija].y,radius);
     
       if (bingo_check(currentX,currentY,vocke[pozicija].x,vocke[pozicija].y,radius)){
         // pogodak
         brojacVocki++;
         // obrisi je i dodaj ponovo
       
         setcolor(BLACK);
         circle(vocke[pozicija].x,vocke[pozicija].y,(int)vocka_sirina/2);
          vocke_popuni(pozicija);                                                                      
       }
     }
     else{
          //dodaj novu u niz vocki na istu poziciju
          // brisi staru
       setcolor(BLACK);
       circle(vocke[pozicija].x,vocke[pozicija].y,(int)vocka_sirina/2);
          vocke_popuni(pozicija);
     }

           


 }

void mov_tacna(int keyCode){
   
     switch(keyCode){
        case LEFT_KEY:{// left
          int tmpX=currentX-tacna_Offset;
          if (tmpX>=tacna_minX && tmpX <=tacna_maxX){
               // brisi prethodnu poziciju tacne
                setcolor(BLACK);
                draw_tacna(currentX,currentY);
             
                // crtaj novu poziciju tacne
                currentX=tmpX; // pomeras na novo mesto
                setcolor(WHITE);
                draw_tacna(currentX,currentY);        
          }
         break;  
        }
        case RIGHT_KEY:{ // right
        int tmpX=currentX+tacna_Offset;
         if (tmpX>=tacna_minX && tmpX <=tacna_maxX){
             
                // brisi prethodnu poziciju tacne
                setcolor(BLACK);
                draw_tacna(currentX,currentY);
             
                // crtaj novu poziciju tacne
                currentX=tmpX; // pomeras na novo mesto
                setcolor(WHITE);
                draw_tacna(currentX,currentY);    
          }
         break;  
        }                              
     }
   
}
bool bingo_check(int tacnaX, int tacnaY, int vockaX,int vockaY, int vockaRadius){
      bool ret=false;
   
      if ((vockaX>=(tacnaX-vockaRadius)) && (vockaX<=(tacnaX+tacnaWidth+vockaRadius)) && (vockaY>=(tacnaY-vockaRadius)))
      {
       Beep(523,100);
       ret=true;
      }
      return ret;
     }
void draw_tacna(int pozX, int pozY){
   
   rectangle(pozX,pozY-tacnaHeight,pozX+tacnaWidth,pozY);
   
}

int random_number(int min_num, int max_num)
        {
            int result=0,low_num=0,hi_num=0;
            if(min_num<max_num)
            {
                low_num=min_num;
                hi_num=max_num+1; // this is done to include max_num in output.
            }else{
                low_num=max_num+1;// this is done to include max_num in output.
                hi_num=min_num;
            }
            //srand(time(NULL));
            result = (rand()%(hi_num-low_num))+low_num;
            return result;
        }

#4 kornjaca.h


#ifndef KORNJACA_H
#define KORNJACA_H
#include <graphics.h>

class c_kornjaca{
 private: // nemoze im se pristupiti izvan objekta
  int x;
  int y;
  int r;
  colors color;
 
  public:    // moze im se pristupiti izvan projekta
   c_kornjaca(int _x, int _y, int _r,colors _color);
  ~c_kornjaca();
  void clearMe();
  void drawMe();
  void move(int position, int step, int maxX, int maxY);    
};

c_kornjaca::c_kornjaca(int _x, int _y, int _r,colors _color){
      x=_x;
      y=_y;
      r=_r;
      color=_color;
      drawMe();            
}
void c_kornjaca::clearMe(){
  setcolor(BLACK);
  circle(x,y,r);  
}
void c_kornjaca::drawMe(){
  setcolor(color);
  circle(x,y,r);  
}
void c_kornjaca::move(int position, int step, int maxX, int maxY){
  switch(position){
  case KEY_LEFT:
       if (x-r-step>0) {
        clearMe();              
        x=x-step;
        drawMe();
       }
     
     
   break;
   case KEY_RIGHT:
       if (x+r+step<maxX) {
       clearMe();
       x=x+step;
       drawMe();
       }
   break;
    case KEY_UP:
       if (y-r-step>0) {
       clearMe();
       y=y-step;
       drawMe();
       }
   break;
     case KEY_DOWN:
       if (y+r+step<maxY) {
       clearMe();
       y=y+step;
       drawMe();
       }
   break;                  
                 
 }  
}
#endif

#4 Kornjaca koja se pomera strelicama po ekranu


//nacrtati krug koji predstvalja kornajcu i pomeraj ga u granicama ekrana sa strelicama gore,dole, levo,desno

#include "kornjaca.h"
#define maxX 800
#define maxY 800

void play(){
     c_kornjaca *kornjaca=new c_kornjaca(400,400,20,RED);
     char c=' ';
while(c!='q'){
  if(kbhit( )){
      c=getch();
     kornjaca->move((int) c,10,maxX,maxY);          
  }
}  
   
}

int main(){
  initwindow (maxX,maxY);/*otvara prozor velicine 800 x 800 piksela*/
   
   play();
   
   while (!kbhit( ));  /*zadržava prozor sa crtežom otvorenim*/
 
   closegraph( );
   return 1;
}

#2 f_tetris.h


#ifndef _TETRIS_H
#define _TETRIS_H

const   int SPACE=32; // keyboard space
 const int screenMaxX=800;
 const int screenMaxY=800;

 enum figure_type {LINE,RIGHTL,LEFTL,SQUARE,RIGHTB,LEFTB,PIRAMIDE};
 enum figure_position {VERTICAL,HORIZONTAL,V_OPOSITE,H_OPOSITE};



/*
Left: 0, 75
Right: 0, 77
Up: 0, 72
Down: 0, 80
PgUp: 0, 73
PgDn: 0, 81
Home: 0, 71
End: 0, 79
Ins: 0, 82
Del: 0, 83 */

#endif // _TETRIS_H

#5 c_tetris.h


#ifndef _C_TETRIS_H
#define _C_TETRIS_H

#include<graphics.h>
#include "f_tetris.h"

const int maxX=800;
const int maxY=800;

using namespace std;
class figure{
     
      public:
      int left;
      int top;
      int width;
      figure_type type;
      figure_position position;
      colors color;
      int deep3d;
     
       // const
      figure(int _left,int _top, int _width, figure_type _type,figure_position _position, colors _color, int _deep3d);
      // dest
      ~figure();
   
      void drawMe();
      void eraseMe();
     
      private:
      void drawSquare();
      void drawLine();
      void drawLeftL();
      void drawRightL();
      void drawRightB();
      void move(int mov);
     
      public: void play();
};
     
figure::figure(int _left,int _top, int _width, figure_type _type,figure_position _position, colors _color, int _deep3d){
    left=_left;
    top=_top;
    width=_width;
    type=_type;
    position=_position;
    color=_color;
    deep3d=_deep3d;                    
}
figure::~figure(){
  // destroy delete this        
}
void figure::eraseMe(){
   colors tmp=color;
   color=BLACK;
   drawMe();
   color=tmp;
}
void figure::drawMe(){
    switch (type){
     case SQUARE:
          {
           drawSquare();
           break;          
          }
     case LINE:
          {
           drawLine();
           break;          
          }
     case LEFTL:
          {
           drawLeftL();
           break;          
          }
     case RIGHTL:
          {
           drawRightL();
           break;          
          }              
         
    }  
}
void figure::drawSquare(){
     setfillstyle(LINE_FILL, color);
     setcolor(color);
     bar3d(left, top, left+width,top+width, deep3d, 1);
}
void figure::drawLine(){
     setfillstyle(LINE_FILL, color);
     setcolor(color);
     int top_flag=1;
     switch (position){
      case VERTICAL: V_OPOSITE:{
       for (int i=0; i<4; i++){
         if (i!=0) top_flag=0;
         bar3d(left, (top+width*i), left+width,(top+width*i)+width, deep3d, top_flag);
       }
       break;
      }
      case HORIZONTAL: H_OPOSITE:{
       for (int i=0; i<4; i++){
        bar3d(left+width*i, top, (left+width*i)+width,top+width, deep3d, 1);
       }
       break;
      }
     }
}

void figure::drawLeftL(){
     setfillstyle(LINE_FILL, color);
     setcolor(color);
     int top_flag=1;
     switch (position){
      case VERTICAL:{
       int i;
       for (i=0; i<4; i++){
         if (i!=0) top_flag=0;
         bar3d(left, (top+width*i), left+width,(top+width*i)+width, deep3d, top_flag);
       }
       top_flag=1;
       i--;
        bar3d(left-width, (top+width*i), left,(top+width*i)+width, deep3d, top_flag);
       break;
      }
      case V_OPOSITE:{
       int i;
       for (i=0; i<4; i++){
         if (i!=0) top_flag=0;
         bar3d(left, (top+width*i), left+width,(top+width*i)+width, deep3d, top_flag);
       }
       top_flag=1;
       //i--;
        bar3d(left+width, top, left+2*width,top+width, deep3d, top_flag);
       break;
      }
      case HORIZONTAL:{
           int i;
       for (i=0; i<4; i++){
        bar3d(left+width*i, top, (left+width*i)+width,top+width, deep3d, 1);
       }
        bar3d(left, top-width, left+width,top, deep3d, top_flag);
       break;
      }
      case H_OPOSITE:{
           int i;
       for (i=0; i<4; i++){
        bar3d(left+width*i, top, (left+width*i)+width,top+width, deep3d, 1);
       }
       i--;
       bar3d(left+width*i, top+width, (left+width*i)+width,top+2*width, deep3d, 1);
       break;
      }
     
     }//end switch
}
void figure::drawRightL(){
     setfillstyle(LINE_FILL, color);
     setcolor(color);
     int top_flag=1;
     switch (position){
      case VERTICAL:{
       int i;
       for (i=0; i<4; i++){
         if (i!=0) top_flag=0;
         bar3d(left, (top+width*i), left+width,(top+width*i)+width, deep3d, top_flag);
       }
       top_flag=1;
       i--;
        bar3d(left+width, (top+width*i), left+2*width,(top+width*i)+width, deep3d, top_flag);
       break;
      }
      case V_OPOSITE:{
       int i;
       for (i=0; i<4; i++){
         if (i!=0) top_flag=0;
         bar3d(left, (top+width*i), left+width,(top+width*i)+width, deep3d, top_flag);
       }
       top_flag=1;
       //i--;
        bar3d(left-width, top, left,top+width, deep3d, top_flag);
       break;
      }
      case HORIZONTAL:{
           int i;
       for (i=0; i<4; i++){
        bar3d(left+width*i, top, (left+width*i)+width,top+width, deep3d, 1);
       }
       top_flag=0;
        bar3d(left, top+width, left+width,top+2*width, deep3d, top_flag);
       break;
      }
      case H_OPOSITE:{
           int i;
       for (i=0; i<4; i++){
        bar3d(left+width*i, top, (left+width*i)+width,top+width, deep3d, 1);
       }
       i--;
       bar3d(left+width*i, top-width, (left+width*i)+width,top, deep3d, 1);
       break;
      }
     
     }//end switch
}

void figure::drawRightB(){
     setfillstyle(LINE_FILL, color);
     setcolor(color);
     int top_flag=1;
     switch (position){
      case VERTICAL:{
       int i;
       for (i=0; i<4; i++){
         if (i!=0) top_flag=0;
         bar3d(left, (top+width*i), left+width,(top+width*i)+width, deep3d, top_flag);
       }
       top_flag=1;
       i--;
        bar3d(left+width, (top+width*i), left+2*width,(top+width*i)+width, deep3d, top_flag);
       break;
      }
      case V_OPOSITE:{
       int i;
       for (i=0; i<4; i++){
         if (i!=0) top_flag=0;
         bar3d(left, (top+width*i), left+width,(top+width*i)+width, deep3d, top_flag);
       }
       top_flag=1;
       //i--;
        bar3d(left-width, top, left,top+width, deep3d, top_flag);
       break;
      }
      case HORIZONTAL:{
           int i;
       for (i=0; i<4; i++){
        bar3d(left+width*i, top, (left+width*i)+width,top+width, deep3d, 1);
       }
       top_flag=0;
        bar3d(left, top+width, left+width,top+2*width, deep3d, top_flag);
       break;
      }
      case H_OPOSITE:{
           int i;
       for (i=0; i<4; i++){
        bar3d(left+width*i, top, (left+width*i)+width,top+width, deep3d, 1);
       }
       i--;
       bar3d(left+width*i, top-width, (left+width*i)+width,top, deep3d, 1);
       break;
      }
     
     }//end switch
}
void figure::move(int mov){
     int tmp;
      eraseMe(); // erase figure
  switch (mov){
       case KEY_LEFT:{
           tmp=left-width;
           if (tmp>=0) left=tmp;
        break;
       }
       case KEY_RIGHT:{
           tmp=left+width;
           if (tmp<=screenMaxX) left=tmp;
        break;
       }
       case KEY_UP:{
           tmp=top-width;
           if (tmp>=0) top=tmp;
        break;
       }
       case KEY_DOWN:{
           tmp=top+width;
           if (tmp<=screenMaxY) top=tmp;
        break;
       }
       case SPACE:{
           tmp=position+1;
           if (tmp>3) tmp=0;
           position=(figure_position) tmp;
        break;
       }
 }//esw
        drawMe(); // draw figure
}
void figure::play(){
   char c='w';
    while (c!='q'){
     if (kbhit()){
             c=getch();
              if (c=='q') exit(0);
              move((int)c);
               char txt[20];
           //sprintf(txt,"Vocke:%f",seconds);
           sprintf(txt,"znak:%d",c);
           outtextxy(20,20,txt);
     }
    }  
   
}
#endif // _C_TETRIS_H

#5 Figure tetrisa pomeranje i rotiranje

// program rotira tetris figure po izboru
#include "c_tetris.h"


int main(){
  initwindow (screenMaxX,800);/*otvara prozor velicine 800 x 800 piksela*/
 
    figure *myFigure=new figure::figure(100,100,100,SQUARE,VERTICAL,LIGHTGREEN,10);  
 
    myFigure->drawMe();
    myFigure->play();
 
   while (!kbhit( ));  /*zadržava prozor sa crtežom otvorenim*/

   closegraph( );
   return 1;
}