• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[CR] Obiektowy C++ (#10): Timery. Własny zegar. Gra Arkanoid

VPS Starter Arubacloud
+1 głos
2,084 wizyt
pytanie zadane 24 maja 2016 w Nasze poradniki przez Mirosław Zelent Nałogowiec (34,750 p.)

CR = Code Review. O co chodzi? Zajrzyj tutaj
Pełna lista wszystkich Code Review? Zajrzyj tutaj

https://www.youtube.com/watch?v=I_vW4KQ99Yk

Licznik - Unit1.cpp:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "trayicon"
#pragma resource "*.dfm"
TForm1 *Form1;

int s=3666;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
    s--;
    int godzin,minut,sekund;
    AnsiString godz,min,sek;

    godzin=s/3600;
    godz=IntToStr(godzin);
    if(godzin<10) godz="0"+godz;

    minut=(s-godzin*3600)/60;
    min=IntToStr(minut);
    if(minut<10) min="0"+min;

    sekund=s-godzin*3600-minut*60;
    sek=IntToStr(sekund);
    if(sekund<10) sek="0"+sek;

    Label1->Caption=godz+":"+min+":"+sek;

    if(s<=0)
    {
        Label1->Caption="KONIEC CZASU";
        Timer1->Enabled=false;
    }
}
//---------------------------------------------------------------------------

Arkanoid - Unit1.cpp:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

int x=-8, y=-8;
int do_wygranej=12;

