Abfrage funktioniert nicht richtig :(

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von ThePlexian.

    Abfrage funktioniert nicht richtig :(

    Also ich bin zur Zeit ein kleineres Kartenspiel am entwerfen das man gegen einen Computergegner spielt.
    Ich werde hier die gekürzten Codes auflisten und sagen was sie bewirken sollen und wo mein Problem liegt und hoffe das mir jemand helfen kann :)

    Also man hat 3 Karten auf der Hand, das ist jetzt der Befehl wenn man die Karte auf Position 1 (die für 2 und 3 sind genau so aufgebaut)
    aus der eigenen Hand anklickt / auswählt, für den Computer wird eine zufällige ausgewählt.

    VB.NET-Quellcode

    1. Private Sub pl1_karte1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbl_pl1_karte1.Click
    2. '----------------------------------------'
    3. 'Karte ausgewählt'
    4. '----------------------------------------'
    5. tmr_karte_klick.Enabled = True
    6. pl1_handauswahl = 1
    7. '----------------------------------------'
    8. '----------------------------------------'
    9. '----------------------------------------'
    10. 'Gegnerische Karte auswählen'
    11. '----------------------------------------'
    12. Randomize()
    13. Dim random As Integer = CInt(Int((3 * Rnd()) + 1))
    14. pl2_handauswahl = random
    15. '----------------------------------------'
    16. '----------------------------------------'
    17. End Sub


    Dadurch wird nun der Timer aktiviert der die Ausgewählte Karte ein wenig nach oben verschiebt damit man sehen kann ob sie ausgewählt wurde.

    VB.NET-Quellcode

    1. Private Sub tmr_karte_klick_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmr_karte_klick.Tick
    2. '----------------------------------------'
    3. '----------------------------------------'
    4. If lbl_pl1_karte1.Location.Y <= 393 Or lbl_pl1_karte2.Location.Y <= 393 Or lbl_pl1_karte3.Location.Y <= 393 Then
    5. tmr_karte_klick.Enabled = False
    6. tmr_kampf.Enabled = True
    7. tmr_kampf_pl2.Enabled = True
    8. Else
    9. '----------------------------------------'
    10. 'Bewegung der Eigenen Karte'
    11. '----------------------------------------'
    12. If pl1_handauswahl = 1 Then
    13. lbl_pl1_karte1.Location = New Point(lbl_pl1_karte1.Location.X + 0, lbl_pl1_karte1.Location.Y - 1)
    14. ElseIf pl1_handauswahl = 2 Then
    15. lbl_pl1_karte2.Location = New Point(lbl_pl1_karte2.Location.X + 0, lbl_pl1_karte2.Location.Y - 1)
    16. Else
    17. lbl_pl1_karte3.Location = New Point(lbl_pl1_karte3.Location.X + 0, lbl_pl1_karte3.Location.Y - 1)
    18. End If
    19. '----------------------------------------'
    20. '----------------------------------------'
    21. End If


    Nun komm ich zu dem Teil an dem ich ein Problem habe wenn ich im vorigen Code "tmr_kampf" an erste Stelle tu fragt er die Werte aus "tmr_kampf_pl2" zu spät ab und umgekehrt.
    Es geht um folgende Werte:
    pl1_blau_ang
    pl1_grün_ang
    pl1_gelb_ang
    pl1_rot_ang
    pl1_kartentyp

    Hier nun die Timer die diese Werte festlegen und auch abfragen.


    VB.NET-Quellcode

    1. Private Sub tmr_kampf_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmr_kampf.Tick
    2. Dim pl1_karte_a As Integer
    3. If pl1_handauswahl = 1 Then
    4. pl1_karte_a = pl1_karte1_hand
    5. ElseIf pl1_handauswahl = 2 Then
    6. pl1_karte_a = pl1_karte2_hand
    7. Else
    8. pl1_karte_a = pl1_karte3_hand
    9. End If
    10. Select Case pl1_karte_a
    11. ''es exestieren auch noch cases davor und danach aber case 17 ist das beste beispiel da es aus pl2 etwas abfragt
    12. Case 17
    13. GoTo 17
    14. End Select
    15. 17:
    16. pl1_blau_ang = -1
    17. pl1_grün_ang = 0
    18. pl1_gelb_ang = 0
    19. pl1_rot_ang = 0
    20. pl1_kartentyp = "grün"
    21. '----------------------------------------'
    22. 'Wenn Felder vorhanden
    23. '----------------------------------------'
    24. If pl2_blau_ang = 0 Then
    25. pl1_grün_ang += 2
    26. End If
    27. If pl2_grün_ang = 0 Then
    28. pl1_grün_ang += 2
    29. End If
    30. If pl2_gelb_ang = 0 Then
    31. pl1_grün_ang += 2
    32. End If
    33. If pl2_rot_ang = 0 Then
    34. pl1_grün_ang += 2
    35. End If
    36. ''hier nach kommen auch noch einige befehle der karten die jedoch nur auf die pl1_blau,grün,gelb und rot eingehen deshalb habe ich diese jetzt weggelassen zur übersicht
    37. GoTo Ende
    38. Ende:
    39. If pl1_handauswahl = 1 Then
    40. '174; 443
    41. lbl_pl1_karte1.BackgroundImage = Nothing
    42. pl1_karte1_b = False
    43. lbl_pl1_karte1.Location = New Point(lbl_pl1_karte1.Location.X + 0, lbl_pl1_karte1.Location.Y + 50)
    44. ElseIf pl1_handauswahl = 2 Then
    45. '388; 443
    46. lbl_pl1_karte2.BackgroundImage = Nothing
    47. pl1_karte2_b = False
    48. lbl_pl1_karte2.Location = New Point(lbl_pl1_karte2.Location.X + 0, lbl_pl1_karte2.Location.Y + 50)
    49. Else
    50. '605; 443
    51. lbl_pl1_karte3.BackgroundImage = Nothing
    52. pl1_karte3_b = False
    53. lbl_pl1_karte3.Location = New Point(lbl_pl1_karte3.Location.X + 0, lbl_pl1_karte3.Location.Y + 50)
    54. End If
    55. tmr_kampf.Enabled = False
    56. End Sub


    Der Code für pl2_tmr sieht genau so aus nur das überall wo pl1 steht halt pl2 steht und umgekehrt, hier jedoch mal ein kleiner Teil der gut als Beispiel dient...

    VB.NET-Quellcode

    1. Private Sub tmr_kampf_pl2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmr_kampf_pl2.Tick
    2. Dim pl2_karte_a As Integer
    3. If pl2_handauswahl = 1 Then
    4. pl2_karte_a = pl2_karte1_hand
    5. ElseIf pl1_handauswahl = 2 Then
    6. pl2_karte_a = pl2_karte2_hand
    7. Else
    8. pl2_karte_a = pl2_karte3_hand
    9. End If
    10. Select Case pl2_karte_a
    11. Case 1
    12. GoTo 1
    13. End Select
    14. 1:
    15. pl2_blau_ang = -1
    16. pl2_grün_ang = 0
    17. pl2_gelb_ang = 0
    18. pl2_rot_ang = 3
    19. pl2_kartentyp = "grün"
    20. GoTo ende
    21. ''hab ende jetzt einfach mal weggelassen...


    Nochmal konkret zu meinem Problem:
    Wenn ich tmr_kampf zuerst setzte kann er die Werte von pl2_blau_ang nicht abfragen aber tmr_kampf_pl2 schon von pl1_blau_ang,
    Wenn ich dann tmr_kampf_pl2 zuerst setzte haben wir das selbe in grün :/.

    Das ist das einzige Problem was ich besitzte ansonsten ist das Spiel dann schon fertig und Fehlerfrei :)
    Wäre nett wenn mir jemand dabei behilflich sein könnte !
    Verschieb diese Zeile nach Form_Load():

    Azrael schrieb:

    VB.NET-Quellcode

    1. Randomize()
    Sieh Dir mal die Random-Klasse an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hab ich gemacht, das ändert jedoch nichts an dem ergebnis :(
    Ich habe die Werte mit einer Textbox auslesen lassen, die Werte aus tmr_kampf_pl2 werden erst in der nächsten Runde benutzt und nicht wie beabsichtigt in der selben Runde wie tmr_kampf, so sind die Effekte der Karten, Angriffswerte und co. für Spieler 2 um eine Runde verschoben :(
    @Azrael Bevor Du Dich um grün, blau und gelb kümmerst löse dieses Problem allein, ohne den Rest.
    Mach ein separates Projekt und pack da nur das Zufällige rein.
    Poste den Code, schreib was passiert und was passieren soll,
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Mach ein separates Projekt und pack da nur das Zufällige rein.


    Was meinst du mit Zufällige ?
    Es wird ja nur die Karte die der Computer-Gegner auswählt per Zufall bestimmt und halt auch wie das Deck zu beginn gemischt wird, aber das scheint alles zu funktionieren.

    Die SelectCase bei pl1_karte_a (und pl2) prüft welche Karte ausgewählt ist (insgesamt gibt es 118, wobei nur 30 im Deck sind), die wird also nicht per Zufall bestimmt.

    Azrael schrieb:

    Zufällige

    Azrael schrieb:

    VB.NET-Quellcode

    1. Randomize()
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Habs mal wie du gesagt hast, alles was mit Random zu tun hat in ein Projekt, funktioniert auch alles so wie es soll...

    VB.NET-Quellcode

    1. Public Class Form1
    2. ''Cardlist wird die Nummern der Karten die man seinem Deck im Editor hinzugefügt hat enthalten
    3. ''Decklist enthält die Nummern der Karten gemischt in zufälliger Reigenfolge siehe tmr_start_mischen
    4. Public pl1_cardlist As New List(Of String)()
    5. Public pl1_decklist As New List(Of String)()
    6. Public pl2_cardlist As New List(Of String)()
    7. Public pl2_decklist As New List(Of String)()
    8. ''pl1-/pl2_handauswahl bestimmt welche Karte auf der Hand vom Spieler aktiviert wurde
    9. Public pl1_handauswahl As Integer
    10. Public pl2_handauswahl As Integer
    11. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    12. Randomize()
    13. pl1_cardlist.Add("001")
    14. pl1_cardlist.Add("002")
    15. pl1_cardlist.Add("003")
    16. pl1_cardlist.Add("004")
    17. pl1_cardlist.Add("005")
    18. pl1_cardlist.Add("006")
    19. pl1_cardlist.Add("007")
    20. pl1_cardlist.Add("008")
    21. pl1_cardlist.Add("009")
    22. pl1_cardlist.Add("010")
    23. pl1_cardlist.Add("011")
    24. pl1_cardlist.Add("012")
    25. pl1_cardlist.Add("013")
    26. pl1_cardlist.Add("014")
    27. pl1_cardlist.Add("015")
    28. pl1_cardlist.Add("016")
    29. pl1_cardlist.Add("017")
    30. pl1_cardlist.Add("018")
    31. pl1_cardlist.Add("019")
    32. pl1_cardlist.Add("020")
    33. pl2_cardlist.Add("001")
    34. pl2_cardlist.Add("002")
    35. pl2_cardlist.Add("003")
    36. pl2_cardlist.Add("004")
    37. pl2_cardlist.Add("005")
    38. pl2_cardlist.Add("006")
    39. pl2_cardlist.Add("007")
    40. pl2_cardlist.Add("008")
    41. pl2_cardlist.Add("009")
    42. pl2_cardlist.Add("010")
    43. pl2_cardlist.Add("011")
    44. pl2_cardlist.Add("012")
    45. pl2_cardlist.Add("013")
    46. pl2_cardlist.Add("014")
    47. pl2_cardlist.Add("015")
    48. pl2_cardlist.Add("016")
    49. pl2_cardlist.Add("017")
    50. pl2_cardlist.Add("018")
    51. pl2_cardlist.Add("019")
    52. pl2_cardlist.Add("020")
    53. tmr_start_mischen.Enabled = True
    54. End Sub
    55. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmr_start_mischen.Tick
    56. If pl1_cardlist.Count > 0 Then
    57. Dim rnd = New Random()
    58. ''Gibt einen zufälligen Wert aus der pl1-/pl2_cardlist wieder
    59. Dim pl1_mischen = pl1_cardlist(rnd.Next(0, pl1_cardlist.Count))
    60. Dim pl2_mischen = pl2_cardlist(rnd.Next(0, pl2_cardlist.Count))
    61. 'Fügt den zufälligen Wert pl1-/pl2_decklist hinzu
    62. pl1_decklist.Add(pl1_mischen)
    63. pl2_decklist.Add(pl2_mischen)
    64. 'Löscht den zufälligen Wert aus pl1-/pl2_cardlist damit keine Karte doppelt vorkommt
    65. pl1_cardlist.Remove(pl1_mischen)
    66. pl2_cardlist.Remove(pl2_mischen)
    67. Else
    68. tmr_start_mischen.Enabled = False
    69. End If
    70. End Sub
    71. Private Sub pl1_karte1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbl_pl1_karte1.Click
    72. ''Wenn die Karte auf Position 1 angelickt wird
    73. tmr_karte_klick.Enabled = True
    74. pl1_handauswahl = 1
    75. ''Zufällige Karte wird für den Computer bestimmt
    76. Dim random As Integer = CInt(Int((3 * Rnd()) + 1))
    77. pl2_handauswahl = random
    78. End Sub
    79. Private Sub pl1_karte2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbl_pl1_karte2.Click
    80. ''Wenn die Karte auf Position 2 angelickt wird
    81. tmr_karte_klick.Enabled = True
    82. pl1_handauswahl = 2
    83. ''Zufällige Karte wird für den Computer bestimmt
    84. Dim random As Integer = CInt(Int((3 * Rnd()) + 1))
    85. pl2_handauswahl = random
    86. End Sub
    87. Private Sub pl1_karte3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbl_pl1_karte3.Click
    88. ''Wenn die Karte auf Position 3 angelickt wird
    89. tmr_karte_klick.Enabled = True
    90. pl1_handauswahl = 3
    91. ''Zufällige Karte wird für den Computer bestimmt
    92. Dim random As Integer = CInt(Int((3 * Rnd()) + 1))
    93. pl2_handauswahl = random
    94. End Sub
    95. End Class

    Azrael schrieb:

    VB.NET-Quellcode

    1. Dim rnd = New Random()
    darf nur einmal vorkommen, ab nach Form_Load und rnd in die Klasse. Nimm bitte nur das .NET-Random!
    Und dann so:

    VB.NET-Quellcode

    1. pl1_cardlist.AddRange({"001", "002", "003", "004"})

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die Instanziierung ins FormLoad, die Deklaration global.
    Über der FormLoad-Sub : Dim rnd As Random
    In FormLoad: rnd = New Random()
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    RodFromGermany schrieb:

    @Azrael Bevor Du Dich um grün, blau und gelb kümmerst löse dieses Problem allein, ohne den Rest.
    Mach ein separates Projekt und pack da nur das Zufällige rein.
    Poste den Code, schreib was passiert und was passieren soll,


    Naja wie soll ich sagen, das mit dem Random sieht mir zur Zeit eigendlich so aus als ob das funktioniert, das problem ist nur mit den tmr und dann die verschiedenen farben abzufragen, oder hängt das mit dem random zusammen, bin verwirrt :s

    Azrael schrieb:

    mit den tmr und dann die verschiedenen farben abzufragen
    Formuliere bitte mal Dein Problem so, dass wir es so verstehen, wie Du es gemeint hast.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Azrael schrieb:

    hab jetzt noch zwei Timer eingebaut
    Jetzt ist ganz bestimmt was falsch an Deinem Programm.
    Was machen 2 Timer, was nicht auch ein Timer machen kann?
    Für was für eine Abfrage brauchst Du einen Timer?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!