Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Borland C++ Builder » MemorySpiel mit Borland6

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
09.10.2005, 07:32 Uhr
~Manda El
Gast


Hallo erstmal,
bin gerade dabei ein memory-spiel fertig zu kriegen. läuft auch einiger maßen ganz gut, muss es allerdings jetzt erweitern. Da es jetzt ziemlich kompliziert geworden ist (für mich zumindest), blicke ich hier nicht mehr wirklich durch. Ist ziemlich viel code, ich könnte es auch jemanden per mail schicken der sich mit sowas auskennt und vielleicht lust hat sich damit zu beschäftigen. Brauche wirklich hilfe, komme überhaupt nich mehr weiter.
Also folgendes habe ich gemacht:
Ich habe 2Units angelegt(1. Hauptformular(HF), 2. Memoryfeld(MF))

HF sieht so aus:

C++:
void __fastcall TForm1:: DrawGrid1DblClick(TObject *Sender)
{
int x = DrawGrid1->Col;  //den Variablen die pos der zelle zuweisen
int y = DrawGrid1->Row;  //auf die doppel geklickt wurde

if(SpielFeld.OffeneKarten == 0 && SpielFeld.player == 1)//überprüfen ober s1(pc) zug beendet hat, wert mit 0 testen
   SpielFeld.player = 0; //wenn der zug beendet ist, ist s2(mensch) dran player0 also

if(SpielFeld.OffeneKarten == 0 && SpielFeld.player == 0)
{ //überprüfung ob noch keine karte umgdr ist, wenn nich, dann methode KarteOeffnen() mit der pos der karte auf den doppel geklickt wurde
      if(SpielFeld.SpielFeld[x][y] == 22)
         SpielFeld.KarteOeffnen(x,y);
}
else
if(SpielFeld.OffeneKarten == 1 && SpielFeld.player == 0)
{ //wenn karte bereits umgr ist, überprüfung ob die karte an der pos noch zugedeckt ist
        if(SpielFeld.SpielFeld[x][y] == 22) //vergleich mit der dem bildindex (22) für verdeckte karte
        {  //wenn zugedeckt dann methode KarteOeffnen() mit pos aufrufen
           SpielFeld.KarteOeffnen(x,y);
           Timer1->Enabled = 1;    //timer aktivieren
        }
}
DrawGrid1->Repaint(); //tabelle wird neu gezeichnet
}

void __fastcall TForm1:: Timer1Timer(TObject *Sender)
{
Timer1->Enabled = 0; //timer wird deaktiviert
SpielFeld.SchliesseKarten();
Label3->Caption=IntToStr(SpielFeld.Paare[0]);
Label4->Caption=IntToStr(SpielFeld.Paare[1]);

if(SpielFeld.Paare[0] < SpielFeld.Paare[1])
{
        Label5->Caption = "Computer gewinnt";
}
else
{
        Label5->Caption = "Mensch gewinnt";
}
if(SpielFeld.Paare[0] == SpielFeld.Paare[1])
{
        Label5->Caption = "Unentschieden";
}

DrawGrid1->Repaint();
}

MF sieht so aus:
MemoryFeld:: MemoryFeld()    //konstruktor
{
        int bild = 0;
        int Feld[42];
        OffeneKarten = 0;
        player = 0;
        Paare[0] = 0;
        Paare[1] = 0;

        for(int i=0; i<21; i++)
                for(int j=0; j<2; j++)
                {
                        Aufgedeckt[i][j].x = -1;
                        Aufgedeckt[i][j].y = -1;
                }

        for(int i=0; i<42; i++)
        {
                Feld[i] = bild;
                if(((i+1) % 2 == 0)) bild++;    //sorgt dafür, dass der Wert von 'bild' bei jedem 2. lauf erhöht wird
        }
        randomize();
        random_shuffle(Feld,Feld+42);

        for(int i=0; i<7; i++)
                for(int j=0; j<6; j++)
                {
                InitFeld[i][j] = Feld[j*7+i];   //man bewegt sich immer eine Zelle weiter, zufällig angeordneten werte werden in 'InitFeld' kopiert
                SpielFeld[i][j]= 22;            //das feld 'SpielFeld' wird belegt, auf allen pos mit wert 22
                }
}

