Schummeleditor für Pong-Bestenliste
-
Hallo,
ich komme nicht so recht weiter.
Ich soll einen Schummeleditor für die Bestenliste eines Pong-Spiels programmieren.
Mit dem Editor soll eine Änderung der Punktzahlen und Spielernamen von außen möglich sein und er soll immer fest 10 Einträge enthalten.
Ich habe eine Datei score.h im Pong-Spiel, die entsprechende Funktionen zum Erzeugen, Sortieren, Laden und Speichern enthält.
Diese Datei habe ich bereits in mein neues Projekt aufgenommen.
Jetzt weiß ich nur nicht so recht, wie ich die Methoden der Datei an das neue Projekt anpassen muss bzw. welche neuen Methoden ich programmieren muss.
Der Schummeleditor an sich enthält nur jeweils 10 Text-Boxen für die Punkte und die Namen und einen Lesen, Speichern und Beenden Button.Hier die Datei score.h:
using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; //für den Zugriff auf die Dateien using namespace System::IO; //die Klasse für die Liste //Sie muss von der Klasse IComparable erben ref class Liste:IComparable { //die Attribute private: Int32 listePunkte; String ^listeName; //die Methoden public: //der Konstruktor Liste() { //er setzt die Punkte und den Namen auf Standard-Werte listePunkte = 0; listeName = "Nobody"; } //die Vergleichsmethode virtual Int32 CompareTo(Object ^objekt) { Liste^ tempListe = safe_cast<Liste^> (objekt); if (this->listePunkte < tempListe->listePunkte) return 1; if (this->listePunkte > tempListe->listePunkte) return -1; else return 0; } //die Methode zum Setzen von Einträgen Void setzeEintrag(Int32 punkte, String ^name) { listePunkte = punkte; listeName = name; } //die Methode zum Liefern der Punkte Int32 lieferePunkte() { return listePunkte; } //die Methode zum Liefern des Namens String^ liefereName() { return listeName; } }; ref class Score { //die Attribute private: Int32 punkte; //die Anzahl der Einträge in der Liste static Int32 anzahl = 10; //für die Liste array <Liste^> ^bestenliste; //für den Dateinamen String ^dateiname; //die Methoden public: //der Konstruktor Score() { punkte = 0; //eine neue Instanz der Liste erzeugen bestenliste = gcnew array <Liste^>(anzahl); //die Elemente initialisieren for (Int32 i = 0; i < anzahl; i++) bestenliste[i] = gcnew Liste(); //den Dateinamen aus dem Pfad zusammenbauen dateiname = Application::StartupPath + "\\score.dat"; //wenn es die Datei gibt, die Daten lesen if (IO::File::Exists(dateiname)) lesePunkte(); } //zum Verändern der Punkte Int32 veraenderePunkte(Int32 anzahl) { punkte = punkte + anzahl; return punkte; } //zum Zurücksetzen der Punkte Void loeschePunkte() { punkte = 0; } //handelt es sich um eine neue Bestleistung? Boolean neuerEintrag() { String ^tempName; //wenn die aktuelle Punktzahl größer ist als der letzte Eintrag der Liste, //wird der letzte Eintrag der Liste überschrieben und die Liste neu sortiert if (punkte > bestenliste[anzahl-1]->lieferePunkte()) { //den Namen beschaffen pong::nameDialog ^neuerName = gcnew pong::nameDialog(); if (neuerName->ShowDialog() == ::DialogResult::OK) tempName = neuerName->liefereName(); neuerName->Close(); bestenliste[anzahl-1]->setzeEintrag(punkte, tempName); Array::Sort(bestenliste); schreibePunkte(); return true; } else return false; } //die Liste ausgeben Void listeAusgeben(Graphics ^zeichenflaeche, RectangleF flaeche) { //ein temporärer Pinsel SolidBrush ^tempPinsel = gcnew SolidBrush(Color::White); //die Schriftart setzen System::Drawing::Font ^tempSchrift = gcnew System::Drawing::Font("Arial", 12, System::Drawing::FontStyle::Bold); //für die zentrierte Ausgabe System::Drawing::StringFormat ^ausrichtung = gcnew System::Drawing::StringFormat(); //Koordinaten für die Ausgabe Single punkteX, nameX, y; punkteX = flaeche.Left + 50; nameX = flaeche.Left + 250; y = flaeche.Top + 50; //die Ausrichtung ist zentriert ausrichtung->Alignment = System::Drawing::StringAlignment::Center; //die Zeichenfläche löschen zeichenflaeche->Clear(Color::Black); //den Titel ausgeben zeichenflaeche->DrawString("Bestenliste", tempSchrift, tempPinsel, flaeche.Width/2, y, ausrichtung); //und nun die Liste selbst for (Int32 i=0; i < anzahl; i++) { y = y + 20; zeichenflaeche->DrawString(Convert::ToString(bestenliste[i]->lieferePunkte()), tempSchrift, tempPinsel, punkteX, y); zeichenflaeche->DrawString(bestenliste[i]->liefereName(), tempSchrift, tempPinsel, nameX, y); } //wieder aufräumen delete tempPinsel; } //zum Lesen aus der Datei Void lesePunkte() { //zum Zwischenspeichern der gelesenen Daten Int32 tempPunkte; String ^tempName; //eine neue Instanz von FileStream erzeugen //die Datei soll geöffnet werden FileStream ^fStream = gcnew FileStream(dateiname, FileMode::Open); //eine neue Instanz von BinaryReader auf der Basis von fStream erzeugen BinaryReader ^binaerDatei = gcnew BinaryReader(fStream); //die Einträge lesen und zuweisen for (Int32 i = 0; i < anzahl; i++) { //die Punkte tempPunkte = binaerDatei->ReadInt32(); //den Namen tempName = binaerDatei->ReadString(); //und jetzt zuweisen bestenliste[i]->setzeEintrag(tempPunkte, tempName); } //BinaryReader schließen binaerDatei->Close(); //und auch den Stream wieder fStream->Close(); } //zum Schreiben in die Datei Void schreibePunkte() { //eine neue Instanz von FileStream erzeugen //die Datei soll entweder geöffnet oder neu erzeugt werden FileStream ^fStream = gcnew FileStream(dateiname, FileMode::Create); //eine neue Instanz von BinaryWriter auf der Basis von fStream erzeugen BinaryWriter ^binaerDatei = gcnew BinaryWriter(fStream); //die Einträge in die Datei schreiben for (Int32 i = 0; i < anzahl; i++) { //die Punkte binaerDatei->Write(bestenliste[i]->lieferePunkte()); //und dann den Namen binaerDatei->Write(bestenliste[i]->liefereName()); } //BinaryWriter schließen binaerDatei->Close(); //und auch den Stream wieder fStream->Close(); } };
Ich hoffe, jemand kann mir weiterhelfen.
Wenn noch mehr Infos nötig sind, bitte melden.Danke und Gruß
Proggimaster
-
Ist hier niemand, der mir helfen kann?
So viele Zugriffe, aber keiner sagt etwas dazu?
-
Sollen wir hier erraten was nicht geht!?
Was hast Du schon gemacht um den Code Deinem Projekt anzupassen!?
Stelle vernünftige Fragen, dann bekommst Du auch Hilfe.Gruß
Doug_HH
-
Entschuldigung, wenn ich mich dumm anstelle, aber ich habe doch im ersten Post eigentlich alles genau beschrieben.
Aber ich versuche es noch etwas genauer:
Ich habe noch nichts an der score.h-Datei verändert, sondern sie bisher nur ins Schummeleditor-Projekt eingefügt.
Ich weiß halt nicht, welche Methoden bzw. Anweisungen ich bearbeiten muss, damit ich sie mit dem Schummeleditor nutzen kann.
Ich möchte über den Laden-Button des Editors die Namen und die Punkte in die jeweils 10 Text-Boxen laden lassen, diese bearbeiten können und anschließend über den Speichern-Button absichern.
Bei einem erneuten Start des Editors sollen über den Laden-Button dann meine "geschummelten" Einträge wieder geladen werden, damit ich sie gegebenfalls erneut bearbeiten und wieder speichern kann.
Ist das soweit verständlich?Danke und Gruß
Proggimaster
-
Ja, alles supi verständlich. Du kannst nicht programmieren, und suchst jetzt jmd. der die Hausübung für dich macht.
-
Ich glaube Du wirst hier niemanden finden, der Dir Dein Projekt der gefunden Header anpasst.
Das speichern musst Du extern machen, sprich in eine XML, Datenbank oder Text-Datei, whatever.Du solltest wirklich etwas Eigeninitiative zeigen.
Solltest Du dann Fragen haben, sind wir auf sicher für Dich da.Gruß
Doug_HH
-
@ Doug_HH: OK das mit der Eigeninitiative verstehe ich schon.
Leider komme ich irgendwie nicht mit der score-Datei zurecht und versuche daher nun, alles komplett neu zu programmieren (mit einer XML Datei).
Die Werte, die ich eingebe, werden wunderbar über den Speichern Button gesichert.
Die XML Datei sieht von der Struktur her auch fehlerfrei aus.
Nur das Laden bereitet mir Kopfschmerzen.
Wie bekomme ich die Werte in die einzelnen Textboxen geschrieben, wenn ich auf den Laden Button klicke?
Hier mal mein Quelltext:{ InitializeComponent(); // //TODO: Konstruktorcode hier hinzufügen. // //den Dateinamen für die XML-Datei setzen xmlDateiname = IO::Path::ChangeExtension(Application::ExecutablePath, ".xml"); } //speichert die Einstellungen Void schreibeEinstellungen() { //die Einstellungen setzen XmlWriterSettings ^einstellungen = gcnew XmlWriterSettings; einstellungen->Indent = true; //eine Instanz für XmlWriter erzeugen XmlWriter ^xmlSchreiben = XmlWriter::Create(xmlDateiname, einstellungen); //die Deklaration schreiben xmlSchreiben->WriteStartDocument(); //den Wurzelknoten pong erzeugen xmlSchreiben->WriteStartElement("pong"); //den Knoten groesse erzeugen xmlSchreiben->WriteStartElement("ergebnis"); //die Einträge schreiben xmlSchreiben->WriteElementString("punkte", Convert::ToString(textBox1->Text)); xmlSchreiben->WriteElementString("name", Convert::ToString(textBox2->Text)); xmlSchreiben->WriteElementString("punkte", Convert::ToString(textBox3->Text)); xmlSchreiben->WriteElementString("name", Convert::ToString(textBox4->Text)); xmlSchreiben->WriteElementString("punkte", Convert::ToString(textBox5->Text)); xmlSchreiben->WriteElementString("name", Convert::ToString(textBox6->Text)); xmlSchreiben->WriteElementString("punkte", Convert::ToString(textBox7->Text)); xmlSchreiben->WriteElementString("name", Convert::ToString(textBox8->Text)); xmlSchreiben->WriteElementString("punkte", Convert::ToString(textBox9->Text)); xmlSchreiben->WriteElementString("name", Convert::ToString(textBox10->Text)); xmlSchreiben->WriteElementString("punkte", Convert::ToString(textBox11->Text)); xmlSchreiben->WriteElementString("name", Convert::ToString(textBox12->Text)); xmlSchreiben->WriteElementString("punkte", Convert::ToString(textBox13->Text)); xmlSchreiben->WriteElementString("name", Convert::ToString(textBox14->Text)); xmlSchreiben->WriteElementString("punkte", Convert::ToString(textBox15->Text)); xmlSchreiben->WriteElementString("name", Convert::ToString(textBox16->Text)); xmlSchreiben->WriteElementString("punkte", Convert::ToString(textBox17->Text)); xmlSchreiben->WriteElementString("name", Convert::ToString(textBox18->Text)); xmlSchreiben->WriteElementString("punkte", Convert::ToString(textBox19->Text)); xmlSchreiben->WriteElementString("name", Convert::ToString(textBox20->Text)); //den Knoten abschließen xmlSchreiben->WriteEndElement(); //alle abschließen xmlSchreiben->WriteEndDocument(); //Datei schließen xmlSchreiben->Close(); } //liest die Einstellungen Void leseEinstellungen() { //gibt es die Datei? if (IO::File::Exists(xmlDateiname) == false) return; //eine Instanz von XmlReader erzeugen XmlReader ^xmlLesen = XmlReader::Create(xmlDateiname); //die Daten lesen und zuweisen xmlLesen->ReadToFollowing("punkte", textBox1->Text); xmlPunkte = Convert::ToInt32(xmlLesen->ReadElementString()); xmlLesen->ReadToFollowing("name", textBox2->Text); //die Datei wieder schließen xmlLesen->Close(); } protected: /// <summary> /// Verwendete Ressourcen bereinigen. /// </summary> ~Form1() { if (components) { delete components; } } //für den Namen der XML-Datei String ^xmlDateiname; //für die Punkte und Namen des Editors Int32 xmlPunkte; String ^xmlName;
private: System::Void buttonLesen_Click(System::Object^ sender, System::EventArgs^ e) { leseEinstellungen(); } private: System::Void buttonSpeichern_Click(System::Object^ sender, System::EventArgs^ e) { schreibeEinstellungen(); } private: System::Void buttonBeenden_Click(System::Object^ sender, System::EventArgs^ e) { Close(); }