Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Author: Patryk Gliszczynski
- Zasady korzystania:
- 1) Klocki mozesz dodawac tylko pojedynczo;
- 2) Na kazdym klocku mozesz postawic tylko jeden;
- 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);
- */
- //---------------------------------------------------------------------------
- #include <vcl.h>
- #pragma hdrstop
- #include<windows.h>
- #include "Unit1.h"
- //---------------------------------------------------------------------------
- #pragma package(smart_init)
- #pragma resource "*.dfm"
- TForm1 *Form1;
- int Possition=10; // Pozycja tworzenia nowego obiektu
- bool move=false; // Stan ruchu obiektu
- AnsiString Size; // Rozmiar tworzonego obiektu
- TColor LosujKolor(); // Losowanie nowego koloru dla obiektu
- int Panel_W, Panel_H; // Szerokosc Panel'a, Wysokosc Panel'a
- int i=0, number=0, Rozmiar; //index, index, zmienna odnoszaca sie do rozmiaru pobranego z Edit1
- int GetPos(); // Funkcja obliczajaca koncowe polozenie obiektu
- int Drop(); // Funkcja obliczajaca czy klocek utrzyma sie czy spadnie
- int Drop2(); // Funkcja podajaca polozenie przewroconego klocka, wzgledem wiezy
- int Center(); // Wylicza czy dany klocek znajduje sie dokladnie w punkcie srodkowym poprzedniego
- void Center2(); // Zmienia kolor srodkowej lini w przypadku, gdy znajduje się na punkcie stycznym
- void Destruct(); // Funkcja usuwajaca "linie srodkowe" obiektu
- //--------------------------------------------------------------------------
- __fastcall TForm1::TForm1(TComponent* Owner)
- : TForm(Owner)
- {
- Form1->Refresh();
- }
- //---------------------class kwadrat-----------------------------------------
- class TKwadrat : public TShape // Nowy klocek
- {
- public:
- TKwadrat *Kwadrat[20];
- int x;
- int y;
- int k;
- int a;
- int b;
- int Resize, rozmiar;
- __fastcall TKwadrat::TKwadrat(TComponent* owner):TShape(Owner) // Konstruktor
- {
- Rozmiar=StrToInt(Size);
- rozmiar=Rozmiar;
- Shape=stRectangle;
- Top=StrToInt(Possition);
- Left=StrToInt(Possition);
- Width=Rozmiar;
- Height=Rozmiar;
- Pen->Color=0x00838383;
- Pen->Width=1;
- Brush->Color=LosujKolor();
- Parent=Form1->Panel2;
- Possition=Possition+10;
- OnMouseDown=On1MouseDown;
- OnMouseMove=On1MouseMove;
- OnMouseUp=On1MouseUp;
- dmAutomatic;
- Cursor=crHandPoint;
- }
- __fastcall TKwadrat::~TKwadrat() // Destruktor
- {
- move=false;
- }
- void __fastcall TKwadrat::On1MouseDown(TObject *Sender, TMouseButton, TShiftState Shift, int X, int Y) // Nacisniecie na klocek
- {
- Pen->Width=2;
- Pen->Color=clActiveCaption;
- TMouse* Mouse;
- TPoint Possition;
- Possition = Form1->Panel2->ScreenToClient( Mouse ->CursorPos);
- BringToFront();
- move=true;
- }
- void __fastcall TKwadrat::On1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) // Poruszanie klockiem
- {
- if(move)
- {
- TMouse* Mouse;
- TPoint Possition;
- Possition = Form1->Panel2->ScreenToClient(Mouse ->CursorPos);
- if(Possition.y < Panel_H - Rozmiar && Possition.y >0) // Obliczanie pozycji klocka w pionie
- {
- Top=Possition.y ;
- }
- if(Possition.x < Panel_W - (StrToInt(Size)) && Possition.x > 0) // Obliczanie pozycji klocka w poziomie
- {
- Left=Possition.x ;
- }
- if(Possition.x >= Panel_W && Possition.y >= Panel_H)
- {
- TKwadrat::~TKwadrat();
- Destruct();
- }
- }
- }
- void __fastcall TKwadrat::On1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) // Upuszczanie klocka :)
- {
- int z=0;
- int k=0;
- Pen->Color=0x00838383;
- Pen->Width=1;
- move=false;
- a=Left;
- b=Left + Width;
- while(Top < GetPos()) // Spadanie klocka ruchem jednostajnie przyspieszonym, z prędkoscią równą przyspieszeniu ziemskiemu
- {
- Sleep(9.81);
- if(Top + k <= GetPos())
- {
- Top = Top + k;
- }
- else
- {
- Top=GetPos();
- }
- k++;
- }
- if(number!=1)
- {
- while(Top < Drop()) // Spadanie klocka ruchem jednostajnie przyspieszonym, z prędkoscią równą przyspieszeniu ziemskiemu
- {
- Sleep(9.81);
- Left=Drop2() + 5;
- if(Top + z <= Drop())
- {
- Top = Top + z;
- }
- else
- {
- Top=Drop();
- }
- z++;
- }
- Top=Drop();
- if(Drop() == Panel_H - Rozmiar) // Sprawdzanie czy klocek spadnie, jezeli tak, to wyswietlenie komunikatu o "Przegraniu"
- {
- Form1->Label2->Visible=true;
- Form1->Label2->Font->Size = Form1->Panel2->Width / 10;
- Form1->Label2->Left = Form1->Panel2->Width/2 - Form1->Label2->Font->Size * 3.5;
- Form1->Label2->Top = Form1->Panel2->Top + 100;
- Form1->Label2->Caption="Przegrales!";
- Form1->Button3->Parent=Form1->Panel2;
- Form1->Button3->Visible=true;
- Form1->Button3->Left = Form1->Panel2->Width/2 - Form1->Label2->Font->Size/2 - Form1->Button3->Width /2 ;
- Form1->Button3->Top = Form1->Panel2->Height -300;
- Beep(1500, 700);
- }
- else
- {
- Beep(500, 100);
- }
- if(Center()==1) // Podkreslenie obramowania kwadratu
- {
- Pen->Color=0x000500CE;
- Pen->Width=2;
- }
- if(Center()==2) // Podkreslenie srokowej lini
- {
- Center2();
- }
- }
- else
- {
- Beep(500, 100);
- }
- }
- };
- class TSrodek : public TShape // Linia przebiegajaca przez srodek kwadratu
- {
- public:
- TSrodek *Srodek[20];
- __fastcall TSrodek::TSrodek(TComponent* owner):TShape(Owner) // Konstruktor
- {
- Shape=stRectangle;
- Top=StrToInt(Possition);
- Left=StrToInt(Possition);
- Pen->Style=psDashDot;
- Width=1;
- Height=0;
- Brush->Color=clBlack;
- Parent=Form1->Panel2;
- dmAutomatic;
- Cursor=crHandPoint;
- Brush->Style=bsHorizontal;
- }
- __fastcall TSrodek::~TSrodek() // Destruktor
- {
- move = false;
- }
- };
- //--------------------------------------------------------------------------
- TKwadrat *Kwadrat[20]; // Globalny wektor dla nowego obiektu
- TSrodek *Srodek[20]; // Globalny wektor dla nowego obiektu
- void __fastcall TForm1::Button1Click(TObject *Sender) // Tworzenie nowego klocka + Lini przebiegajacej przez jego srodek
- {
- Size=Edit1->Text;
- Kwadrat[i] = new TKwadrat(this);
- Srodek[i] = new TSrodek(this);
- i++;
- number++;
- }
- //---------------------------------------------------------------------------
- TColor LosujKolor() // Nadawanie koloru klockowi
- {
- srand(time(NULL));
- int R = rand()%255;
- int G = rand()%255;
- int B = rand()%255;
- TColor kolor;
- kolor = RGB(R,G,B);
- return kolor;
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::FormCanResize(TObject *Sender, int &NewWidth, // Pobieranie szerokosci i wysokosci Panelu podaczas powiekszania Formy
- int &NewHeight, bool &Resize)
- {
- Form1->Refresh();
- Panel_W=Panel2->Width;
- Panel_H=Panel2->Height;
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::FormResize(TObject *Sender) // Zwiekszanie rozmiaru formy
- {
- for(int i=0; i<number; i++)
- {
- Kwadrat[i]->Top=Panel_H - Rozmiar;
- }
- Form1->SpeedButton1->Top = Form1->Panel1->Height - 45;
- Form1->SpeedButton1->Left = Form1->Panel1->Width - 146;
- Form1->Label1->Top = Form1->Panel1->Height - 45;
- Form1->Label1->Left = Form1->Panel1->Width - 97; // <- Obliczanie polozenia Buttona, Edita, oraz Labela
- Form1->Edit1->Top = Form1->Panel1->Height - 29;
- Form1->Edit1->Left = Form1->Panel1->Width - 97;
- Form1->Image1->Left = Form1->Panel2->Width - 196;
- Form1->Image1->Top = Form1->Panel2->Height - 173;
- }
- //----------------------------------------------------------------------------
- int GetPos() // Obliczanie koncowego polozenia obiektu
- {
- if(number==1)
- {
- return Panel_H - Rozmiar;
- }
- else
- {
- return Kwadrat[number - 2]->Top - Rozmiar; // Kwadrat[number - 2] = poprzedni kwadrat
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::Button3Click(TObject *Sender) // Wcisniecie guzika Try Again
- {
- for(int i=0; i<number; i++)
- {
- Kwadrat[i]->~TKwadrat();
- Srodek[i]->~TSrodek();
- }
- number=0;
- i=0;
- Form1->Label2->Visible=false;
- Form1->Button3->Visible=false;
- }
- //---------------------------------------------------------------------------
- int Drop() // Obliczanie czy klocek spadnie z wiezy
- {
- if(number!=1)
- {
- 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)
- {
- return Panel_H - Rozmiar;
- }
- else
- {
- return Kwadrat[number - 1]->Top;
- }
- }
- }
- //---------------------------------------------------------------------------
- int Drop2() // Obliczanie polozenia spadajacego klocka wzgledem wiezy
- {
- if(Kwadrat[number - 1]->Left + (Kwadrat[number - 1]->Width/2) < Kwadrat[number - 2]->Left)
- {
- return Kwadrat[number - 2]->Left - Kwadrat[number - 1]->Width;
- }
- else
- {
- return Kwadrat[number -2]->Left + Kwadrat[number - 2]->Width;
- }
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::Timer1Timer(TObject *Sender) // Timer czuwajacy nad polozeniem lini przebiegajacej przez srodek kazdego kwadratu
- {
- if(number>0)
- {
- Srodek[number - 1]->Top=Kwadrat[number - 1]->Top;
- Srodek[number - 1]->Left=Kwadrat[number - 1]->Left + Kwadrat[number - 1]->Width/2;
- Srodek[number - 1]->Height=Kwadrat[number - 1]->Height;
- Srodek[number - 1]->BringToFront();
- }
- }
- //---------------------------------------------------------------------------
- void Destruct() // Usuwanie Lini Srodka
- {
- Srodek[number - 1]->~TSrodek();
- number--;
- i--;
- }
- //---------------------------------------------------------------------------
- void __fastcall TForm1::SpeedButton1Click(TObject *Sender) // Tworzenie nowych obiektow: Kwadrat + Linia wyznaczajaca jego srodek
- {
- Size=Edit1->Text;
- Kwadrat[i] = new TKwadrat(this);
- Srodek[i] = new TSrodek(this);
- i++;
- number++;
- }
- //---------------------------------------------------------------------------
- int Center() // Wylicza czy dany klocek znajduje sie dokladnie w punkcie srodkowym poprzedniego
- {
- if(Kwadrat[number - 1]->Left + (Kwadrat[number - 1]->Width/2) == Kwadrat[number - 2]->Left + (Kwadrat[number - 2]->Width/2))
- {
- return 1;
- }
- 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)
- {
- return 2;
- }
- }
- //--------------------------------------------------------------------------
- void Center2() // Zmienia kolor srodkowej lini w przypadku, gdy znajduje się na punkcie stycznym
- {
- Srodek[number - 1]->Width = 2;
- Srodek[number - 1]->Pen->Color = 0x000500CE;
- Srodek[number - 1]->BringToFront();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement