Making a Small Lotto Game in VB.NET

Introduction

If you are one of the many unlucky ones who has never won anything in a lottery, well, this article is for you. Because I didn’t win the lottery so that I could live a more comfortable life without stress and being tired all the time because of the three jobs I do, I decided to see if I can create a basic lottery type game. At least I can always win with my game, and it is free to play…

Let’s get right into it; there is actually quite a lot of work.

Design

Open Visual Studio and create a new Visual Basic.NET Windows Forms project. Add panels, timers, and buttons to your form so that it resembles Figure 1.

Design
Figure 1: Design

Let’s move on to the code.

The Code

Add a new Class and name it clsShuffle, then add the next code in it.

Public Class clsShuffle

   Const intSize As Integer = 20
   Public intMin As Integer
   Public intMax As Integer

   Private dbSize(intSize - 1) As Double
   Private intThird As Integer
   Private intHalf As Integer

   Public dbRand As Double
   Public intRand As Integer

   Public Sub Shuffle(ByVal dbVal As Double)

      Dim stVal As String
      Dim i As Integer

      Take()

      stVal = Str$(dbVal)

      For i = 1 To Len(stVal)

         Mix(1 / Asc(Mid$(stVal, i, 1)))

      Next

      Randomize(Rnd(dbSize(intThird) * Math.Sign(dbVal)))

      For i = 1 To intSize * 2.5

         Mix(Rnd())

      Next

   End Sub

   Public ReadOnly Property RandomDouble() As Double

      Get

         intThird = (intThird + 1) Mod intSize
         intHalf = (intHalf + 1) Mod intSize

         dbSize(intThird) += dbSize(intThird) + Rnd()
         dbSize(intThird) = dbSize(intThird) - _
            Int(dbSize(intThird))

         dbRand = dbSize(intThird)

         Return dbRand

      End Get

   End Property


   Public ReadOnly Property RandomInt() As Integer

      Get

         intRand = Int(RandomDouble() * intMax - intMin + 1) + _
            intMin

         Return intRand

      End Get

   End Property

   Private Sub Take()

      Dim i As Integer

      For i = 1 To intSize - 1

         dbSize(i) = 1 / i

      Next

      intThird = intSize / 2
      intHalf = intSize / 3

      If intThird = intHalf Then

         intThird = intThird + 1

      End If

   End Sub

   Private Sub Mix(ByVal dbVal As Double)

      intThird = (intThird + 1) Mod intSize
      intHalf = (intHalf + 1) Mod intSize

      dbSize(intThird) += dbSize(intThird) + dbVal
      dbSize(intThird) = dbSize(intThird) - Int(dbSize(intThird))

   End Sub

End Class

On the form, add the following variables:

   Const iMax As Integer = 56
   Const iPowerMax As Integer = 46

   Private blnShow As Boolean = False

   Dim Balls(50)
   Dim PowerBalls(40)

   Dim cShuffleBalls As New clsShuffle
   Dim cShufflePowerBalls As New clsShuffle

   Dim intPowerBall As Integer

Add the Form Load event that starts the application:

   Private Sub frmLotto_Load(sender As Object, e As _
         System.EventArgs) Handles Me.Load

      Randomize()

      cShuffleBalls.Shuffle(Rnd)
      cShufflePowerBalls.Shuffle(Rnd)

      cShuffleBalls.intMin = 1
      cShuffleBalls.intMax = iMax

      cShufflePowerBalls.intMin = 1
      cShufflePowerBalls.intMax = iPowerMax

      tmrBalls.Start()

   End Sub

This sets all the default properties. Add the Timer Tick events for both Timers.

   Private Sub tmrBalls_Tick(sender As Object, e As _
         System.EventArgs) Handles tmrBalls.Tick

      blnShow = True
      pnlDrum.Invalidate()

   End Sub
   Private Sub tmrPower_Tick(sender As Object, e As _
         System.EventArgs) Handles tmrPower.Tick

      blnShow = True
      pnlPowerDrum.Invalidate()

   End Sub

This determines if the normal balls’ panel should show or only the Powerball’s panel. Add the code for the buttons:

   Private Sub btnNext_Click(sender As Object, e As _
         System.EventArgs) Handles btnNext.Click

      If btnNext.Text = "Play again" Then

         btnNext.Text = "Next Ball"
         tmrBalls.Start()

      End If

      Dim i As Integer

      i = Balls(0)

      If i = 5 Then

         For i = 0 To 5

            Balls(i) = 0

         Next

         Exit Sub

      End If

      NextBall(Balls)

      If Balls(0) = 5 Then

         btnNext.Text = "Play again"
         tmrBalls.Stop()
         pnlDrum.Hide()

         pnlPowerDrum.Show()
         tmrPower.Start()

      End If

   End Sub
   Private Sub btnClearAll_Click(sender As System.Object, e As _
         System.EventArgs) Handles btnClear.Click

      ClearBalls()

   End Sub
   Private Sub btnPowerBall_Click(sender As Object, e As _
         System.EventArgs) Handles btnPowerBall.Click

      NextPowerBall(PowerBalls)

      tmrBalls.Stop()
      pnlDrum.Show()
      pnlPowerDrum.Hide()
      tmrPower.Stop()


   End Sub

The Next Ball button picks another ball. The Powerball button picks the Powerball. The Clear button clears all the drawings from all the panels.

