C++ Builder XE5, Benötige dringend Hilfe
-
std::random_shuffle(Feld, Feld+42);
-
Letzteres mit std:: funktioniert leider auch nicht. Ich versuche mal den Code von Bashar.
-
So, das ganz simple hat auch nicht funktioniert. Total auffällig ist, dass, sobald ich <algorithm> hinzufüge, ich direkt 29 Fehler immer bekomme, und er springt dann in einen vordefinierten Quelltext und bleibt immer an folgender Zeile (und zwar an is empty) hängen:
// TEMPLATE CLASS unique_ptr SCALAR
template<class _Ty,
class _Dx = default_delete<_Ty> >
class unique_ptr
: public _Unique_ptr_base<_Ty, _Dx,
is_empty<_Dx>::value
|| is_same<default_delete<_Ty>, _Dx>::value>Ich verstehe nur nicht, dass es im Borland C++ Builder sowie auch im Turbo C++ immer geklappt hat, und nur in diesem XE5 solche Probleme macht. Wie gesagt, lasse ich random_shuffle ganz raus, läuft das Spiel einwandfrei, nur halt leider liegen die Paare nebeneinander.
-
Ich habe jetzt noch einige Dinge durchgespielt, kein Erfolg. Gro0es Fragezeichen im Kopf. Ich habe mal den Quelltext der kompletten memoryfeld.cpp kopiert, vielleicht könnt ihr da ja noch irgendwas finden. Also ohne random_shuffle, so wie jetzt im Code funktioniert es, soll aber so nicht sein.
//--------------------------------------------------------------------------- #pragma hdrstop #include "memoryfeld.h" #include "hauptformular.h" MemoryFeld::MemoryFeld() { int bild=0; int Feld[42]; OffeneKarten=0; player=0; Paare[0]=0; Paare[1]=0; //Inititalisere Aufgedeckt mit -1 for (int i=0; i<21; i++) for (int j=0; j<2; j++) { Aufgedeckt[i] [j].x=-1; Aufgedeckt[i] [j].y=-1; } //Belegen von Feld for (int i=0; i<42; i++) { Feld[i]=bild; if (((i+1) % 2 == 0)) bild++; } //Mischen von Feld randomize(); //Kopieren aus Feld in InitFeld for (int i=0; i<7; i++) for (int j=0; j<6; j++) { InitFeld[i][j]=Feld[j*7+i]; SpielFeld[i][j]=22; } } void MemoryFeld::KarteOeffnen(int x, int y) { int a=0; SpielFeld[x][y]=InitFeld[x][y]; OffeneKartenPos[OffeneKarten].x=x; 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; 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]) { SpielFeld[OffeneKartenPos[0].x] [OffeneKartenPos[0].y]=21; SpielFeld[OffeneKartenPos[1].x] [OffeneKartenPos[1].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 { SpielFeld[OffeneKartenPos[0].x] [OffeneKartenPos[0].y]=22; SpielFeld[OffeneKartenPos[1].x] [OffeneKartenPos[1].y]=22; } OffeneKarten=0; if ( (Paare[0]+Paare[1])!=21 ){ if ( (player==0 && treffer==0) || (player==1 && treffer==1) ) { player=1; ComputerZug(); } } if (Paare[0] < 10 && Paare[0] + Paare[1] == 21) { Form1->Label6->Caption=("Leider verloren! Der Computer hat gewonnen!"); }else if (Paare[1] < 10 && Paare[1] + Paare[0] == 21) { Form1->Label5->Caption=("Herzlichen Glückwunsch! Du hast gewonnen!"); } } 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) { x1=Aufgedeckt[i][0].x; y1=Aufgedeckt[i][0].y; x2=Aufgedeckt[i][1].x; y2=Aufgedeckt[i][1].y; found=1; } } if (found==1) KarteOeffnen(x2,y2); else { 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) ) { 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; } //--------------------------------------------------------------------------- #pragma package(smart_init)
-
Hast Du das alte Projekt konvertiert?
Wenn ja dann versuche mal ein neues Projekt anzulegen und dort Deine Dateien hinzuzufügen.
-
Nein, ich habe nicht das alte Projekt genommen. Ich habe das komplette Memory-Spiel neu programmiert, weil ich diesmal ein größeres Spielfeld genommen habe und auch größere Bildkarten. Ich könnte echt verzweifeln. Ich dachte, ich schaffe es bis Donnerstag, hat ja auch super am Wochenende geklappt, mich hinzusetzen, aber diese Fehlermeldung raubt mir den Verstand. Ich hab mich schon tod gegoogelt, aber komme zu keiner Lösung
-
Ich habe gesehen, dass du eine
memory.cpp
hast. Du hast nicht zufälligerweise auch einememory.h
, die sich mit dermemory.h
aus der C-Runtime beißt?
-
Ja, ich habe eine memory.cpp...das ist richtig...auch demzufolge eine memory.h, das macht das Programm dann automatisch. Vielleicht wäre es eine Option, wenn ich den Dateinamen ändere....sobald ich nachher wieder am Rechner bin, werde ich das mal ausprobieren.
Also meinst Du, ich sollte die memory.cpp auch unter einem anderen Dateinamen abspeichern und es dann nochmal versuchen?Danke, dass ihr mir helfen wollt. Ich bin mit meinem Latein nämlich tatsächlich mal am Ende.
-
Man kann solche Algorithmen im Notfall auch selbst programmieren. In etwa so (keine Zeit es hübsch zu machen, die Benutzung von rand ist so nicht wirklich toll):
template<typename Iter> void random_shuffle(Iter begin, Iter end) { for (Iter shuffled = begin; shuffled != end; ++shuffled) { int pick = rand() % (end - shuffled); swap(*shuffled, *(shuffled + pick)); } }
(benötigt Random-Access-Iteratoren)
-
Ja,die Idee, das selbst zu programmieren hatte ich auch schon. Ich wusste nur nicht genau, wie ich es anstellen soll. Ich sehe aber schon, dass Du ganz anders programmierst
ich glaube, ich habe das etwas anders gelernt, so dass ich gerade Probleme beim Lesen Deines Codes habe. Aber ich versuche jetzt mal etwas. Wahrscheinlich ist die Lösung wieder viel zu einfach, als dass ich darauf komme.
-
Hallo
hast du die Dateien schon einen neuen
Namen gegeben ?Mfg
Klaus
-
Ich versuche gerade, den algorithm selbst zu programmieren... mir ist aufgefallen, dass dieser Compiler, auch, wenn ich z. B. die Anwendung hauptformular.cpp nenne und das Projekt memory, er automatisch noch eine Headerdatei anlegt, die dem Grunde nach ohne Quelltext dann da steht. Oh mann.....wenn ich das mit dem Alorithmen jetzt nicht hinbekomme, versuche ich die Dateien umzubenennen.
-
Also jetzt bin ich total verwirrt.... an Klaus: ich habe eine h-datei aus dem projekt entfernt, weil mir das komisch vorkam und habe das komplette Projekt nochmal compiliert, ohne es auszuführen. Da kam schonmal keine Fehlermeldung und war ein Juhuu-Erlebnis. random_shuffle (Feld, Feld+42) steht drin und im Header sogar die #include <algorithm>.
Ich habe dann freudestrahlend das Programm ausgeführt und leider festgestellt, wenn ich die Karten aufdecke, weiterhin alle Paare nebeneinander liegen. Irgendetwas ist da nicht in Ordnung.....
-
Ich könnte gerade meinen imac samt Tastatur aus dem Fenster werfen. Ich weiß nicht, was ich jetzt verbockt habe, aber das Spielfeld ist weg.
Ich werde mich dransetzen und ganz von vorne beginnen. Ganz von vorne....und ein neues Projekt anlegen. Dann bin ich mal gespannt...