Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo liebe Community,

ich habe eine Frage zu meinem Programm, das ich mit WindowsFormsApplication erstellen muss.

Ich habe ein Programm geschrieben, das letztendlich als TextAdventure funktionieren soll.

Sprich: Man hat ein großes Fenster in dem sich 2 Textboxen befinden. Die eine Textbox als Eingabezeile und die Andere als Ausgabezeilen(letztere ist eine Multiline Textbox)
Ich habe für das Programm mehrere Klassen geschrieben, die verschiedene Teile des Programms darfstellen.
class Room <-- Definiert die einzelnen Bereiche, durch die ein Spieler sich bewegen kann, diese Räume haben bis zu 4 Ausgänge(für je eine Himmelsrichtung einen)
class Person <-- Die Klasse ist erstmal uninteressant.
class Spieler <-- Der Spieler, der mit seinen Methoden auf die Räume zugreift, bzw über den auf die Räume zugegriffen wird.

Nun zu meinem Problem:
Mein Problem hört sich recht simpel an und wahrscheinlich ist die Lösung eben so simpel, aber ich checke das irgendwie nicht.
Ich definiere in der Klasse Room die Parameter vor, die man benötigt um einen Raum zu erstellen.
 

public class Room
    {
        //Klassenattribute
        public string name;
        public int room_numberX;
        public int room_numberY;
        public string desc_short;
        public string describtion;
        public bool neighbor_north;
        public bool neighbor_east;
        public bool neighbor_south;
        public bool neighbor_west;
        public string weather;
        public string items;
        public Room n_north;
        public Room n_east;
        public Room n_south;
        public Room n_west;
        public Room badEnd;


        //
        //Initialisierung eines Standartobjektes der Klasse Raum
        //
        public Room(int positionX, int positionY, string name, string describtion, string weather)
        {
            name = "Der Raum scheint keinen Namen zu haben";
            room_numberX = positionX;
            room_numberY = positionY;
            desc_short = "Auf den ersten Blick scheint dieser Raum keine passende Beschreibung zu haben";
            describtion = "Es scheint so, als habe noch niemand diesen Raum ordentlich beschrieben";
            neighbor_north = false;
            neighbor_east = false;
            neighbor_south = false;
            neighbor_west = false;

            weather = "Du entdeckst im gesamten Raum keine Fenster";
            items = "Gar nichts...!";
        }
  		// Hier folgen die Methoden der Klasse Raum
  		// ...
		// ...
	}

Soweit so gut.
Wenn ich nun neue Räume im Hauptprogramm erstelle, dann läuft das ganze auch auf keinen Fehler.

public partial class Form1 : Form
    {
        Spieler Spieler1;
		Room EndofWorld = new Room(-1000, -1000, "No Name", "No Describtion", "no Weather");
  		//...
  		//...
  		//...

Ich erstelle hier auch den Spieler und prüfe etwas später mit if (Spieler1 != null). Das funktioniert auch noch soweit, wie geplant.
Aber:
Wenn ich nun aus dem Hauptprogramm heraus auf  Variablen eines Raums zugreifen will, dann sind die Variablen leer oder können nicht abgerufen werden.
 

//Eine Methode von Form1
private void bt_start_Click(object sender, EventArgs e)
	{
		tb_main.AppendText(EndofWorld.name + " ...!!" + Environment.NewLine);
	}

In der Textbox wird nun nur "...!!" ausgegeben.

Kann mir da jemand weiterhelfen?
Ich verstehe nicht, wieso die Variable EndofWorld.name leer ist.
An der selben Stelle deklariere ich auch eine normale string Variable und gebe sie auf dem gleichen weg aus und da klappt alles.

Geschrieben

Die Parameter name und describtion* des Room-Konstruktors verdecken die gleichnamigen Member der Klasse.
Wenn du also im Kontext des Konstruktors auf name zugreifst, greifst du auf den Parameter zu.

Es gibt mehrere Möglichkeiten, das zu lösen. Das einfachste ist natürlich, unterschiedliche Namen zu verwenden, wie du es bei beispielsweise bei room_numberX und positionX getan hast.
Viele benutzen auch spezielle Kennzeichnungen für Member und/oder lokale Variablen. z.B. kann man alle Member-Namen mit einem Unterstrich anfangen lassen.

Wenn du die gleichen Namen behalten willst, kannst du auf den Member zugreifen, indem du "this." davor schreibst:

this.name = name;

 

* Eigentlich schreibt man das description

Geschrieben

Solche Fehler lassen sich übrigens auch sehr einfach mit dem Debugger finden. Allerdings trauen sich Anfänger oft gar nicht an diesen ran, obwohl er das nützlichste Tool in der Softwareentwicklung ist. Deshalb sollte man sich möglichst früh mal anschauen welche Möglichkeiten der einem alles bietet.

Geschrieben (bearbeitet)

Krass, danke Klotzkopp!!!
Ich habe jetzt echt 8 Stunden nach diesem Fehler gesucht, aber ich wäre nicht drauf gekommen, dass es das hätte sein können!
Ich habe alle Variablen überprüft und da stand immer, das diese sich auf die Klasse bezieht, daher habe ich nicht gecheckt, warum es nicht geht.
Vielen Dank nochmal!

Ich nutze die Debugfunktion mit dem Play-Button oben und da lief er auf keinen Fehler. Er zeigte halt nur keinen Wert an, obwohl ich ja einen zugewiesen hatte :o
Nun ja, nochmals vielen dank :)

 

PS: Gibt es noch eine andere Debugfunktion?

Bearbeitet von LittleBrother
Geschrieben

Der große Nutzen eines Debuggers ist das du deinen Code während der Programmausführung Zeile für Zeile durchsteppen kannst und dir dabei z.B. anschauen kannst welchen Wert Variablen gerade haben. Dadurch hättest du dann z.B. in deinem Konstruktor sehen können das sich der Wert deiner Membervariablen bei der Zuweisung gar nicht verändert.

Geschrieben

@LittleBrother du solltest dich ganz dringend mit dem Debugger vertraut machen, denn so wie ich das lese hast du seinen Nutzen noch nicht so wirklich erkannt und ich glaube auch noch nie einen Haltepunkt gesetzt :)

Aber Guybrush hats ja schon gut angerissen. 

Geschrieben

Du hast da ganz Recht. Bis zu eurem Beitrag hier, habe ich den Debugger noch nicht so wirklich genutzt.
Habe jetzt aber gestern und vorgestern schon ein paar kleinere Fehler durch den Debugger ausmerzen können.
@Panawr: Habe dafür dann auch Haltepunkte gesetzt :) Habe mir nen YT-Video über den Debugger angesehen und mich da bisschen schlau gemacht.
Ich bin mir sicher, das ich den Debugger noch nicht in seiner vollen Kompetenz nutze, aber in kleinen Teilen, die ich fürs erste verstehe.
Ich teste ja mein TextAdventure schon seit längerem über den Debug-Play Button oben.

Arbeite jetzt an der Vereinfachung meines geschriebenen Codes.
Habe da einige Abfragen unglücklich kompliziert und mit zu vielen Unterpunkten geschrieben, das ich mich jetzt erstmal darum kümmern werde.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...