void MemoryFeld:: KarteOeffnen(int x, int y)
{
        int a = 0;
        SpielFeld[x][y] = InitFeld[x][y];
        OffeneKartenPos[OffeneKarten].x = x; //OffeneKartenPos erhält die pos der aktuell umgedrehten karten, wenn keine umgr. dann 0 sonst 1
        OffeneKartenPos[OffeneKarten].y = y;

        if(Aufgedeckt[SpielFeld[x][y]][0].x != -1 && !(Aufgedeckt[SpielFeld[x][y]][0].x == x && Aufgedeckt[SpielFeld[x][y]][0].y == y) )
        a = 1;
        Aufgedeckt[SpielFeld[x][y]][a].x = x;//Speichern die pos der gerade umgdr. karten
        Aufgedeckt[SpielFeld[x][y]][a].y = y;
        OffeneKarten++;
}

void MemoryFeld:: SchliesseKarten()
{
        bool treffer = 0;

if(InitFeld[OffeneKartenPos[0].x][OffeneKartenPos[0].y] == InitFeld[OffeneKartenPos[1].x][OffeneKartenPos[1].y])
{//überprüfung ob die aufgedeckten karten gleich sind, greifen mit OffeneKartenPos auf die entsprechende Elemente im Feld InitFeld
  SpielFeld[OffeneKartenPos[0].x][OffeneKartenPos[0].y] = 21;
  for(int i=0; i<2; i++)
  {
   Aufgedeckt[InitFeld[OffeneKartenPos[i].x][OffeneKartenPos[i].y]][i].x = -1;
  }
   Paare[player]++;
   treffer = 1;
}
else
{  //karten werden wieder zu gedeckt, weil unterschiedlich
   SpielFeld[OffeneKartenPos[0].x][OffeneKartenPos[0].y] = 22;
   SpielFeld[OffeneKartenPos[1].x][OffeneKartenPos[1].y] = 22;
}
   OffeneKarten = 0;

   if( (Paare[0]+Paare[1]) != 21 ) //überprüfung ob alle paare aufgedeckt wurden
   {
     if( (player==0 && treffer==0) || (player==1 && treffer ==1) ) //sonst pc am zug
     {
       player = 1;
       ComputerZug();
     }
}
}

void MemoryFeld:: ComputerZug()
{
        int x1, y1, x2, y2, found = 0;
        randomize();
        for(int i=0; i<21; i++)
        {
                if(Aufgedeckt[i][0].x != -1 && Aufgedeckt[i][1].x != -1)
                {//überprüfen ob sich 2 gleiche bilder im element befinden, also beide wert !=-1 haben
                        x1 = Aufgedeckt[i][0].x;//pos auslesen und den variablen zuweisen
                        y1 = Aufgedeckt[i][0].y;
                        x2 = Aufgedeckt[i][1].x;
                        y2 = Aufgedeckt[i][1].y;
                        found = 1;
                }
        }
        found=(found && random(2));
        if(found == 1)
                KarteOeffnen(x2, y2);  //wenn gefunden, dann eine karte umdrehen, die anderen nach dem neu zeichen
        else
        {  //wenn kein paar gefunden, eine zufällige pos im spielfeld erzeugen
                do
                {
                        x1 = random(7);
                        y1 = random(6);
                }
                while(SpielFeld[x1][y1] != 22);
        if(Aufgedeckt[InitFeld[x1][y1]][0].x != -1 && !(Aufgedeckt[InitFeld[x1][y1]][0].x==x1 && Aufgedeckt[InitFeld[x1][y1]][0].y==y1) )
        {//testen ob sich die karten an der zufälligen pos im feld 'aufgedeckt' befinden + dann vergleichen
                KarteOeffnen(Aufgedeckt[InitFeld[x1][y1]][0].x, Aufgedeckt[InitFeld[x1][y1]][0].y);
        }
        else
        {
                do
                {
                        x2 = random(7);
                        y2 = random(6);
                }
                while(SpielFeld[x2][y2] != 22 || (x1==x2 && y1==y2));
                KarteOeffnen(x2,y2);
        }
        }
        KarteOeffnen(x1,y1);
        Form1->DrawGrid1->Repaint();
        Form1->Timer1->Enabled = 1;
}


