Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

Delmaq

Gra memory w Borlandzie C++

Polecane posty

Witam. Otóż jestem amatorem programowanie i musze zrobić grę typu memory (czyli zapamietywanie i dopieranie w pary dwoch kart :) ). Mam problem, nie potrafie zrobic tak by kart po odkryciu wracaly do stanu zakrytego. Gdy wybiore 2 te same karty wszystko jest ok znikaja i gitara, ale gdy wybiore juz jedna dobra i jedna zla to niestety pozostaja odkryte :(.

Karty sa porownywane na podstawie parametru Tag. (Kazda para kart ma odpowiedni numerek). Gdy sa identyczne to znikaja, gdy sa nieidentyczne to wszystkie przybieraja podstawowa grafike (main.jpg). Niestety coś nie dizała nie wiem co, skonczyly mi sie pomysly. Bardzo bym prosił o pomoc bo mam nóż na gardle :P.

Tutaj daje link do calego projektu a poniżej kodzik :).

http://www.speedyshare.com/files/20495107/Memory.zip

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

#include <vcl.h>
#pragma hdrstop

#include "Memo.h"
int klik = 0;
int tagi = 0;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1Click(TObject *Sender)
{
Image1->Picture->LoadFromFile("1.jpg");
klik=klik+1;
if (klik==1)
{
tagi=Image1->Tag;
};
while(klik==2)
{
        if(tagi==Image1->Tag)
        {
                Image1->Visible=false;
                Image2->Visible=false;
                klik=0;
        }
        else
        {
         klik=0;
         Image1->Picture->LoadFromFile("main.jpg");
        };
};
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Image2Click(TObject *Sender)
{
Image2->Picture->LoadFromFile("1.jpg");
klik=klik+1;
if (klik==1)
{
tagi=Image2->Tag;
};
while(klik==2)
{
        if(tagi==Image2->Tag)
        {
                Image1->Visible=false;
                Image2->Visible=false;
                klik=0;
        }
        else
        {
         klik=0;
         ((TImage*)Sender)->Picture->LoadFromFile("main.jpg");
        };
};
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image3Click(TObject *Sender)
{
Image3->Picture->LoadFromFile("2.jpg");
klik=klik+1;
if (klik==1)
{
tagi=Image3->Tag;
};
while(klik==2)
{
        if(tagi==Image3->Tag)
        {
                Image3->Visible=false;
                Image4->Visible=false;
                klik=0;
        }
        else
        {
         klik=0;
         ((TImage*)Sender)->Picture->LoadFromFile("main.jpg");
        };
};
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Image4Click(TObject *Sender)
{
Image4->Picture->LoadFromFile("2.jpg");
klik=klik+1;
if (klik==1)
{
        tagi=Image4->Tag;
};
while(klik==2)
{
        if(tagi==Image4->Tag)
        {
                Image3->Visible=false;
                Image4->Visible=false;
                klik=0;
        }
        else
        {
                klik=0;
                ((TImage*)Sender)->Picture->LoadFromFile("main.jpg");
        };
};
}
//---------------------------------------------------------------------------


void __fastcall TForm1::FormCreate(TObject *Sender)
{
Label1->Caption=klik;
}
//---------------------------------------------------------------------------

Wdzieczny bylbym za wszelkie uwagi i wskazówki.

Link do komentarza
Udostępnij na innych stronach

Uwagę mam taką, że w Image1Click, Image2Click, Image3Click i Image4Click łamiesz zasadę Don't Repeat Yourself. Możesz z tego zrobić jedną metodę i podpiąć ją pod każdą kontrolkę. Unikniesz wtedy duplikacji kodu w programie i zyskasz na czytelności.

Coś w tym stylu. Nie wiem nawet czy zadziała, bo nie mam Borland Builder-a. Pewnie będą jakieś błędy.

void __fastcall TForm1::CardClick(TObject *Sender)
{
        klik++;
        LoadCard((TImage*)Sender);
        if (klik == 2)
        {
                HideConnectedCards((TImage*)Sender);
                klik = 0;
        };
        tagi = (TImage*)Sender -> Tag;
}

void __fastcall TForm1::HideConnectedCards(TImage *Sender)
{
// jeśli nie kliknalem dwoch kart o tym samym tagu
// przeładowuje wszystkie karty i nie mam co sprawdzać
// jeśli kliknąłem kartę która ma taki sam tag jak poprzednia kliknięta
// to ukrywam te dwie powiązane ze sobą karty

        if (! (Sender -> Tag == tagi) )
        {
                ReloadAllCards();
                klik = 0;
                return;
        }

// kod niżej - też jest do poprawy -  ja sam łamię tu zasadę DRY
// haha, i w zasadzie ten kod działałby bez odczytywania tagów
// ale to jest fatalne rozwiązanie, bo co gdy nagle zechcesz mieć 100 kart???

        if (Sender == Image1 || Sender == Image2)
        {
                                Image1 -> Hide();
                                Image2 -> Hide();
        }
        if (Sender == Image3 || Sender == Image4)
        {
                                Image3 -> Hide();
                                Image4 -> Hide();
        }
}

void __fastcall TForm1::ReloadAllCards()
{
//tu też łamana jest zasada DRY !!!
//Co gdy nagle zechcesz mieć 100 kart???

                Image1 -> Picture -> LoadFromFile("main.jpg");
                Image2 -> Picture -> LoadFromFile("main.jpg");
                Image3 -> Picture -> LoadFromFile("main.jpg");
                Image4 -> Picture -> LoadFromFile("main.jpg");
}

void __fastcall TForm1::LoadCard(TImage *Sender)
{
//tu też łamana jest zasada DRY !!!
//Co gdy nagle zechcesz mieć 100 kart???

//poza tym nawet w takim kodzie powinien być tu "switch" zamiast kilku "if-ów"

        if (Sender == Image1)
        {
                Image1 -> Picture -> LoadFromFile("1.jpg");
                return;
        }
        if (Sender == Image2)
        {
                Image2 -> Picture -> LoadFromFile("2.jpg");
                return;
        }
        if (Sender == Image3)
        {
                Image3 -> Picture -> LoadFromFile("3.jpg");
                return;
        }
        if (Sender == Image4)
        {
                Image4 -> Picture -> LoadFromFile("4.jpg");
                return;
        }
}

Proszę.

Przy okazji, przy tym kodzie - jak klikniesz dwa razy na tą samą kartą to stanie się śmieszna rzecz:P

Popraw sobie bloki kodu łamiące zasadę DRY.

Unikaj polskich nazw w programach, nie nazywaj kontrolek proponowanymi nazwami (Image1, Form1 etc.) bo to niechlujnie.

Link do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...