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. |