C# Variablen - Frage

iBreakstone

Newbie
Registriert
Okt. 2013
Beiträge
6
Ich habe eine Frage zu C#.
Derzeit lerne ich C# in der Schule, weil es mir aber so Spaß macht, arbeite ich zu Hause weiter.
Ich habe versucht ein "Minispiel" zu erstellen, bei dem der Nutzer auf "Attacke" klickt und
seinem HP (Leben) und dem des Gegners zufällig zwischen 1 und 10 abgezogen werden.
Alles klar soweit, nur ein Problem habe ich:
Wenn der Nutzer auf den Button "Attack" klickt, müssen ja zuerst die Variablen hpIch (meine HP)
und hpGegner vordefiniert, bzw deklariert werden. Dies habe ich mit Double getan, welches auf
2 Nachkommastellen gerundet wird.
Jedoch wird jedesmal, wenn der Nutzer auf den Button "Attack" klickt, die Variablen hp[..]
wieder auf 100 gesetzt und nach einem Angriff zwar gespeichert, jedoch beim nächsten Angriff wieder
auf 100 gesetzt.
Ich hoffe ihr versteht mein Problem und könnt helfen.
 
Wahrscheinlich nutzt du lokale Variablen - mach Instanzvariablen daraus und bei jedem Neustart setzt du einfach alle Werte wieder zurück auf die Ursprungswerte.
 
Wie kann man dies tun?
Ich vermute mal, dass ich Variablen ausserhalb von "[...]button1_Click[...]" machen soll.
Wie funktioniert das?
 
Ja genau. Mal an einem Beispiel:
Code:
namespace XY
{
	public class SpielXY
	{
		public bool SpielAktiv { get; set; }
		public int HpIch { get; set; } // Instanzvariable bzw. Property
		public int HpGegner { get; set; }
		
		public void ResetAll()
		{
			HpIch = 100;
			HpGegner = 100;
			SpielAktiv = true;
		}
		
		public void NeuesSpielStarten_Click( object Sender, EventArgs e )
		{
			string test = "123"; // lokale variable
			
			ResetAll();
			
			AttackeButton.Enabled = true;
			// weiterer Code
		}
		
		public void Attacke_Click( object Sender, EventArgs e )
		{
			int HP = (new Random()).Next();
			HpGegner -= HP;
			
			if( HpGegner <= 0 )
				SpielAktiv = false;
			
			// ...
		}
		
		// ...
	}
}
Damit hast du dann HpIch und HpGegner in der ganzen Klasse verfügbar, bis du allem eine Grenze setzt. Zeile 31 würde das Spiel hier beenden, wo ich dann wieder auf "Neues Spiel" klicken müsste, was alles wieder zurücksetzt usw. usf.

Aber wieso double? Ganzzahlen machen sich doch einfacher.
 
SymA schrieb:
Poste doch mal Code, dann ist es einfacher den Fehler zu erkennen.
Es gibt keinen Fehler, nur muss ich wissen, wie man Instanzvariablen nutzt.
Siehe unten. Denn mit jedem Buttonklick wurde die Variable wieder auf 100 gesetzt, was nicht
sein soll.

Schade, ich dachte das wäre leichter.
Mit dem Code kann ich leider sogut wie nichts anfangen.
Mein Code sieht so aus:


Code:
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Hier kommen die Aktionen herein
        }
    }
}

Wie müsste ich das bearbeiten, dass ich Instanzvariablen nehmen kann?
 
@iBreakstone:

Variablen die du innerhalb deines Button_Click Ereignisses definierst sind nur so lange gültig wie das Ereignis behandelt wird (Attacke->klick).
Variablen die du außerhalb des Button_Click definierst sind so lange gültig wie das Objekt der Klasse "lebt".

Damit die double-Werte so lange gespeichert werden wie das Spiel läuft müssen sie also innerhalb der geschweiften Klammern der Spiel-Klasse definiert werden und nicht in einem Ereignis wie "Button_Click".

Die Definition der Variablen funktioniert dabei immer gleich. Also in etwa so: double hpIch = 100.0;
Entscheidend ist nur wo(!) diese Definition steht.

Um bei deinem Codeschnipsel zu bleiben: Alles was innerhalb der geschweiften Klammern von Form1 definiert ist "lebt" genauso lange wie die Form1 "lebt". Also so lange bis sie geschlossen wird.
Alles was innerhalb des Unterblocks "button1_Click" definiert wird "lebt" genau so lange wie das Klick-Ereignis behandelt wird. Daher muß etwas wie HitPoints außerhalb des Button_Clicks definiert werden, weil es den Klick ja "überleben" soll.
 
Zuletzt bearbeitet:
Vielen Dank, ich habs nun geschafft :)

Mein Code sieht jetzt so aus:
(Beispiel)

Code:
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        double hpIch = 100.0;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = Convert.ToString(hpIch);
            // Hier kommen die Aktionen herein
        }
    }
}
 
iBreakstone schrieb:
Code:
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        //
        // variablen hier
        //

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // Hier kommen die Aktionen herein
        }
    }
}

Wie müsste ich das bearbeiten, dass ich Instanzvariablen nehmen kann?

Die Variablen sollten am besten direkt am Anfang der Klasse deklariert werden.

// Edit: Mist zu langsam :D

Btw: Gewöhn dich am besten sofort dran allen Klassen, Variablen und Objekten der Form ordentliche Namen zu geben ;)
 
Zuletzt bearbeitet:
Naja, bin gerade am Anfangen und sowas hatten wir noch nicht in der Schule ;D
Wir machen eher einen Taschenrechner :D
 
Mach einfach eine neue Klasse

Spieler, mit HP, Name, Attack Eigenschaften.

Dann definiere zwei variable in dem Form. public Spieler Ich; public Spieler Gegner;
Die Schlacht kann losgehen ;)
 
Kapselung, Abstraktion, Strukturen, Klassen und Objekte wird er wohl später noch behandeln. Er soll ja noch was im Unterricht dazu lernen und nicht den Angeber spielen. ;)
 
Zurück
Oben