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();
    		 }
    

Anmelden zum Antworten