Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pravljenje igre 'Sedmice' u Builderu! Pomoc!

[es] :: C/C++ programiranje :: Pravljenje igre 'Sedmice' u Builderu! Pomoc!

[ Pregleda: 2245 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Brolly

Član broj: 66668
Poruke: 363
*.DIALUP-SMIN.neobee.net.



Profil

icon Pravljenje igre 'Sedmice' u Builderu! Pomoc!25.05.2007. u 08:55 - pre 206 meseci
Ne bih sada da bas ulazim u detalje, dakle na formi imam 32 image-a, Image1, Image2, Image3, ... itd, sve do Image32, jer u 'Sedmicama' ucestvuju 32 karte. Sve karte imaju Tag-ove od 1 do 32, i pomocu njih im pristupam. E sad... Zna li neko kako bih mogao da kroz neku petlju prodjem sve karte u spilu, tj. postoji li nacin?

Dakle, glupo mi je da idem se:

Code:

if (Image1->Tag==n)
{
...
}
if (Image2->Tag==n)
{
...
}

.
.
.


Ovo je suvise naporno!


Ja sam pokusao sa ovim nesto (nemojte se smejati, nisam ja bas neki expert ):

Code:

TImage *Karta=dynamic_cast<TImage *>(Sender);

if (Karta->Tag==n)
...


ali ni to mi nije uspelo...

Nadam se da nisam u startu pogresno zamislio program... Valjda necu morati sve ispocetka.
Unapred hvala!
...
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
*.dsl.iskon.hr.



+9 Profil

icon Re: Pravljenje igre 'Sedmice' u Builderu! Pomoc!25.05.2007. u 09:53 - pre 206 meseci
To je nabolje napraviti pomoću dinamičke alokacije karti (Image-a). Uzmi prazan prozor (formu) i na njega stavi jedan gumb. Evo kako treba sve točno izgledati:

Code:

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

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TImage** Karta;
HINSTANCE Slike;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    Slike = LoadLibrary("cards.dll");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Karta = new TImage*[52];
    for(int i = 0; i < 52; i++)
        {
            Karta[i] = new TImage(this);
            Karta[i]->Left = 10 + i*10;
            Karta[i]->Top = 10 + (i%13)*20;
            Karta[i]->Parent = this;
            Karta[i]->Picture->Bitmap->LoadFromResourceID((int)Slike, i+1);
            Karta[i]->AutoSize = true;
        }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    for(int i = 0; i < 52; i++)
        delete Karta[i];
    delete[] Karta;
    FreeLibrary(Slike);
}
//---------------------------------------------------------------------------


Kada pritisneš gumb trebale bi ti se prikazati sve karte, a pojedinoj od njih pristupaš preko indeksa. Npr. Karta[3]. Znači, moraju se koristiti dvostruki pokazivači.



[Ovu poruku je menjao itf dana 25.05.2007. u 11:23 GMT+1]
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.tekostolac.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Pravljenje igre 'Sedmice' u Builderu! Pomoc!25.05.2007. u 10:07 - pre 206 meseci
Code:

// da se petljom prodje kroz sve TImage koji imaju tagove od 1 do 32 ...
// ... i ispita KOJI imju vrednost u (recimo) Edit1->Text
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   for ( int i = 0; i<ControlCount; i++ )
   {
      TImage* pImage = dynamic_cast<TImage*>( Controls[i] );
      if ( pImage )
      {
         if ( pImage->Tag >= 1 && pImage->Tag<=32 )
         {
            if ( pImage->Tag == StrToInt( Edit1->Text ) )
            {
               ShowMessage( pImage->Tag );
            }
         }
      }
   }
}

// da se na klik na bilo koji TImage ispita koji je Tag pridruzen tom Image-u
void __fastcall TForm1::ZajednickiImageClick(TObject *Sender)
{
   TImage* pImage = dynamic_cast<TImage*>( Sender );

   if ( pImage )
      ShowMessage( pImage->Tag );
}

 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.tekostolac.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Pravljenje igre 'Sedmice' u Builderu! Pomoc!25.05.2007. u 10:13 - pre 206 meseci
E sad, kad videh itf-ov odgovor, ne znam zbog cega ti treba petlja:

1. da napunis Image-e
2. da bi nesto ispitivao u vec popunjenim Image-ima

?
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
*.dsl.iskon.hr.



+9 Profil

icon Re: Pravljenje igre 'Sedmice' u Builderu! Pomoc!25.05.2007. u 10:22 - pre 206 meseci
Koliko mislim, njemu petlja treba da bi ispitao pojedinu kartu, ali ga muči problem pisanja uzastopnih if-ova. Zato sam napisao rješenje pristupa preko indesa... ako sam dobro skužio šta mu treba...
 
Odgovor na temu

Brolly

Član broj: 66668
Poruke: 363
*.dialup.neobee.net.



Profil

icon Re: Pravljenje igre 'Sedmice' u Builderu! Pomoc!25.05.2007. u 11:50 - pre 206 meseci
E uzeo sam X Files-ovo resenje... Mada ne radi bas uvek.

