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))
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";
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))
Code:
HAUPTFORMULAR:
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();
}
MEMORYFELD:
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;
}
und die KLASSE:
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";