Laden...

Member einer Klasse werden nicht gesetzt

Erstellt von Syntrax vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.199 Views
Thema geschlossen
S
Syntrax Themenstarter:in
2 Beiträge seit 2014
vor 10 Jahren
Member einer Klasse werden nicht gesetzt

Hallo Community,
ich habe nach etwas längerer Zeit mal wieder angefangen etwas in C# zu programmieren.
Ich wollte ein kleines Strategiespiel programmieren(nichts großes, klein und simpel).
Nun bin ich aber noch Anfänger und habe mich trotzdem mal an Klassen etc heran getraut, allerdings funktioniert das alles nicht so wie gewollt _
Naja, hier erstmal der Code

        
        players Spieler = new players();

        public Einwohner()
        {
            InitializeComponent();
            
        }

        private void numeric_holzf_ValueChanged(object sender, EventArgs e)
        {
            if (Convert.ToInt32(numeric_holzf.Value + numeric_mine.Value + numeric_steinm.Value) <= Spieler.Einwohner)
            {
                    Spieler.Holzfaeller = Convert.ToInt32(numeric_holzf.Value);
                    lbl_freie_ew.Text = (Spieler.Einwohner - (Spieler.Holzfaeller + Spieler.Steinmetze + Spieler.Minenarbeiter)).ToString();
            }
            else
            {
                numeric_holzf.Value = Spieler.Holzfaeller;
                MessageBox.Show("Du hast nicht genügend verbleibende Einwohner");
            }
        }

Dies ist ein Formular indem man durch NumericUpDown Boxen die Anzahl der Holzfäller verändern kann. Je nachdem was man einstellt sollte auch Spieler.Holzfaeller diesen Wert annehmen.

public partial class Statistiken : Form
    {  
        Timer Holzabbau = new Timer();
        Timer Steinabbau = new Timer();
        Timer Eisenabbau = new Timer();
        players Spieler = new players();

        public Statistiken()
        {
            InitializeComponent();
            Holzabbau.Tick += new EventHandler(HAbbau);
            Holzabbau.Interval = 10000;
            Steinabbau.Tick += new EventHandler(SAbbau);
            Steinabbau.Interval = 10000;
            Eisenabbau.Tick += new EventHandler(EAbbau);
            Eisenabbau.Interval = 10000;
            lbl_ew_anz.Text = Spieler.Einwohner.ToString();
        }

        private void Statistiken_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();
        }

        private void btn_holz_abb_Click(object sender, EventArgs e)
        {
            Holzabbau.Start();
            harbeit = true;
        }

        void HAbbau(object sender, EventArgs e)
        {
            Spieler.Holz = Spieler.Holz + (13 * Spieler.Holzfaeller);
            lbl_holz_anz.Text = Spieler.Holz.ToString();
            MessageBox.Show("Deine Holzfäller sind zurück.");
            Holzabbau.Stop();
        }

Dies ist ein anderes Formular. Wenn man hier einen Button(btn_holz_abb) betätigt wird ein Timer gestartet und nach 10 Sekunden soll man Holz ne nach Anzahl der Arbeiter bekommen.


namespace EmpireofStrategy
{
    static class Program
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Main());
        }
    }
    public class players
    {
        private int geld;
        public int Geld { get { return geld; } set { geld = value; } }

        private int holz;
        public int Holz { get { return holz; } set { holz = value; } }

        private int stein;
        public int Stein { get { return stein; } set { stein = value; } }

        private int eisen;
        public int Eisen { get { return eisen; } set { eisen = value; } }

        private int einwohner = 6;
        public int Einwohner { get { return einwohner; } set { einwohner = value; } }

        private int holzfaeller;
        public int Holzfaeller { get { return holzfaeller; } set { holzfaeller = value; } }
        private int steinmetze;
        public int Steinmetze { get { return steinmetze; } set { steinmetze = value; } }
        private int minenarbeiter;
        public int Minenarbeiter { get { return minenarbeiter; } set { minenarbeiter = value; } 
    }
}

Das ist die Programm.cs . Hier hab ich meine Klasse players mit mehreren Membern und ihren Eigenschaften deklariert.

Das Problem ist aber, das wenn man auf den Button zum Holz abbauen klickt man nach 10 Sekunden kein Holz bekommt. Der Wert der Holzfäller wird im NumericUpDown Feld aber richtig gesetzt, dass merkt man an den Abfragen, wie viele es schon gibt und wenn man mehr Holzfäller als Einwohner hat wird ein Fehler ausgegeben. Aber wenn es zur letzten Berechnung für das erarbeitete Holz kommt steht der Wert für Spieler.Holzfaeller anscheinen wieder auf 0 .
Eine Fehlermeldung gibt es nicht und wenn ich die Variable holzfaeller schon von Anfang an auf einen Wert >2 setze funktioniert es komischerweise. Wenn ich die Variable Holz schon vorher auf einen Wert >0 setze dann kommt am Ende der Berechnung auch dieser Wert heraus als ob Holzfaeller = 0 ist obwohl das nicht sein kann(/sollte)
Das ist natürlich noch nicht der ganze Code, es gibt noch identischen Code für Stein und Eisen aber da verhält es sich genau so. Außerdem gibt es noch 2 weitere Formulare die damit aber nichts zutun haben sollten.

Ich hoffe man hat verstanden was mein Problem ist und kann mir helfen.

PS:Ich bin noch Anfänger, deswegen könnte es sein, dass ich einige Dinge eher unkonventionell oder sehr schlecht gelößt habe. Es wäre nett, wenn ihr mich darauf hinweist, dann mache ich das besser.

D
96 Beiträge seit 2012
vor 10 Jahren

Kann es sein, dass deine beiden Formen Statistiken und Einwohner einfach nicht das selbe Spieler-Objekt referenzieren? Es sieht so aus als ob du zwar die Holzfälleranzahl in der Einwohnerform ändern kannst, aber die Statistikform mit ihrer eigenen Spielerinstanz rechnet und deswegen einfach keine Änderungen mitbekommen kann (da es nunmal keine gibt).

=> Erstell das Spielerobjekt nur einmalig und übergib die Referenz auf irgendeine Art und Weise an die verschiedenen Formen (z.B. über den Konstruktor).

S
Syntrax Themenstarter:in
2 Beiträge seit 2014
vor 10 Jahren

Hm, das klingt wirklich logisch 😄
Ich hab das Objekt Spieler nun nur direkt in der Programm.cs(static void Main())erstellt aber wie übergebe ich das per Konstruktor an die verschiedenen Formulare?

Hinweis von herbivore vor 10 Jahren

Das ist keine Frage, sondern die Lösung. Einfach das Objekt per Parameter an den Konstruktor des Forms übergeben. Wie das geht, setzen wir auf jeden Fall als bekannt voraus.

F
10.010 Beiträge seit 2004
vor 10 Jahren
Thema geschlossen