bool kolizja(TImage *pilka, TImage *cegla)
{
   if( pilka->Left >= cegla->Left-pilka->Width && pilka->Left <= cegla->Left+cegla->Width &&
       pilka->Top >= cegla->Top-pilka->Height && pilka->Top <= cegla->Top+cegla->Height)
      return true;
      else return false;
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer_pilkaTimer(TObject *Sender)
{
    b->Left+=x; b->Top+=y;

    //odbij od lewej sciany
    if (b->Left-5 <= tlo->Left) x=-x;

    //odbij od górnej sciany
    if (b->Top-5 <= tlo->Top) y=-y;

   //odbij od prawej sciany
    if (b->Left+b->Width+5 >= tlo->Width) x=-x;

    //skucha!
    if (b->Top >= p->Top+p->Height+15)
    {
        Timer_pilka->Enabled = false;
        b->Visible=false;
        Button1->Caption = "Porażka! Jeszcze raz?";
        Button1->Visible=true;
    }
    //odbicie pilki (b) od paletki (p)
    else if(b->Left > p->Left-b->Width/2 && b->Left < p->Left+p->Width &&
       b->Top+b->Height > p->Top)
       {
               if (y>0) y=-y;
       }
    //wygrana = zlikwidowanie wsyzstkich blokow
     if (do_wygranej<=0)
     {
        Timer_pilka->Enabled = false;
        b->Visible=false;
        Button1->Caption = "Wygrana! Jeszcze raz?";
        Button1->Visible=true;
     }
     
    //blok1
    if (kolizja(b,Image1) && Image1->Visible==true) {x=-x; y=-y; do_wygranej--; Image1->Visible=false;}
    //blok2
    if (kolizja(b,Image2) && Image2->Visible==true) {x=-x; y=-y; do_wygranej--; Image2->Visible=false;}
    //blok3
    if (kolizja(b,Image3) && Image3->Visible==true) {x=-x; y=-y; do_wygranej--; Image3->Visible=false;}
    //blok4
    if (kolizja(b,Image4) && Image4->Visible==true) {x=-x; y=-y; do_wygranej--; Image4->Visible=false;}
    //blok5
    if (kolizja(b,Image5) && Image5->Visible==true) {x=-x; y=-y; do_wygranej--; Image5->Visible=false;}
    //blok6
    if (kolizja(b,Image6) && Image6->Visible==true) {x=-x; y=-y; do_wygranej--; Image6->Visible=false;}
    //blok7
    if (kolizja(b,Image7) && Image7->Visible==true) {x=-x; y=-y; do_wygranej--; Image7->Visible=false;}
    //blok8
    if (kolizja(b,Image8) && Image8->Visible==true) {x=-x; y=-y; do_wygranej--; Image8->Visible=false;}
    //blok9
    if (kolizja(b,Image9) && Image9->Visible==true) {x=-x; y=-y; do_wygranej--; Image9->Visible=false;}
    //blok10
    if (kolizja(b,Image10)&& Image10->Visible==true) {x=-x; y=-y; do_wygranej--; Image10->Visible=false;}
    //blok11
    if (kolizja(b,Image11) && Image11->Visible==true) {x=-x; y=-y; do_wygranej--; Image11->Visible=false;}
    //blok12
    if (kolizja(b,Image12) && Image12->Visible==true) {x=-x; y=-y; do_wygranej--; Image12->Visible=false;}

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
  if(Key==VK_LEFT) lewo->Enabled=true;
  if(Key==VK_RIGHT) prawo->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
  if(Key==VK_LEFT) lewo->Enabled=false;
  if(Key==VK_RIGHT) prawo->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::lewoTimer(TObject *Sender)
{
    if (p->Left>10) p->Left-=10;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::prawoTimer(TObject *Sender)
{
    if (p->Left+p->Width<tlo->Width-10) p->Left+=10;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
     b->Left=100; b->Top=100;
     p->Left=320;
     b->Visible=true;
     x=-8;
     y=-8;
     Timer_pilka->Enabled=true;
     Button1->Visible=false;
     do_wygranej=12;
     Image1->Visible=true; Image5->Visible=true; Image9->Visible=true;
     Image2->Visible=true; Image6->Visible=true; Image10->Visible=true;
     Image3->Visible=true; Image7->Visible=true; Image11->Visible=true;
     Image4->Visible=true; Image8->Visible=true; Image12->Visible=true;
}
//---------------------------------------------------------------------------

Paczka z odcinka: POBIERZ​

2 odpowiedzi

+1 głos
odpowiedź 24 maja 2016 przez maly Nałogowiec (37,190 p.)

Odnośnie programu Licznik, do pracy z czasem i datą służy klasa TDateTime, ale co tam niech będzie;)

 

Jeśli chodzi o Arkanoid to:

if (kolizja(b,Image1) && Image1->Visible==true)

nie ma potrzeby sprawdzać czy jest kolizja jeśli Image jest niewidoczny, zbędny jest też zapis '==true'.

if (Image1->Visible && kolizja(b,Image1))

 

a skoro jednym z warunków kolizji jest widoczność objektu(Image), to sprawdzenie tego mogłoby być w funkcji kolizja.

bool kolizja(TImage *pilka, TImage *cegla)
{
	if( cegla->Visible
		&& pilka->Left >= cegla->Left-pilka->Width 
		&& pilka->Left <= cegla->Left+cegla->Width 
		&& pilka->Top >= cegla->Top-pilka->Height 
		&& pilka->Top <= cegla->Top+cegla->Height)
	{
		return true;
	}
	
	return false;
}

wtedy if-y skracają się do formy

if (kolizja(b,Image1))

 

Gdyby wszystkie cegły były w jakiejś tablicy, tak jak powinny być, to cały zestaw if-ów zastąpiłaby prosta pętla.

for(int i = 0; i < ilosc_cegiel; ++i)
{
	if(kolizja(b,cegly[i]))
	{
		x=-x; 
		y=-y; 
		do_wygranej--; 
		cegly[i]->Visible=false;
	}
}

 

0 głosów
odpowiedź 30 stycznia 2017 przez jakobosik Początkujący (340 p.)
Cześć,

mam pytanie co do zadania domowego. Zrobiłem już cały program, zapisuje on licznik do pliku przy zamykaniu pliku krzyżykiem, uruchamia się przy autostarcie itd. Nie wiem jednak jak dodać opcję by zapisywał on czas do pliku przy zamykaniu systemu. Tj. klikam zamknij program - wszystko w porządku zapisuje się tak jak chce. Jednak jeśli wyłączę komputer, nie wyłączając aplikacji to ona tego timera nie zapisze, przez co jest tak na prawdę bezużyteczna.

 

Wyczytałem, że windows wysyła coś takiego jak WM_QUERYENDSESSION przy zamykaniu systemu i podobno to jakoś można wykorzystać do opóźnienia zamykania na tyle by zapisać dane, jednak totalnie nie rozumiem jak można tego użyć. Byłbym wdzięczny za porady.

Ps. Moje dodawanie do Austostart-u też jest kulawe, bo nie mogę odkryć jak pobrać ścieżkę do folderu Autostart użytkownika (bo ścieżka ma w sobie nazwę użytkownika, więc na każdym komputerze jest inna). U mnie to jest rozwiązane komunikatem by użytkownik sam sobie wrzucił skrót do folderu który powinien być tu i tu, ale to prowizorka.

Pozdrawiam

Jakobosik

Podobne pytania

0 głosów
1 odpowiedź 664 wizyt
+3 głosów
0 odpowiedzi 1,657 wizyt
+1 głos
0 odpowiedzi 2,000 wizyt

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...