Preko Tag-ova planiram da ispitujem koja je koja karta. Npr. kecevi imaju tagove 1-4, sedmice od 5-8, ... , kraljevi 28-32. Namestio sam da se iz spila igracu nasumicno dodele 4 od 32 karte, lepo poredjaju jedna do druge, i isto tako i protivniku, samo sto se ne vide, logicno. E sad, iznad svakog Image-a ima jedan RadioButton, pomocu kojeg se bira karta, i dugme 'Igraj' da se baci karta.

Koristio sam X Files-ovo resenje ovako:

Code:

if (RadioButton4->Checked==true)
                {
                        for (i=0; i<=32; i++)
                        {
                                TImage* Karta=dynamic_cast<TImage*>(Controls[i]);
                                if (Karta->Tag==i && Karta->Left==496)     
//Prolazim kroz sve karte i trazim onu
//kojoj je pozicija ispod RadioButton4
                                {
                                        Karta->Top=160;
                                        Karta->Left=320;
//Ovde kartu pomeram na sredinu, kao da je bacena.
                                        ko_je_na_potezu=false;
                                        baceno=Karta->Tag;
                                }
                        }
                }
//ovako isto ide i za RadioButton1, RadioButton2 i RadioButton3.


I ovako napisano mi lepo radi.. Jedini problem je sto ovaj nacin 'prolaska' kroz sve karte spila ne radi uvek. Tacnije, NE RADI u funkcijama koje sam ja kreirao.

XFiles, mozes li mi malo objasniti kako zapravo ovaj deo koda funkcionise, da ne bih ovako kucao napamet? Sta je ovo Controls[p] (tj. i)?
...
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.tekostolac.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Pravljenje igre 'Sedmice' u Builderu! Pomoc!25.05.2007. u 12:37 - pre 206 meseci
Potpuno si izbacio deo koda:
for ( int i = 0; i<ControlCount; i++ )
i umesto njega si stavio:
for (i=0; i<=32; i++) ... da ne pricamo da ti ovde petlja ima 33 elementa

Dalje, nisi ispitao da li je dynamic_cast uspeo:
if ( Karta !=0 ) {}
(forma ima mnogo vise kontrola od TImage-a)

Zapravo nisi postavio petlju kako je gore napisano. Na osnovu tvog koda, onda uradi nesto ovako /netestirano/:

Code:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   // Ovo prolazi kroz sve kontrole na formi... ne yna se unapred da li je TImage...
   // ... to se odredjuje dinamickim kastovanjem (kasnije).
   for ( int i = 0; i<ControlCount; i++ )
   {
      // ovde se kastuje (ispituje da li je TImage)
      TImage* Karta = dynamic_cast<TImage*>( Controls[i] );
      // ovo je bitno da vidis da li je kontrola na formi tipa TImage...
      if ( Karta )
      {
         // ovo je bitno jer mozda imas jos neke TImage na formi...
         if ( Karta->Tag >= 1 && Karta->Tag<=32 )
         {

            // --- OVDE POCETAK TVOG SREDISNJEG DELA KODA ---
            if ( Karta->Tag== i && Karta->Left==496 )     
            {
               Karta->Top=160;
               Karta->Left=320;
               ko_je_na_potezu=false;
               baceno=Karta->Tag;
            }
            // --- OVDE KRAJ TVOG SREDISNJEG DELA KODA ---

         }
      }
   }
}


... pod uslovom da si dobro smislio logiku.

Ono sto ces i sam uskoro uvideti je da ce ti velike probleme praviti MAGIČNI BROJEVI (496, 160, 320, ...).



 
Odgovor na temu

Brolly

Član broj: 66668
Poruke: 363
*.DIALUP-SMIN.neobee.net.



Profil

icon Re: Pravljenje igre 'Sedmice' u Builderu! Pomoc!25.05.2007. u 18:42 - pre 206 meseci
E jbg... Pa sljaka mi ovako... jbg. :(


Citat:
X Files
... da ne pricamo da ti ovde petlja ima 33 elementa


E to sam pogresno prekucao ovde na forum! U programu mi stoji

Code:
for(i=1; i<=32; i++)

Dakle, 32 elementa.

Citat:
X Files

Ono sto ces i sam uskoro uvideti je da ce ti velike probleme praviti MAGIČNI BROJEVI (496, 160, 320, ...).

Zbog cega?
...
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Pravljenje igre 'Sedmice' u Builderu! Pomoc!25.05.2007. u 20:14 - pre 206 meseci
Gledaj ovako, ako odlučiš da promeniš veličinu TImage objekata, onda automatski moraš
da menjaš i te MAGIČNE BROJEVE (kako ih obično zovu). Sve je to trivijalno u manjim
projektima, ali pravi glavobolje svakako.

Zar nije bolje da te koordinate računski (matematički) određuješ i više ne razmišljaš o njima?

To je stvar dizajna i dobre prakse.

TImage ima Left, Top, Width i Height osobine, koje možeš lako upotrebiti da izračunaš te
vrednosti koje si upisivao kao konstante.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Pravljenje igre 'Sedmice' u Builderu! Pomoc!

[ Pregleda: 2245 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.