Game: Damage System Bug

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Tixewi.

    Game: Damage System Bug

    Hi Leute,

    ich habe ein kleines Spiel begonnen zu programmieren. Es ist nicht das erste was ich mit VB mache aber ich bin jetzt auch noch kein Profi.
    Da Spiel ist sehr Simple aufgebaut aber darauf will ich jetzt nicht weiter eingehen.


    Mein Spiel ist ein Strategie Spiel (Rundenbasierend) ohne Engine sondern mit png's. Das Spiel braucht 2 Spieler vor dem PC (1vs1). Man kann Einheiten bauen und man kann auf einem "Battlefield" kämpfen.


    Das Problem:

    Bürger (50% Chance) vs Bürger (50% Chance) klappt soweit.
    Bürger (1/3 Chance) vs Speerträger (2/3 Chance) passiert folgendes: Anstatt dass eine Meldung erscheint das ein Spieler eine Einheit verloren hat und diese Verschwindet kommt einfach garnichts. Die Random Zahl wird jedoch generiert. Die Random Zahl ist z.b. 1. Der Bürger sollte bei 0-4 Sterben. Dies Passiert aber nicht, weder der Bürger noch der Speer stirbt. Erst nach mehrmaligem wiederholen kommt die Meldung das ein Spieler eine Einheit verloren hat.

    Soweit zu Problem 1. Problem 2 ist ebenfalls im Bereich Bürger vs Speer:
    Stirbt eine Einheit wird manchmal in der Anzeige die Einheitenzahl um 1 gesenkt und manchmal nicht! Bei Bürger vs Bürger funktioniert dies allerdings immer.


    Soweit die Theorie in der Praxis sieht allerdings für mich nach 10-20maligem überarbeiten richtig aus.

    Bevor ich zum Code komme muss ich noch erklären das es ein Combat Check System gibt. Es Prüft welche Einheit ausgewählt ist. Die Combat_ID wird beim Bewegen der Einheit automatisch geändert!

    Der Code ist aus der Sicht des 2.Spielers!

    Battle ID:
    1 = Bürger
    2 = Speer


    VB.NET-Quellcode

    1. Private Sub CombatCheck()
    2. If My.Settings.combat_id_p2 = "Villager" Then
    3. 'Dorfbewohner vs Dorfbewohner
    4. If ButtonVillager.Visible = True Then
    5. If ButtonVillager_p2.Location = ButtonVillager.Location Then
    6. My.Settings.battle_id_unit = "1"
    7. My.Settings.battle_id_unit_p2 = "1"
    8. CombatSystem()
    9. End If
    10. End If
    11. 'Dorfbewohner vs Speer
    12. If ButtonSpear.Visible = True Then
    13. If ButtonVillager_p2.Location = ButtonSpear.Location Then
    14. My.Settings.battle_id_unit = "2"
    15. My.Settings.battle_id_unit_p2 = "1"
    16. CombatSystem()
    17. End If
    18. End If
    19. End If
    20. If My.Settings.combat_id_p2 = "Spear" Then
    21. 'Speer vs Dorfbewohner
    22. If ButtonVillager.Visible = True Then
    23. If ButtonSpear_p2.Location = ButtonVillager.Location Then
    24. My.Settings.battle_id_unit = "1"
    25. My.Settings.battle_id_unit_p2 = "2"
    26. CombatSystem()
    27. End If
    28. End If
    29. 'Speer vs Speer
    30. If ButtonSpear.Visible = True Then
    31. If ButtonSpear_p2.Location = ButtonSpear.Location Then
    32. My.Settings.battle_id_unit = "2"
    33. My.Settings.battle_id_unit_p2 = "2"
    34. CombatSystem()
    35. End If
    36. End If
    37. End If
    38. End Sub



    Das war das Combat Check System. Nun zum CombatSystem:

    VB.NET-Quellcode

    1. Private Sub CombatSystem()
    2. '----------------------------
    3. ' Combat System Informaition:
    4. '----------------------------
    5. '----------------------------
    6. '----------------------------
    7. ' Units
    8. '----------------------------
    9. ' Battle ID Unit 1 = Dorfbewohner
    10. ' Battle ID Unit 2 = Speer
    11. ' Battle ID Unit 3 = Schwert 1
    12. ' Battle ID Unit 4 = Schwert 2
    13. '----------------------------
    14. 'Sound
    15. '----------------------------
    16. If My.Settings.setting_sound = "yes" Then My.Computer.Audio.Play(My.Resources.alert, AudioPlayMode.Background)
    17. '----------------------------
    18. 'CombatSystem
    19. '----------------------------
    20. 'Villager
    21. If My.Settings.battle_id_unit_p2 = "1" Then
    22. If My.Settings.battle_id_unit = "1" Then
    23. 'Unit 1 vs Unit 1
    24. Dim rnd As New Random()
    25. Dim result As Integer = rnd.Next(0, 10)
    26. LabelWin.Text = result
    27. '0-4 = Ich verliere | 5-9 = Anderer verliert | 1:1
    28. If LabelWin.Text > "4" Then
    29. ButtonVillager.Hide()
    30. player1map2.ButtonVillager.Hide()
    31. My.Settings.people = My.Settings.people - 1
    32. My.Settings.unit_villager = My.Settings.unit_villager - 1
    33. player1map1.ButtonVillager.Show()
    34. player1map1.LabelPeople.Text = player1map1.LabelPeople.Text - 1
    35. MsgBox("Player 1 has lost one unit!", MsgBoxStyle.Information, "Combat")
    36. ElseIf LabelWin.Text < "5" Then
    37. ButtonVillager_p2.Hide()
    38. player1map2.ButtonVillager_p2.Hide()
    39. My.Settings.people_p2 = My.Settings.people_p2 - 1
    40. My.Settings.unit_villager_p2 = My.Settings.unit_villager_p2 - 1
    41. player2map1.ButtonVillager.Show()
    42. player2map1.LabelPeople.Text = player2map1.LabelPeople.Text - 1
    43. MsgBox("Player 2 has lost one unit!", MsgBoxStyle.Information, "Combat")
    44. End If
    45. ElseIf My.Settings.battle_id_unit = "2" Then
    46. 'Unit 1 vs Unit 2
    47. Dim rnd2 As New Random()
    48. Dim result As Integer = rnd2.Next(0, 15)
    49. LabelWin.Text = result
    50. '0-9 = Ich verliere | 10-14 = Anderer verliert | 2:1
    51. If LabelWin.Text > "9" Then
    52. ButtonSpear.Hide()
    53. player1map2.ButtonSpear.Hide()
    54. My.Settings.people = My.Settings.people - 1
    55. My.Settings.unit_spear = My.Settings.unit_spear - 1
    56. player1map1.ButtonSpear.Show()
    57. player1map1.LabelPeople.Text = player1map1.LabelPeople.Text - 1
    58. MsgBox("Player 1 has lost one unit!", MsgBoxStyle.Information, "Combat")
    59. ElseIf LabelWin.Text < "10" Then
    60. ButtonVillager_p2.Hide()
    61. player1map2.ButtonVillager_p2.Hide()
    62. My.Settings.people_p2 = My.Settings.people_p2 - 1
    63. My.Settings.unit_villager_p2 = My.Settings.unit_villager_p2 - 1
    64. player2map1.ButtonVillager.Show()
    65. player2map1.LabelPeople.Text = player2map1.LabelPeople.Text - 1
    66. MsgBox("Player 2 has lost one unit!", MsgBoxStyle.Information, "Combat")
    67. End If
    68. End If
    69. End If
    70. 'Speer
    71. If My.Settings.battle_id_unit_p2 = "2" Then
    72. If My.Settings.battle_id_unit = "1" Then
    73. 'Unit 2 vs Unit 1
    74. Dim rnd3 As New Random()
    75. Dim result As Integer = rnd3.Next(0, 15)
    76. LabelWin.Text = result
    77. '0-4 = Ich verliere | 5-14 = Anderer verliert | 1:2
    78. If LabelWin.Text > "4" Then
    79. ButtonVillager.Hide()
    80. player1map2.ButtonVillager.Hide()
    81. My.Settings.people = My.Settings.people - 1
    82. My.Settings.unit_villager = My.Settings.unit_villager - 1
    83. player1map1.ButtonVillager.Show()
    84. player1map1.LabelPeople.Text = player1map1.LabelPeople.Text - 1
    85. MsgBox("Player 1 has lost one unit!", MsgBoxStyle.Information, "Combat")
    86. ElseIf LabelWin.Text < "5" Then
    87. ButtonSpear_p2.Hide()
    88. player1map2.ButtonSpear_p2.Hide()
    89. My.Settings.people_p2 = My.Settings.people_p2 - 1
    90. My.Settings.unit_spear_p2 = My.Settings.unit_spear_p2 - 1
    91. player2map1.ButtonSpear.Show()
    92. player2map1.LabelPeople.Text = player2map1.LabelPeople.Text - 1
    93. MsgBox("Player 2 has lost one unit!", MsgBoxStyle.Information, "Combat")
    94. End If
    95. ElseIf My.Settings.battle_id_unit = "2" Then
    96. 'Unit 2 vs Unit 2
    97. Dim rnd4 As New Random()
    98. Dim result As Integer = rnd4.Next(0, 10)
    99. LabelWin.Text = result
    100. '0-4 = Ich verliere | 5-9 = Anderer verliert
    101. If LabelWin.Text > "4" Then
    102. ButtonSpear.Hide()
    103. player1map2.ButtonSpear.Hide()
    104. My.Settings.people = My.Settings.people - 1
    105. My.Settings.unit_spear = My.Settings.unit_spear - 1
    106. player1map1.ButtonSpear.Show()
    107. player1map1.LabelPeople.Text = player1map1.LabelPeople.Text - 1
    108. MsgBox("Player 1 has lost one unit!", MsgBoxStyle.Information, "Combat")
    109. ElseIf LabelWin.Text < "5" Then
    110. ButtonSpear_p2.Hide()
    111. player1map2.ButtonSpear_p2.Hide()
    112. My.Settings.people_p2 = My.Settings.people_p2 - 1
    113. My.Settings.unit_spear_p2 = My.Settings.unit_spear_p2 - 1
    114. player2map1.ButtonSpear.Show()
    115. player2map1.LabelPeople.Text = player2map1.LabelPeople.Text - 1
    116. MsgBox("Player 2 has lost one unit!", MsgBoxStyle.Information, "Combat")
    117. End If
    118. End If
    119. End If
    120. End Sub



    Wenn ihr das ganze Problem Live sehen wollt: >Hier gehts zur Homepage des Games<
    edit: Beachtet das ich von der Version 0.4.2_11 Alpha rede, welche gerade als patch auf den server gezogen worden ist (16:12Uhr). Der Alpha Key ist 8211.

    Ich hoffe ich habe nichts vergessen zu erwähnen. Wenn ihr mir helfen könntet wäre das echt super ^^ - Danke schomal im vorraus.

    mfg Tixewi

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „Tixewi“ ()

    Bitte mal den Editor in "Quellcode" umschalten und dann noch mal den Code einfügen. Post bitte EDITIEREN und nicht NEU schreiben!
    Ohne Einrückungen wird man total blind. Allerdings mixt du auch wild Design und Logik - das machts nicht besser/einfacher lesbar!
    dürfte daran liegen dass du mit Strings RECHNEST!!!

    If Zahl < "10" -> sortierung erfolgt ALPHABETISCH! Bei einstelligen "Zahlen" kein Problem, aber bei zweistelligen ... BANG

    Denn!!!
    "2" ist größer als "10"
    aber
    2 ist kleiner als 10!!!

    Den wert im Label bitte nur zur ANZEIGE verwenden. Zum rechnen, vergleichen etc bitte mit deiner Variable "result" arbeiten!

    Ansonsten: Nun ja ;) SEHR viel Redundanz. Das nächste was du lernen möchtest ist sicherlich: Was sind Klassen und wie setze ich sie sinnvoll ein ;)
    Danke picoflop :thumbsup: . Allerdings hat sich dadurch Problem 2 verschlechtert. Jetzt zieht es bei beiden Spielern die getöteten Einheiten ab. Ich schau mal ob ich es herausfinde woran das liegt. Hoffe das ist nicht wieder was was ich nicht weis hehe.

    Edit: Kann keine neue Antwort grad schreiben also so:

    Player 1 funktioniert nun Bugfrei. Das heißt nur wenn Spieler 2 eine Einheit verliert wird nichts abgezogen ich schaue mal ob des an ner anderen Stelle vom Code liegt.



    Edit Edit: Haha ich habs gefunden. Spieler 1 hatte das nichtmehr wenn man auf die Dorfansicht zurück geht:

    VB.NET-Quellcode

    1. 'People Akutallisieren
    2. player2map1.LabelPeople.Text = My.Settings.people


    Wenn man das raus nimmt geht alles. Danke nochmal ;)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Tixewi“ ()

    Kleiner Quickhack, um zu zeigen worauf ich hinaus will:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Warrior
    2. Public Name As String
    3. Public AttackStrength As Integer
    4. Public DefenseStrength As Integer
    5. Public Agility As Integer
    6. Public PlayerID As Integer
    7. End Class
    8. Public Class Kampfergebnis
    9. Public Losses(1) As Integer
    10. Public IsOver As Boolean = False
    11. End Class
    12. Public Class BattleSystem
    13. Private ListeP1 As New List(Of Warrior)
    14. Private ListeP2 As New List(Of Warrior)
    15. Private r As New Random
    16. Public Sub foo()
    17. ListeP1.Clear()
    18. For i = 1 To 100
    19. Dim Buerger As New Warrior With {.Name = "Bürger", .AttackStrength = 5, .DefenseStrength = 2, .Agility = 4, .PlayerID = 0}
    20. ListeP1.Add(Buerger)
    21. Next
    22. ListeP2.Clear()
    23. For i = 1 To 50
    24. Dim Speertraeger As New Warrior With {.Name = "Speerträger", .AttackStrength = 15, .DefenseStrength = 3, .Agility = 3, .PlayerID = 1}
    25. ListeP2.Add(Speertraeger)
    26. Next
    27. Dim erg As Kampfergebnis
    28. Dim max As Integer = 5
    29. Do
    30. erg = Me.Fight(ListeP1, ListeP2)
    31. ListeP1.RemoveRange(0, erg.Losses(0))
    32. ListeP2.RemoveRange(0, erg.Losses(1))
    33. max -= 1
    34. Loop Until erg.IsOver Or max = 0
    35. Debug.Print("done")
    36. End Sub
    37. Public Function Fight(ByVal l1 As List(Of Warrior), ByVal l2 As List(Of Warrior)) As Kampfergebnis
    38. Dim erg As New Kampfergebnis
    39. ' Beide Listen in eine kopieren
    40. Dim Alle As New List(Of Warrior)
    41. Alle.AddRange(l1.ToArray)
    42. Alle.AddRange(l2.ToArray)
    43. ' Die Liste neu sortieren mit einem zufallswert für agility
    44. Dim Sortiert As New List(Of Warrior)
    45. Sortiert.AddRange((From w As Warrior In Alle Select w Order By (w.Agility * r.Next(1, 4))).ToArray)
    46. ' KAMPFFFFFF!
    47. While Sortiert.Count > 1
    48. ' Angreifer:
    49. Dim att As Warrior = Sortiert(0)
    50. Sortiert.RemoveAt(0)
    51. ' Verteidiger:
    52. Dim defliste = From w As Warrior In Sortiert Where w.PlayerID = (att.PlayerID + 1) Mod 2
    53. If defliste.Count = 0 Then Exit While
    54. Dim defnum = r.Next(0, defliste.Count)
    55. Dim def As Warrior = defliste(defnum)
    56. Sortiert.Remove(def)
    57. Dim WinRatio As Double = att.AttackStrength / (att.AttackStrength + def.DefenseStrength)
    58. If r.NextDouble() < WinRatio Then
    59. ' angreifer gewinnt
    60. Debug.Print(att.Name & " erschlägt " & def.Name)
    61. erg.Losses(def.PlayerID) += 1
    62. End If
    63. End While
    64. If erg.Losses(0) = l1.Count OrElse erg.Losses(1) = l2.Count Then
    65. erg.IsOver = True
    66. Else
    67. erg.IsOver = False
    68. End If
    69. Return erg
    70. End Function
    71. End Class


    Ist mE viel "lesbarer" ...