Zu guter letz die klasse dazu:

C++:
struct pos{int x; int y;}; //zum speichern der position auf dem spielfeld

class MemoryFeld
{
public:
        MemoryFeld();
        void KarteOeffnen(int x, int y);      //wird aufgerufen, wenn umgedreht+anzeigen soll
        void SchliesseKarten();               //aufruf, wenn vom spielfeld nehmen oder umdrehen
        void ComputerZug();                   //spielzüge vom PC steuern
        int OffeneKarten;                     //speichert die anzahl der aufgedeckten karten
        int player;                           //nimmt die nr des spielers auf, 1=pc 0=mensch
        pos OffeneKartenPos[2];               //speichert die pos. aufgedeckten karten
        int Paare[2];                         //speichert die anzahl der paare, die aufgedeckt wurden
        int InitFeld[7][6];                   //speicherung der indizes der bilder
        int SpielFeld[7][6];                  //speichert den aktuellen zustand des spielfeldes
        pos Aufgedeckt[21][2];                //speichert die pos der karten, die 1x aufgedeckt wurden
};


Also, ist schon ziemlich viel code, und ehrlich gesagt weis ich nicht genau ob das (alles) hier rein gehört, aber ich versuchs trotzdem mal.
Folgendes Problem:
Ich muss nur ein Button ein meiner Anwenung haben ([Alles Aufdecken]), dass wie der name schon sagt, alles aufdeckt, wenn man darauf klickt. Aber nur für eine kurze zeit, dann wieder alles umderehen.
Hinweis: Bildindex 22 = die karte mit dem bild "verdeckt"; und 21 = "aufgedeckt";


Bearbeitung:
Quellcode formatiert

Dieser Post wurde am 09.10.2005 um 09:26 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.10.2005, 20:25 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
Holzhammermethode... Ohne Deinen Quellcode analysiert zu haben, aber:
Wo ist da Dein Problem? Von Deinen Paaren merkst Du Dir die Position. Du hast doch bestimmt Deckblätter, welche Du dann auf Visible false setzt.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe

Dieser Post wurde am 09.10.2005 um 20:26 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.10.2005, 23:10 Uhr
~Manda El
Gast


Ich muss einen 2.Timer benutzen das die Karten dann für ca 2sek aufdeckt und wieder umdreht. Das darf nur passieren wenn der 1.Timer deaktiviert ist. Hatte schon überlegt das in ein globales Feld zwischenzuspeichern, leider weiß ich nicht genau wo ich das machen sollte.
Naja, aber trotzdem danke, ich versuch mal weiter
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.10.2005, 23:51 Uhr
~Manda El
Gast


Hat keiner ne Idee?? Komme leider immer noch nicht weiter. Folgende Aufgabenstellung:
1. Das Feld "SpielFeld" in ein Globales Feld zwischenspeichern, welches genau soviele Dimensionen hat.
Hab in der Klasse dann noch diese 3methoden eingefügt:
int NSpielFeld; //zum zwischen speichern
void AllesUmdrehen();
void AllesAufdecken();
Zwischenspeichern dann wohl in der Methode "AllesAufdecken", habs so gemacht:
NSpielFeld[7][6] = SpielFeld[7][6];
weis aber nich ob es wirklich richtig ist.

2. Bereits Aufgedeckte Karten nicht verändern, also den Bildindex überprüfen von jeder Karte. Bildindex21 = "aufgedeckt"

Genau hier fängt das Problem an. Weiß einer von euch vielleicht weiter?? Vielleicht 2 geschachtelte for-schleifen benutzen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Borland C++ Builder ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: