Advertisement
patryk

Projekt - Final Version

Apr 10th, 2012
273
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.17 KB | None | 0 0
  1. /*
  2. Author: Patryk Gliszczynski
  3. Zasady korzystania:
  4. 1) Klocki mozesz dodawac tylko pojedynczo;
  5. 2) Na kazdym klocku mozesz postawic tylko jeden;
  6. 3) Jeżeli chcesz usunac element z wiezy, to chwyc za niego, a nastepnie przenies myszke w prawy dolny rog(mozesz zabierac tylko najwyzej polozony klocek);
  7. */
  8.  
  9. //---------------------------------------------------------------------------
  10. #include <vcl.h>
  11. #pragma hdrstop
  12. #include<windows.h>
  13. #include "Unit1.h"
  14. //---------------------------------------------------------------------------
  15. #pragma package(smart_init)
  16. #pragma resource "*.dfm"
  17.  
  18. TForm1 *Form1;
  19. int Possition=10;        // Pozycja tworzenia nowego obiektu
  20. bool move=false;        // Stan ruchu obiektu
  21. AnsiString Size;       // Rozmiar tworzonego obiektu
  22. TColor LosujKolor();  // Losowanie nowego koloru dla obiektu
  23. int Panel_W, Panel_H;  // Szerokosc Panel'a, Wysokosc Panel'a
  24. int i=0, number=0, Rozmiar; //index, index, zmienna odnoszaca sie do rozmiaru pobranego z Edit1
  25. int GetPos(); // Funkcja obliczajaca koncowe polozenie obiektu
  26. int Drop(); //  Funkcja obliczajaca czy klocek utrzyma sie czy spadnie
  27. int Drop2(); //  Funkcja podajaca polozenie przewroconego klocka, wzgledem wiezy
  28. int Center(); // Wylicza czy dany klocek znajduje sie dokladnie w punkcie srodkowym poprzedniego
  29. void Center2(); // Zmienia kolor srodkowej lini w przypadku, gdy znajduje się na punkcie stycznym
  30. void Destruct();  // Funkcja usuwajaca "linie srodkowe" obiektu
  31.  
  32. //--------------------------------------------------------------------------
  33. __fastcall TForm1::TForm1(TComponent* Owner)
  34.         : TForm(Owner)
  35.   {
  36.   Form1->Refresh();
  37.   }
  38.  
  39. //---------------------class kwadrat-----------------------------------------
  40. class TKwadrat : public TShape // Nowy klocek
  41.   {
  42.   public:
  43.         TKwadrat *Kwadrat[20];
  44.         int x;
  45.         int y;
  46.         int k;
  47.         int a;
  48.         int b;
  49.         int Resize, rozmiar;
  50.         __fastcall TKwadrat::TKwadrat(TComponent* owner):TShape(Owner) // Konstruktor
  51.                 {
  52.                 Rozmiar=StrToInt(Size);
  53.                 rozmiar=Rozmiar;
  54.                 Shape=stRectangle;
  55.                 Top=StrToInt(Possition);
  56.                 Left=StrToInt(Possition);
  57.                 Width=Rozmiar;
  58.                 Height=Rozmiar;
  59.                 Pen->Color=0x00838383;
  60.                 Pen->Width=1;
  61.                 Brush->Color=LosujKolor();
  62.                 Parent=Form1->Panel2;
  63.                 Possition=Possition+10;
  64.                 OnMouseDown=On1MouseDown;
  65.                 OnMouseMove=On1MouseMove;
  66.                 OnMouseUp=On1MouseUp;
  67.                 dmAutomatic;
  68.                 Cursor=crHandPoint;
  69.                 }
  70.  
  71.         __fastcall TKwadrat::~TKwadrat() // Destruktor
  72.                 {
  73.                 move=false;
  74.                 }
  75.  
  76.         void __fastcall TKwadrat::On1MouseDown(TObject *Sender, TMouseButton, TShiftState Shift, int X, int Y) // Nacisniecie na klocek
  77.                 {
  78.                 Pen->Width=2;
  79.                 Pen->Color=clActiveCaption;
  80.                 TMouse* Mouse;
  81.                 TPoint Possition;
  82.                 Possition = Form1->Panel2->ScreenToClient( Mouse ->CursorPos);
  83.                 BringToFront();
  84.                 move=true;
  85.                 }
  86.  
  87.         void __fastcall TKwadrat::On1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) // Poruszanie klockiem
  88.                 {
  89.                 if(move)
  90.                         {
  91.                         TMouse* Mouse;
  92.                         TPoint Possition;
  93.                         Possition = Form1->Panel2->ScreenToClient(Mouse ->CursorPos);
  94.                         if(Possition.y < Panel_H - Rozmiar && Possition.y >0)  // Obliczanie pozycji klocka w pionie
  95.                                 {
  96.                                 Top=Possition.y ;
  97.                                 }
  98.                         if(Possition.x < Panel_W - (StrToInt(Size)) && Possition.x > 0)  // Obliczanie pozycji klocka w poziomie
  99.                                 {
  100.                                 Left=Possition.x  ;
  101.                                 }
  102.                         if(Possition.x >= Panel_W && Possition.y >= Panel_H)
  103.                                 {
  104.                                 TKwadrat::~TKwadrat();
  105.                                 Destruct();
  106.                                 }
  107.                         }
  108.                 }
  109.         void __fastcall TKwadrat::On1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) // Upuszczanie klocka :)
  110.                 {
  111.                 int z=0;
  112.                 int k=0;
  113.                 Pen->Color=0x00838383;
  114.                 Pen->Width=1;
  115.                 move=false;
  116.                 a=Left;
  117.                 b=Left + Width;
  118.                 while(Top < GetPos()) // Spadanie klocka ruchem jednostajnie przyspieszonym, z prędkoscią równą przyspieszeniu ziemskiemu
  119.                         {
  120.                         Sleep(9.81);
  121.                         if(Top + k <= GetPos())
  122.                                 {
  123.                                 Top = Top + k;
  124.                                 }
  125.                         else
  126.                                 {
  127.                                 Top=GetPos();
  128.                                 }
  129.                         k++;
  130.                         }
  131.                 if(number!=1)
  132.                         {
  133.                         while(Top < Drop())  // Spadanie klocka ruchem jednostajnie przyspieszonym, z prędkoscią równą przyspieszeniu ziemskiemu
  134.                                 {
  135.                                 Sleep(9.81);
  136.                                 Left=Drop2() + 5;
  137.                                 if(Top + z <= Drop())
  138.                                         {
  139.                                         Top = Top + z;
  140.                                         }
  141.                                 else
  142.                                         {
  143.                                         Top=Drop();
  144.                                         }
  145.                                 z++;
  146.                                 }
  147.                         Top=Drop();
  148.                         if(Drop() == Panel_H - Rozmiar) // Sprawdzanie czy klocek spadnie, jezeli tak, to wyswietlenie komunikatu o "Przegraniu"
  149.                                 {
  150.                                         Form1->Label2->Visible=true;
  151.                                         Form1->Label2->Font->Size = Form1->Panel2->Width / 10;
  152.                                         Form1->Label2->Left = Form1->Panel2->Width/2 - Form1->Label2->Font->Size * 3.5;
  153.                                         Form1->Label2->Top = Form1->Panel2->Top + 100;
  154.                                         Form1->Label2->Caption="Przegrales!";
  155.                                         Form1->Button3->Parent=Form1->Panel2;
  156.                                         Form1->Button3->Visible=true;
  157.                                         Form1->Button3->Left = Form1->Panel2->Width/2 -  Form1->Label2->Font->Size/2 - Form1->Button3->Width /2 ;
  158.                                         Form1->Button3->Top = Form1->Panel2->Height -300;
  159.                                         Beep(1500, 700);
  160.                                 }
  161.                         else
  162.                                 {
  163.                                 Beep(500, 100);
  164.                                 }
  165.                         if(Center()==1) // Podkreslenie obramowania kwadratu
  166.                                 {
  167.                                 Pen->Color=0x000500CE;
  168.                                 Pen->Width=2;
  169.                                 }
  170.                         if(Center()==2) // Podkreslenie srokowej lini
  171.                                 {
  172.                                 Center2();
  173.                                 }
  174.                         }
  175.                 else
  176.                         {
  177.                         Beep(500, 100);
  178.                         }
  179.                 }
  180.   };
  181.  
  182. class TSrodek : public TShape // Linia przebiegajaca przez srodek kwadratu
  183.   {
  184.   public:
  185.         TSrodek *Srodek[20];
  186.         __fastcall TSrodek::TSrodek(TComponent* owner):TShape(Owner) // Konstruktor
  187.                 {
  188.                 Shape=stRectangle;
  189.                 Top=StrToInt(Possition);
  190.                 Left=StrToInt(Possition);
  191.                 Pen->Style=psDashDot;
  192.                 Width=1;
  193.                 Height=0;
  194.                 Brush->Color=clBlack;
  195.                 Parent=Form1->Panel2;
  196.                 dmAutomatic;
  197.                 Cursor=crHandPoint;
  198.                 Brush->Style=bsHorizontal;
  199.                 }
  200.         __fastcall TSrodek::~TSrodek() // Destruktor
  201.                 {
  202.                 move = false;
  203.                 }
  204.   };
  205. //--------------------------------------------------------------------------
  206. TKwadrat *Kwadrat[20]; // Globalny wektor dla nowego obiektu
  207. TSrodek *Srodek[20];  // Globalny wektor dla nowego obiektu
  208.  
  209. void __fastcall TForm1::Button1Click(TObject *Sender) // Tworzenie nowego klocka + Lini przebiegajacej przez jego srodek
  210.   {
  211.   Size=Edit1->Text;
  212.   Kwadrat[i] = new TKwadrat(this);
  213.   Srodek[i] = new TSrodek(this);
  214.   i++;
  215.   number++;
  216.   }
  217.  
  218. //---------------------------------------------------------------------------
  219.  
  220. TColor LosujKolor() // Nadawanie koloru klockowi
  221.   {
  222.   srand(time(NULL));
  223.   int R = rand()%255;
  224.   int G = rand()%255;
  225.   int B = rand()%255;
  226.   TColor kolor;
  227.   kolor = RGB(R,G,B);
  228.   return kolor;
  229.   }
  230.  
  231. //---------------------------------------------------------------------------
  232.  
  233. void __fastcall TForm1::FormCanResize(TObject *Sender, int &NewWidth, // Pobieranie szerokosci i wysokosci Panelu podaczas powiekszania Formy
  234.       int &NewHeight, bool &Resize)
  235.   {
  236.   Form1->Refresh();
  237.   Panel_W=Panel2->Width;
  238.   Panel_H=Panel2->Height;
  239.   }
  240.  
  241. //---------------------------------------------------------------------------
  242.  
  243. void __fastcall TForm1::FormResize(TObject *Sender) // Zwiekszanie rozmiaru formy
  244.   {
  245.   for(int i=0; i<number; i++)
  246.         {
  247.         Kwadrat[i]->Top=Panel_H - Rozmiar;
  248.         }
  249.   Form1->SpeedButton1->Top = Form1->Panel1->Height - 45;
  250.   Form1->SpeedButton1->Left = Form1->Panel1->Width - 146;
  251.   Form1->Label1->Top = Form1->Panel1->Height - 45;
  252.   Form1->Label1->Left = Form1->Panel1->Width - 97;                   //   <-  Obliczanie polozenia Buttona, Edita, oraz Labela
  253.   Form1->Edit1->Top = Form1->Panel1->Height - 29;
  254.   Form1->Edit1->Left = Form1->Panel1->Width - 97;
  255.   Form1->Image1->Left = Form1->Panel2->Width - 196;
  256.   Form1->Image1->Top = Form1->Panel2->Height - 173;
  257.   }
  258.  
  259. //----------------------------------------------------------------------------
  260.  
  261. int GetPos()  // Obliczanie koncowego polozenia obiektu
  262.  {
  263.  if(number==1)
  264.         {
  265.         return Panel_H - Rozmiar;
  266.         }
  267.  else
  268.         {
  269.         return Kwadrat[number - 2]->Top - Rozmiar; // Kwadrat[number - 2] = poprzedni kwadrat
  270.         }
  271.  
  272.  }
  273.  
  274. //---------------------------------------------------------------------------
  275.  
  276. void __fastcall TForm1::Button3Click(TObject *Sender)  // Wcisniecie guzika Try Again
  277.   {
  278.   for(int i=0; i<number; i++)
  279.         {
  280.         Kwadrat[i]->~TKwadrat();
  281.         Srodek[i]->~TSrodek();
  282.         }
  283.   number=0;
  284.   i=0;
  285.   Form1->Label2->Visible=false;
  286.   Form1->Button3->Visible=false;
  287.   }
  288.  
  289. //---------------------------------------------------------------------------
  290.  
  291. int Drop()  // Obliczanie czy klocek spadnie z wiezy
  292.   {
  293.   if(number!=1)
  294.         {
  295.         if(Kwadrat[number - 1]->Left + (Kwadrat[number - 1]->Width/2) < Kwadrat[number - 2]->Left || Kwadrat[number - 1] -> Left + (Kwadrat[number - 1]->Width/2) > Kwadrat[number - 2]-> Left + Kwadrat[number - 2]->Width)
  296.                 {
  297.                 return Panel_H - Rozmiar;
  298.                 }
  299.         else
  300.                 {
  301.                 return Kwadrat[number - 1]->Top;
  302.                 }
  303.         }
  304.   }
  305.  
  306. //---------------------------------------------------------------------------
  307.  
  308. int Drop2() // Obliczanie polozenia spadajacego klocka wzgledem wiezy
  309.   {
  310.   if(Kwadrat[number - 1]->Left + (Kwadrat[number - 1]->Width/2) < Kwadrat[number - 2]->Left)
  311.         {
  312.         return Kwadrat[number - 2]->Left - Kwadrat[number - 1]->Width;
  313.         }
  314.   else
  315.         {
  316.         return Kwadrat[number -2]->Left + Kwadrat[number - 2]->Width;
  317.         }
  318.   }
  319.  
  320. //---------------------------------------------------------------------------
  321.  
  322. void __fastcall TForm1::Timer1Timer(TObject *Sender) // Timer czuwajacy nad polozeniem lini przebiegajacej przez srodek kazdego kwadratu
  323.   {
  324.   if(number>0)
  325.         {
  326.         Srodek[number - 1]->Top=Kwadrat[number - 1]->Top;
  327.         Srodek[number - 1]->Left=Kwadrat[number - 1]->Left + Kwadrat[number - 1]->Width/2;
  328.         Srodek[number - 1]->Height=Kwadrat[number - 1]->Height;
  329.         Srodek[number - 1]->BringToFront();
  330.         }
  331.   }
  332.  
  333. //---------------------------------------------------------------------------
  334.  
  335. void Destruct()  // Usuwanie Lini Srodka
  336.   {
  337.   Srodek[number - 1]->~TSrodek();
  338.   number--;
  339.   i--;
  340.   }
  341.  
  342. //---------------------------------------------------------------------------
  343.  
  344. void __fastcall TForm1::SpeedButton1Click(TObject *Sender) // Tworzenie nowych obiektow: Kwadrat + Linia wyznaczajaca jego srodek
  345.   {
  346.   Size=Edit1->Text;
  347.   Kwadrat[i] = new TKwadrat(this);
  348.   Srodek[i] = new TSrodek(this);
  349.   i++;
  350.   number++;
  351.   }
  352. //---------------------------------------------------------------------------
  353.  
  354. int Center() // Wylicza czy dany klocek znajduje sie dokladnie w punkcie srodkowym poprzedniego
  355.   {
  356.   if(Kwadrat[number - 1]->Left + (Kwadrat[number - 1]->Width/2) == Kwadrat[number - 2]->Left + (Kwadrat[number - 2]->Width/2))
  357.         {
  358.         return 1;
  359.         }
  360.  
  361.   if(Kwadrat[number - 1]->Left + (Kwadrat[number - 1]->Width/2) == Kwadrat[number - 2]->Left || Kwadrat[number - 1] -> Left + (Kwadrat[number - 1]->Width/2) == Kwadrat[number - 2]-> Left + Kwadrat[number - 2]->Width)
  362.         {
  363.         return 2;
  364.         }
  365.   }
  366. //--------------------------------------------------------------------------
  367.  
  368. void Center2() // Zmienia kolor srodkowej lini w przypadku, gdy znajduje się na punkcie stycznym
  369.   {
  370.   Srodek[number - 1]->Width = 2;
  371.   Srodek[number - 1]->Pen->Color = 0x000500CE;
  372.   Srodek[number - 1]->BringToFront();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement