Sternenhimmel ala Wetten Dass

    • VB.NET

    Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Patschi.

      Sternenhimmel ala Wetten Dass

      Hallo,

      hier der Code meines - während dem Essen kochen entstandenen Game Sternenhimmel nach einer Idee von McCandy007.

      Die Klasse

      VB.NET-Quellcode

      1. Public Class ClassSternenhimmel
      2. Private _groesse As Size
      3. Private _anzahl As Integer
      4. Private _sterne As New List(Of Point)
      5. Private _fehlenderStern As Point
      6. Public Event Sterne(ByVal sender As Object, ByVal e As SterneEventArgs)
      7. ''' <summary>Neue Instanu der Klasse.</summary>
      8. ''' <param name="groesse">Größe der Darstellfläche (Beide Seiten zusammen)</param>
      9. ''' <param name="anzahl">Anzahl der Sterne, welche rzeugt werden sollen.</param>
      10. ''' <remarks></remarks>
      11. Public Sub New(ByVal groesse As Size, ByVal anzahl As Integer)
      12. _groesse = groesse
      13. _anzahl = anzahl
      14. End Sub
      15. ''' <summary>Erzeugen der Sterne anstossen.</summary>
      16. ''' <remarks></remarks>
      17. Public Sub SerneErzeugen()
      18. SterneErzeugen()
      19. End Sub
      20. ''' <summary>Alle Sterne erzeugen.</summary>
      21. ''' <remarks></remarks>
      22. Private Sub SterneErzeugen()
      23. Dim r As New Random()
      24. 'Sterne so erzeugen, dass kein Stern auf dem Anderen liegt.
      25. Do
      26. find_point_arg = New Point(r.Next(1, _groesse.Width / 2), r.Next(1, _groesse.Height))
      27. If _sterne.FindIndex(AddressOf find_point) = -1 Then
      28. _sterne.Add(find_point_arg)
      29. End If
      30. Loop While _sterne.Count < _anzahl
      31. 'Fehlenden Stern auswählen
      32. _fehlenderStern = _sterne(r.Next(1, _anzahl))
      33. 'Anzeigen, dass alle Sterne erzeugt wurden.
      34. RaiseEvent Sterne(Me, New SterneEventArgs())
      35. End Sub
      36. 'Suche - Collection
      37. Private find_point_arg As Point
      38. Private Function find_point(ByVal p As Point) As Boolean
      39. If p = find_point_arg Then
      40. Return True
      41. Else
      42. Return False
      43. End If
      44. End Function
      45. ''' <summary>Gibt alle Sterne zurück.</summary>
      46. ''' <value></value>
      47. ''' <returns></returns>
      48. ''' <remarks></remarks>
      49. Public ReadOnly Property GetSterne() As List(Of Point)
      50. Get
      51. Return _sterne
      52. End Get
      53. End Property
      54. ''' <summary>Gibt den fehlenden Stern zurück.</summary>
      55. ''' <value></value>
      56. ''' <returns></returns>
      57. ''' <remarks></remarks>
      58. Public ReadOnly Property GetFehlendenStern() As Point
      59. Get
      60. Return _fehlenderStern
      61. End Get
      62. End Property
      63. End Class
      64. Public Class SterneEventArgs
      65. Inherits EventArgs
      66. Public Sub New()
      67. End Sub
      68. End Class


      Die Form

      VB.NET-Quellcode

      1. Public Class Form1
      2. Private WithEvents _cs As ClassSternenhimmel
      3. Private Sub ButtonNeuerHimmel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonNeuerHimmel.Click
      4. 'Prüfen ob die Eingabe der Anzahl der Sterne korrekt ist.
      5. If IsNumeric(Me.TextBoxAnzahlSterne.Text) = True AndAlso CInt(Me.TextBoxAnzahlSterne.Text) < 1001 Then
      6. 'Neue Instanz der Klasse
      7. _cs = New ClassSternenhimmel(Me.PictureBoxSternenhimmel.Size, Math.Abs(CInt(Me.TextBoxAnzahlSterne.Text)))
      8. 'Handler erzeugen
      9. AddHandler _cs.Sterne, AddressOf _cs_Sterne
      10. 'Sterne erzeugen
      11. _cs.SerneErzeugen()
      12. Else
      13. 'Zurücksetzen der Picturebox - bei falscher Eingabe
      14. Me.TextBoxAnzahlSterne.Text = "100"
      15. End If
      16. End Sub
      17. Private Sub _cs_Sterne(ByVal sender As Object, ByVal e As SterneEventArgs) ' Handles _cs.Sterne
      18. 'Sternenhimmel zeichnen
      19. Dim b As New Bitmap(Me.PictureBoxSternenhimmel.Width, Me.PictureBoxSternenhimmel.Height)
      20. Using g As Graphics = Graphics.FromImage(b)
      21. g.Clear(Color.Black)
      22. For Each p As Point In _cs.GetSterne
      23. 'Fehlenden Stern in der linken Hälfte nicht zeichnen
      24. If p <> _cs.GetFehlendenStern Then
      25. g.DrawRectangle(Pens.White, New Rectangle(p, New Size(1, 1)))
      26. End If
      27. 'Rechts alle Sterne zeichnen
      28. g.DrawRectangle(Pens.White, New Rectangle(Point.Add(p, New Size(Me.PictureBoxSternenhimmel.Width / 2, 0)), New Size(1, 1)))
      29. Next
      30. End Using
      31. Me.PictureBoxSternenhimmel.Image = b
      32. 'Trennlinie zeichnen
      33. drawline()
      34. End Sub
      35. Private Sub PictureBoxSternenhimmel_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBoxSternenhimmel.MouseDown
      36. 'Bereich in dem der Mausklick sein muss um einen Treffer zu erkennen.
      37. Dim testsize As New Size(20, 20)
      38. Dim r As New Rectangle(Point.Subtract(_cs.GetFehlendenStern, New Size(10, 10)), testsize)
      39. 'Fehlenden Stern und Markierung einzeichnen
      40. Dim b As Bitmap = Me.PictureBoxSternenhimmel.Image
      41. Using g As Graphics = Graphics.FromImage(b)
      42. g.FillRectangle(Brushes.White, New Rectangle(_cs.GetFehlendenStern, New Size(2, 2)))
      43. g.DrawEllipse(Pens.White, r)
      44. End Using
      45. Me.PictureBoxSternenhimmel.Image = b
      46. 'Messagebox ausgabe
      47. If r.Contains(e.Location) Then
      48. MessageBox.Show("Richtig")
      49. Else
      50. MessageBox.Show("Falsch")
      51. End If
      52. End Sub
      53. Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBoxHimmelTrennung.CheckedChanged
      54. drawline()
      55. End Sub
      56. Private Sub drawline()
      57. Dim p As Pen
      58. If Me.CheckBoxHimmelTrennung.Checked = True Then
      59. p = Pens.White
      60. Else
      61. p = Pens.Black
      62. End If
      63. Dim b As Bitmap = Me.PictureBoxSternenhimmel.Image
      64. Using g As Graphics = Graphics.FromImage(b)
      65. g.DrawLine(p, CInt(Me.PictureBoxSternenhimmel.Width / 2), 0, CInt(Me.PictureBoxSternenhimmel.Width / 2), Me.PictureBoxSternenhimmel.Height)
      66. End Using
      67. Me.PictureBoxSternenhimmel.Image = b
      68. End Sub
      69. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      70. 'Leeres Image erzeugen um keine Ausnahme beim Linienzeichen zu erhalten
      71. Dim b As New Bitmap(Me.PictureBoxSternenhimmel.Width, Me.PictureBoxSternenhimmel.Height)
      72. Using g As Graphics = Graphics.FromImage(b)
      73. g.Clear(Color.Black)
      74. End Using
      75. Me.PictureBoxSternenhimmel.Image = b
      76. End Sub
      77. End Class

      Gruss

      mikeb69

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

      Danke!

      Hab mich ein wenig gespielt und hab das für die, die sich nicht auskennen als Anhang angehängt.
      War nicht viel Arbeit, aber ich find immer wieder lustig den Stern zu suchen.

      Screenshot ist ebenfalls im Anhang.

      ~ Edit ~
      Hab den Kreis, womit der fehlende Stern gekennzeichnet wird, in rot gefärbt.
      Sieht man dann besser!

      Die Farbe könnt ihr hier ändern:

      VB.NET-Quellcode

      1. Private Sub PictureBoxSternenhimmel_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBoxSternenhimmel.MouseDown
      2. 'Bereich in dem der Mausklick sein muss um einen Treffer zu erkennen.
      3. Dim testsize As New Size(20, 20)
      4. Dim r As New Rectangle(Point.Subtract(_cs.GetFehlendenStern, New Size(10, 10)), testsize)
      5. 'Fehlenden Stern und Markierung einzeichnen
      6. Dim b As Bitmap = Me.PictureBoxSternenhimmel.Image
      7. Using g As Graphics = Graphics.FromImage(b)
      8. g.FillRectangle(Brushes.White, New Rectangle(_cs.GetFehlendenStern, New Size(2, 2)))
      9. g.DrawEllipse(Pens.Red, r) '<= Ändere einfach das "Red" zu "White", dann ist der Kreis wieder weiß!
      10. End Using
      11. Me.PictureBoxSternenhimmel.Image = b
      12. 'Messagebox ausgabe
      13. If r.Contains(e.Location) Then
      14. MessageBox.Show("Richtig")
      15. Else
      16. MessageBox.Show("Falsch")
      17. End If
      18. End Sub


      Weiterhin hab ich das maximum auf 10 000 gestellt. <= Fasst alles weiß xD
      Bilder
      • screenshot_sternenhimmel.jpg

        48,73 kB, 840×602, 545 mal angesehen
      Dateien
      • Sternenhimmel.zip

        (86,28 kB, 261 mal heruntergeladen, zuletzt: )
      Meine neue Homepage: pkern.at
      Wetter bei mir zu Haus:

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

      Hallo Patschi,

      ich glaube mein Code hat noch einen Schönheitsfehler.
      Sterne aus der rechten Hälfte können soweit rechts sein, dass Sie aus dem Anzeigebreich fallen.

      Das fällt dann auf, wenn du nur sehr wenige Sterne anzeigen lässt.

      Gruss

      mikeb69
      Also ich habs jetzt mit 2 Sternen oft versucht.
      Die waren aber im Bild.

      Also ist die Chance eh sehr gering, dass ein Stern aus dem Bild fällt.

      Achja:

      VB.NET-Quellcode

      1. If IsNumeric(Me.TextBoxAnzahlSterne.Text) = True AndAlso CInt(Me.TextBoxAnzahlSterne.Text) < 1001 Then


      Wenn ich 1 als Sternenanzahl eingebe, stürzt das Programm ab!

      Fehler:
      ArgumentOutOfRangeException wurde nicht behandelt
      Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein. Parametername: index

      Zeile:

      VB.NET-Quellcode

      1. _fehlenderStern = _sterne(r.Next(1, _anzahl))


      Deshalb hab ich das so geändert:

      VB.NET-Quellcode

      1. If IsNumeric(Me.TextBoxAnzahlSterne.Text) = True AndAlso CInt(Me.TextBoxAnzahlSterne.Text) < 1001 AndAlso CInt(Me.textBoxAnzahlSterne.Text) > 1 Then


      Kannst es ja vielleicht beheben, dass es auch mit einen Stern funktioniert.

      Ich blick selber noch nicht den Code durch xD
      Für das bin ich noch zu "doof" ^^
      Meine neue Homepage: pkern.at
      Wetter bei mir zu Haus: