2 Fragen - Zeitberechnung und getroffener Spieler

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Anfaenger.

    2 Fragen - Zeitberechnung und getroffener Spieler

    hallo,

    ich hab 2 Fragen und hoffen, dass mir jemand helfen kann.

    Ich würde gerne auf meiner Windows Form eine fiktive Zeit angeben z.B. 10:30 Uhr - Wenn irgendeine Aktion startet, sollen z.B. 30 min hinzukommen. Muss ich hier 2 Variablen definieren? Also eine für Stunden und eine für Minuten? Wie müsste ich es dann anstellen, wenn es z.B. 23:30 Uhr wäre, dass ich beim addieren von 45 min jetzt 0:15 Uhr hab und nicht 24:15? Gibt es da was einfaches? Oder muss ich das alles manuell machen? Also prüfen > 23 dann wieder 0 usw.?

    2. Frage

    Ich hab in der Form mehrere fiktive Gegner mit Name + Spielstärke. Ich würde gerne ne Möglichkeit haben, zu erkennen, ob ich gegen diesen Gegner schon mal gespielt habe oder nicht. (möchte keine daten auf die festplatte speichern)
    Mein Ansatz wäre gewesen es über einen Variablen Array zu probieren und den immer gegenchecken, ob der neue Gegner in diesem Array ist. Jetzt hat mir jemand was von einer link list erzählt - ich würde gerne wissen was "besser" bzw. praktikabler wäre.

    Hoffe mir kann jemand helfen.
    Zu Frage1:
    Weiß ich nicht genau ich glaube du musst es auf die umständliche weiße machen.
    Zu Frage2:
    Wenn jeder Gegner mit z.B. einer Picturebox dargestellt wird (oder einem anderen Control) dann würde ich sobald du gegen ihn spielst pic.tag = "Gespielt" setzen.
    Wenn du jetzt nochmal gegen ihn spielst dann wieder abfragen ob pic.tag = "Gespielt" ==> wenn nicht dann muss noch gegen ihn gespielt werden :D
    Zu Frage 1:

    2 Label, 1 timer, 1 label Für minuten, 1 label für stunden....

    beispiel: wenn man auf den button klickt kommen 30 minuten dazu
    label1 = minuten
    label2 = stunden

    auf button machst du button1_click)

    VB.NET-Quellcode

    1. Label1.Text = Val(Label1.Text) + Val(30)


    dann auf timer1:

    VB.NET-Quellcode

    1. if label1.text > 60 then
    2. Val(Label2.Text) + Val(1)
    3. Label1.Text = Val(Label1.Text) - Val(60)


    bei frage 2 kenn mich ich ned aus^^
    Zur Speicherung der Spielerinformation, ist der Weg eigentöich, dass eine Klasse Spieler erstellt wird. Diese enthält dann eine Eigenschaft "Schon gespielt". Beim Erzeugen der Oberfläche wird dann für jeden Spieler ein Objekt der Klasse Spieler angelegt.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).

    INOPIAE schrieb:

    Zur Speicherung der Spielerinformation, ist der Weg eigentöich, dass eine Klasse Spieler erstellt wird. Diese enthält dann eine Eigenschaft "Schon gespielt". Beim Erzeugen der Oberfläche wird dann für jeden Spieler ein Objekt der Klasse Spieler angelegt.


    ich glaub ich kapiers nicht so richtig.

    Ich hab meinen Gegner in nem xml File (name, alter und Spielerstärke) damit ich das später erweitern kann.
    Was mir jetzt nicht ganz klar ist:

    Wenn ich jetzt nen spieler als gegner habe beispiel "Spieler 1"
    Wie kann ich dann wissen, ob ich gegen den schon mal gespielt habe? Vor allem hätte ich gerne die Anzahl wie oft ich gegen den gespielt habe.
    Da brauch ich ja irgendeine Variable, die das mitzählt und zwar für jeden Spieler separat. Wie müsste ich dann hier ne Variable machen, ich weiss ja nicht wieviel spieler es insgesammt geben wird.

    Wie kann ich das machen, vor allem, da ja per xml später noch weitere Spieler hinzukommen sollen.
    das geht leider nicht, da auf einem nicht englischsprachigen System AM und PM nicht angezeigt wird.

    ?? Wie passt plötzlich AM/PM hier rein?

    VB.NET-Quellcode

    1. Dim MeineSpielZeit As DateTime
    2. MeineSpielZeit = DateTime.Parse("23:38")
    3. MessageBox.Show(MeineSpielZeit.ToString)
    4. MeineSpielZeit = MeineSpielZeit.AddMinutes(33)
    5. MessageBox.Show(MeineSpielZeit.ToString)

    der_Kurt schrieb:

    das geht leider nicht, da auf einem nicht englischsprachigen System AM und PM nicht angezeigt wird.

    ?? Wie passt plötzlich AM/PM hier rein?

    VB.NET-Quellcode

    1. Dim MeineSpielZeit As DateTime
    2. MeineSpielZeit = DateTime.Parse("23:38")
    3. MessageBox.Show(MeineSpielZeit.ToString)
    4. MeineSpielZeit = MeineSpielZeit.AddMinutes(33)
    5. MessageBox.Show(MeineSpielZeit.ToString)


    Oh sorry danke für die hilfe ich hab aber mit AM und PM arbeiten wollen - hab ich oben nicht geschrieben... ich hab in der zwischenzeit natürlich weiterversucht und wollte das nun mit Am und PM haben. Das funktioniert so aber nicht.

    Hättest du ne idee zu meiner 2. Frage?

    Ich hab jetzt ne Klasse Spieler gemacht
    dort gibt es
    Name
    Alter
    Stärke
    AnzahlSpiele

    Ich kann auch so einen Spieler zu einer Liste hinzufügen

    Dim listeS As New List(Of Spieler)
    Dim aktuellerSpieler As New Spieler

    aktuellerSpieler.name = InputBox("Bitte Namen des Spielers eingeben")

    If Not listeS.Contains(aktuellerSpieler) Then
    listeSpieler.Add(aktuellerSpieler)
    End If

    Ich ruf das ganze per button auf.

    Was ich jetzt nicht hinbekomme, ist die Liste zu durchsuchen - also z.B. würd ich gerne "Max" finden und die AnzahlSpiele um 1 erhöhen.

    geht das überhaupt?
    zu 1.:
    Geht nicht gibts nicht. Die Zeit wird ohne AM/PM angezeigt, weil die "Standard"-Cultureinfo genommen wird. Wenn du bei den Ländereinstellungen entsprechende Einstellungen gemacht hast, dann wird die Zeit angezeigt, wie bei uns üblich.
    Doch der .tostring-Funktion kannst du so eine cultureinfo mit angeben. Dann wird die Zeit so angezeigt, wie du es möchtest

    VB.NET-Quellcode

    1. Dim cInfo As Globalization.CultureInfo = New Globalization.CultureInfo("en-us")
    2. Dim MeineSpielZeit As DateTime
    3. MeineSpielZeit = DateTime.Parse("23:38")
    4. MessageBox.Show(MeineSpielZeit.ToString)
    5. MeineSpielZeit = MeineSpielZeit.AddMinutes(33)
    6. MessageBox.Show("komplette Zeit mit Datum: " & MeineSpielZeit.ToString)
    7. MessageBox.Show("nur die Zeit: " & MeineSpielZeit.ToString("t"))
    8. MessageBox.Show("die Zeit, Cultureinfo auf Englisch: " & MeineSpielZeit.ToString("t", cInfo))



    zu 2.:
    Natürlich geht das. Du kannst mit einer For-Each-Schleife jedes Element durchgehen. Ist im aktuellen Element der Name "Max", dann erhöhst du die Anzahl der Spiele.

    VB.NET-Quellcode

    1. ...
    2. for each sp as spieler in listeS
    3. 'sp enthält das aktuelle "Spieler"-Objekt
    4. next


    Alternative wäre eine LINQ-Konstruktion. Das ist am Anfang aber nicht leicht zu verstehen.
    ich bekomm es nicht hin.

    es wird mir immer nur 1 Name angezeigt, der letzte den ich eigegeben habe.

    ich habs so gemacht, hab ich da was missverstanden?

    For Each sp As Spieler In listeS
    MessageBox.Show(sp.name)
    Next

    Muss ich irgendwo noch ne ID vergeben?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Anfaenger“ ()

    Das ist dein Quellcode aus Post #9, mit der Anmerkung: "ich rufe das Ganze per Button auf"

    VB.NET-Quellcode

    1. Dim listeS As New List(Of Spieler)
    2. Dim aktuellerSpieler As New Spieler
    3. aktuellerSpieler.name = InputBox("Bitte Namen des Spielers eingeben")
    4. If Not listeS.Contains(aktuellerSpieler) Then
    5. listeSpieler.Add(aktuellerSpieler)
    6. End If


    Wenn dieser ganze Code im der Button-Sub steht, dann ist deine listeS ausserhalb dieser Sub nicht bekannt.
    Denn auch dieser Code ist nicht falsch:

    VB.NET-Quellcode

    1. For Each sp As Spieler In listeS
    2. MessageBox.Show(sp.name)
    3. Next

    Wenn du ListeS und aktuellerSpieler ausserhalb der Sub (gleich unter Class Form1) deklarierst, dann sind diese in allen Unterprogrammen bekannt.
    Ist nur eine 'Vermutung, vielleicht liegt hier der Fehler.

    Kannst du evtl. den Code hier posten (VB-Tag benutzen)?

    der_Kurt schrieb:

    Das ist dein Quellcode aus Post #9, mit der Anmerkung: "ich rufe das Ganze per Button auf"

    VB.NET-Quellcode

    1. Dim listeS As New List(Of Spieler)
    2. Dim aktuellerSpieler As New Spieler
    3. aktuellerSpieler.name = InputBox("Bitte Namen des Spielers eingeben")
    4. If Not listeS.Contains(aktuellerSpieler) Then
    5. listeSpieler.Add(aktuellerSpieler)
    6. End If


    Wenn dieser ganze Code im der Button-Sub steht, dann ist deine listeS ausserhalb dieser Sub nicht bekannt.
    Denn auch dieser Code ist nicht falsch:

    VB.NET-Quellcode

    1. For Each sp As Spieler In listeS
    2. MessageBox.Show(sp.name)
    3. Next

    Wenn du ListeS und aktuellerSpieler ausserhalb der Sub (gleich unter Class Form1) deklarierst, dann sind diese in allen Unterprogrammen bekannt.
    Ist nur eine 'Vermutung, vielleicht liegt hier der Fehler.

    Kannst du evtl. den Code hier posten (VB-Tag benutzen)?


    Ich hab die 2 Blöcke, also das mit Spieler add und die suche for each direkt untereinander gestellt.
    Ich dachte, dass ich bei ersten durchlauf natürlich nur meinen ersten namen finde und wenn ich das 2 X eine Spieler eintrag ich dann meinen ersten und dann den zweiten finde.

    Wie gesagt, beide blöcke untereinander. (Also beide Codes, die in deinem Thread stehen)

    Kann es sein, dass es vielleicht ein Problem mit der Klasse Spieler gibt und es deshalb nicht funktioniert? Oder hat das keinen Einfluss?
    Dann ist es klar. Wenn du mehrmals auf den Button klickst, läuft er diese Sub mehrmals durch. Aber die Liste wird jedesmal neu erstellt. Stelle dim Listes und aktuellerspieler raus aus der Sub, damit sie im ganzen Programm gültig werden.

    PS: ist der Quellcode so geheim? Er hätte viele Erklärungen vielleicht leichter gemacht. Whatever.

    der_Kurt schrieb:

    Dann ist es klar. Wenn du mehrmals auf den Button klickst, läuft er diese Sub mehrmals durch. Aber die Liste wird jedesmal neu erstellt. Stelle dim Listes und aktuellerspieler raus aus der Sub, damit sie im ganzen Programm gültig werden.

    PS: ist der Quellcode so geheim? Er hätte viele Erklärungen vielleicht leichter gemacht. Whatever.


    Ne is natürlich nicht geheim :) Ich dachte nur, der steht ja oben und so hab ich das eigentlich auch.

    Jetzt hab ich die LISTE und aktueller Spieler raus aus dem SUB und habs jetzt so gemacht - funktioniert aber nicht - ist so was zu schwer für einen Anfänger oder sind das "normale" Probleme?

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim listeS As New List(Of Spieler)
    3. Dim aktuellerSpieler As New Spieler
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. aktuellerSpieler.name = InputBox("Bitte Namen des Spielers eingeben")
    6. If Not listeS.Contains(aktuellerSpieler) Then
    7. listeS.Add(aktuellerSpieler)
    8. End If
    9. For Each sp As Spieler In listeS
    10. MessageBox.Show(sp.name)
    11. Next
    12. End Sub
    13. End Class
    OK, jetzt ist es übersichtlich ;)
    Die Liste ist allgemein gültig, und deshalb ausserhalb. Die Zeile 4, den aktuellen Spieler mach auf Zeile 7. (Sorry, war mein Fehler)

    Damit wird in der Sub ein aktueller Spieler definiert und dann hinzugefügt.
    Dann klappt es (gerade getestet.)

    ist so was zu schwer für einen Anfänger oder sind das "normale" Probleme?

    Diese Probleme sind normalerweise logisch, wenn man sich gleich hinsetzt und "proggt". Programmierung heißt normalerweise, ein Konzept zu erstellen (meistens auf Papier), und dies dann umzusetzen.
    funktioniert vielen Dank

    eigentlich steht das Konzept, aber es kommen halt immer mehr sachen hinzu, an die ich davor nicht gedacht habe. Theoretisch müsste ich mein Projekt verwerfen und nochmal neu anfangen - da ich aber am üben bin :)

    Ne kurze Frage hätte ich noch.

    Kann ich die Liste auch in nem Modul machen? Somit hätte ich die Liste ja in allen FOMRS zur Verfügung. Wie wäre hier die korrekte Vorgehensweise?