Add the ball picking sub procedures:

   Private Sub NextBall(ByVal tmpArray())

      Dim i As Integer
      Dim j As Integer = 0

      tmpArray(0) = tmpArray(0) + 1
      i = tmpArray(0)

      Do

         tmpArray(i) = cShuffleBalls.RandomInt

         Display(tmpArray(i))

         If i > 1 Then

            For j = 1 To (i - 1)

               If tmpArray(i) = tmpArray(j) Then

                  tmpArray(i) = 0

               End If

            Next

         End If

      Loop Until tmpArray(i)

   End Sub

   Private Sub NextPowerBall(ByVal arrTemp())

      Dim i As Integer
      Dim j As Integer = 0

      arrTemp(0) = arrTemp(0) + 1
      i = arrTemp(0)

      Do

         arrTemp(i) = cShuffleBalls.RandomInt

         DisplayPowerBall(arrTemp(i))

         If i > 1 Then

            For j = 1 To (i - 1)

               If arrTemp(i) = arrTemp(j) Then

                  arrTemp(i) = 0

               End If

            Next

         End If

      Loop Until arrTemp(i)

   End Sub

   Private Sub DisplayPowerBall(ByVal intVal As Integer)

      intPowerBall = intVal

      Select Case intPowerBall

         Case 1 To 40

            blnShow = True
            pnlPowerBall.Invalidate()

      End Select

   End Sub

The sub procedures randomize the next ball number with the help of the Shuffle class and picks a ball to display. This is where things get interesting. We need to display the balls somewhere. Now, because we have so many panels, it will be extremely difficult to post all the code here, that is why I have put it on GitHub here.

Let’s add the panels for the shuffling of the balls, as well as the panel for displaying some of the balls.

   Private Sub pnlTumble_Paint(sender As Object, e As _
         System.Windows.Forms.PaintEventArgs) Handles pnlDrum.Paint

      Dim i As Integer = 0
      Dim intX As Integer
      Dim intY As Integer

      Dim rRand As New Random
      Dim rctDraw As New Rectangle

      For i = 1 To 50

         intX = rRand.Next(1, 300)
         intY = rRand.Next(1, 400)

         rctDraw.Height = 50
         rctDraw.Width = 50

         rctDraw.Location = New Point(intX, intY)

         e.Graphics.FillEllipse(Brushes.White, rctDraw.X, _
            rctDraw.Y, 50, 50)

         Dim fDraw As Font = New Font("Arial", 10, FontStyle.Bold)

         Dim StringSize As SizeF = _
            e.Graphics.MeasureString(i.ToString(), fDraw)

         e.Graphics.DrawString(i.ToString(), fDraw, Brushes.Black, _
            (rctDraw.Left + 25) - (StringSize.Width / 2), _
            (rctDraw.Top + 25) - (StringSize.Height / 2))

      Next

      e.Graphics.Clear(Color.Black)
      e.Graphics.Dispose()

   End Sub

   Private Sub pnlPowerDrum_Paint(sender As Object, e As _
         System.Windows.Forms.PaintEventArgs) Handles _
         pnlPowerDrum.Paint

      Dim i As Integer = 0
      Dim xPos As Integer
      Dim yPos As Integer
      Dim rr As New Random
      Dim rect As New Rectangle

      For i = 1 To 40
         xPos = rr.Next(1, 300)
         yPos = rr.Next(1, 400)

         rect.Height = 50
         rect.Width = 50
         rect.Location = New Point(xPos, yPos)

         e.Graphics.FillEllipse(Brushes.Yellow, rect.X, rect.Y, _
            50, 50)

         Dim f As Font = New Font("Arial", 12, FontStyle.Bold)
         Dim StringSize As SizeF = _
            e.Graphics.MeasureString(i.ToString(), f)

         e.Graphics.DrawString(i.ToString(), f, Brushes.Black, _
            (rect.Left + 25) - (StringSize.Width / 2), _
            (rect.Top + 25) - (StringSize.Height / 2))
      Next
      e.Graphics.Clear(Color.Black)
      e.Graphics.Dispose()
   End Sub

Private Sub pnlPowerBall_Paint(sender As Object, e As _
         System.Windows.Forms.PaintEventArgs) Handles _
         pnlPowerBall.Paint

      If blnShow Then

         Dim rect As New Rectangle
         rect.Height = 93
         rect.Width = 93
         rect.Location = New Point(0, 0)

         e.Graphics.FillEllipse(Brushes.Yellow, rect.X, rect.Y, _
            93, 93)
         Dim strPowerBall As String = "Power Ball"
         Dim t As String = intPowerBall.ToString
         Dim f As Font = New Font("Arial", 16, FontStyle.Bold)
         Dim StringSize As SizeF = e.Graphics.MeasureString(t, f)
         e.Graphics.DrawString(t, f, Brushes.Black, _
            (rect.Width / 2) - (StringSize.Width / 2), _
            (rect.Height / 2) - (StringSize.Height / 2))

         Dim fmb As Font = New Font("Arial", 10, FontStyle.Bold)

         Dim mbStringSize As SizeF = _
            e.Graphics.MeasureString(strPowerBall, fmb)

         e.Graphics.DrawString(strPowerBall, fmb, Brushes.Black, _
            (rect.Left + 47) - (mbStringSize.Width / 2), _
            (rect.Top + 18) - (mbStringSize.Height / 2))

         e.Graphics.Dispose()

      End If

   End Sub

This shuffles all the balls and displays the power ball.

The logic to clear all the balls as well as paint each ball is present in the project on GitHub, here.

Conclusion

I hope you have enjoyed this article. Yes, it was a lot of work and it could have been done much better with much less code, but this enables newbies to also follow the logic properly.

Hannes DuPreez
Hannes DuPreez
Ockert J. du Preez is a passionate coder and always willing to learn. He has written hundreds of developer articles over the years detailing his programming quests and adventures. He has written the following books: Visual Studio 2019 In-Depth (BpB Publications) JavaScript for Gurus (BpB Publications) He was the Technical Editor for Professional C++, 5th Edition (Wiley) He was a Microsoft Most Valuable Professional for .NET (2008–2017).

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read