Module modRekursion
    Public intRandom As New Random         ' zufallszahl
    Public bGesperrt(15) As Boolean        ' gesperrte eingabefelder
    Public intAusblenden As Integer = 3    ' auswahl ausgeblendet
    Public Felder As New ArrayList
    Public Zahlen As New ArrayList
    Dim intAnzahLAbbruch As Integer = 0
    Dim booVorhanden(4) As Boolean
    Dim booAbbruch As Boolean = False
    Dim intZahl As Integer
    Dim intAnzahl As Integer = 0
    Dim intPos As Integer = 0
    Dim intAbbruch As Integer = 0

    Public Sub BeginneDasSpiel()
        intAnzahLAbbruch = 0
        FuelleErsteListe()
        FuelleZweiteListe()
        intAnzahLAbbruch = 0
        FuelleDritteListe()
        ZahlenEintragen()
        ZahlenAnzeigen()
    End Sub
    Private Sub ZahlenZuruecksetzen()
        Dim i As Integer
        For i = 0 To 4
            booVorhanden(i) = False
        Next
    End Sub
    Private Sub WerteZurücksetzen()
        intAnzahl = 0
        intPos = 0
        intAbbruch = 0
        booAbbruch = False
    End Sub
    Private Sub FuelleErsteListe()
        With frmSpiel.Lst0
            .Items.Clear()
            ZahlenZuruecksetzen()
            WerteZurücksetzen()
            intAnzahl = 0
            Do
                intZahl = intRandom.Next(1, 5)
                If Not booVorhanden(intZahl) Then
                    booVorhanden(intZahl) = True
                    .Items.Add(CStr(intZahl))
                    intAnzahl += 1
                End If
            Loop While intAnzahl < 4
        End With
    End Sub
    Private Sub FuelleZweiteListe()
        With frmSpiel.Lst1
            booAbbruch = False
            .Items.Clear()
            ZahlenZuruecksetzen()
            WerteZurücksetzen()
            Do
                intZahl = intRandom.Next(1, 5)
                If Not booVorhanden(intZahl) Then   ' noch nicht vorhanden
                    If Not intZahl = Convert.ToInt16(frmSpiel.Lst0.Items(intPos)) Then   ' vergleich liste
                        booVorhanden(intZahl) = True
                        .Items.Add(CStr(intZahl))
                        intAnzahl += 1
                        intPos += 1
                    Else
                        intAbbruch += 1
                        If intAbbruch >= 30 Then
                            booAbbruch = True
                            Exit Do
                        End If
                    End If
                End If
            Loop While intAnzahl < 4
            If booAbbruch Then
                FuelleZweiteListe()         ' neuer Aufruf
            End If
        End With
    End Sub
    Private Sub FuelleDritteListe()
        With frmSpiel.Lst2
            .Items.Clear()             ' listeninhalt lösche
            ZahlenZuruecksetzen()      ' noch nicht gezogen
            WerteZurücksetzen()        ' variable auf 0
            Do
                intZahl = intRandom.Next(1, 5)
                If Not booVorhanden(intZahl) Then   ' noch nicht vorhanden
                    If intZahl <> Convert.ToInt16(frmSpiel.Lst0.Items(intPos)) _
                        And intZahl <> Convert.ToInt16(frmSpiel.Lst1.Items(intPos)) Then
                        booVorhanden(intZahl) = True
                        .Items.Add(CStr(intZahl))         ' in liste eintragen
                        intAnzahl += 1                    ' anzahl zahlen
                        intPos += 1                       ' position in der Liste
                    End If
                Else
                    intAbbruch += 1
                    If intAbbruch >= 30 Then
                        booAbbruch = True
                        Exit Do
                    End If
                End If
            Loop While intAnzahl < 4
            If booAbbruch Then
                'MessageBox.Show("Abbruch")
                intAnzahLAbbruch += 1
                If intAnzahLAbbruch >= 5 Then
                    BeginneDasSpiel()           ' alles neu beginnen
                Else
                    FuelleDritteListe()         ' neuer Aufruf
                End If
            End If
        End With
    End Sub
    Private Sub LetzterSchritt()
        With frmSpiel.Lst3
            .Items.Clear()
            ZahlenZuruecksetzen()
            WerteZurücksetzen()
            Do
                intZahl = intRandom.Next(1, 5)
                If Not booVorhanden(intZahl) = True Then   ' noch nicht vorhanden
                    If intZahl <> Convert.ToInt16(frmSpiel.Lst0.Items(intPos)) And
                        intZahl <> Convert.ToInt16(frmSpiel.Lst1.Items(intPos)) And
                        intZahl <> Convert.ToInt16(frmSpiel.Lst2.Items(intPos)) Then
                        booVorhanden(intZahl) = True
                        .Items.Add(CStr(intZahl))
                        intAnzahl += 1
                        intPos += 1
                    End If
                Else
                    intAbbruch += 1
                    If intAbbruch >= 30 Then
                        booAbbruch = True
                        Exit Do
                    End If
                End If
            Loop While intAnzahl < 4
            If booAbbruch Then
                'MessageBox.Show("Abbruch")
                intAnzahLAbbruch += 1
                If intAnzahLAbbruch = 5 Then
                    LetzterSchritt()
                ElseIf intAnzahLAbbruch >= 10 Then
                    'MessageBox.Show("Neuer Start")
                    BeginneDasSpiel()
                End If
            End If
            If .Items.Count <> 4 Then
                BeginneDasSpiel()
            End If
        End With
    End Sub
    Private Sub ZahlenEintragen()
        Dim i, k As Integer
        With frmSpiel
            .Lst3.Items.Clear()
            For i = 0 To 3       ' listeneintrag
                For k = 1 To 4   ' zu ergänzende zahl
                    If k <> Convert.ToInt16(.Lst0.Items(i)) And
                        k <> Convert.ToInt16(.Lst1.Items(i)) And
                        k <> Convert.ToInt16(.Lst2.Items(i)) Then
                        .Lst3.Items.Add(CStr(k))
                    End If
                Next
            Next
        End With
    End Sub
    Public Sub ZahlenAnzeigen()
        With frmSpiel
            Dim i As Integer
            For i = 0 To 3
                Zahlen(i).Text = .Lst0.Items(i)
                Zahlen(i + 4).Text = .Lst1.Items(i)
                Zahlen(i + 8).Text = .Lst2.Items(i)
                Zahlen(i + 12).Text = .Lst3.Items(i)
            Next
            If .Opt2.Checked = True Then : intAusblenden = 3
            ElseIf .Opt3.Checked = True Then : intAusblenden = 4
            ElseIf .Opt4.Checked = True Then : intAusblenden = 5
            ElseIf .Opt5.Checked = True Then : intAusblenden = 6
            ElseIf .Opt6.Checked = True Then : intAusblenden = 8
            End If
            '--------------------
            Dim iKeineZahl(15) As Integer
            Dim bNichts(15) As Boolean
            For i = 1 To intAusblenden
                iKeineZahl(i) = intRandom.Next(0, 16)
                If bNichts(iKeineZahl(i)) = True Then
                    i -= 1
                Else
                    bNichts(iKeineZahl(i)) = True
                End If
            Next
            For i = 0 To 15
                If bNichts(i) = True Then
                    Zahlen(i).Text = ""
                    bGesperrt(i) = False
                    Zahlen(i).BackColor = Color.White
                    Felder(i).BackColor = Color.White
                Else
                    Zahlen(i).BackColor = Color.Yellow
                    Felder(i).BackColor = Color.Yellow
                    bGesperrt(i) = True
                End If
            Next
        End With
    End Sub
    Public Sub BeginneEinNeuesSpiel()
        Dim k As Integer
        For k = 0 To 15
            Felder(k).BackColor = Color.White
            Zahlen(k).BackColor = Felder(k).BackColor
            Zahlen(k).Text = ""
            bGesperrt(k) = True
        Next k
        BeginneDasSpiel()
    End Sub
End Module
