Module modFunktionen

    Public AlleZahlen As New ArrayList     ' zahlen für die Auswahl
    Public ZeichneWuerfel As New ArrayList ' wuerfel
    Public BildNr As New ArrayList         ' bild aus frmBilder
    Public RechenZeichen As New ArrayList  ' label zwischen den würfeln

    Public intAugenZahlen(5) As Integer           ' augenzahl des jeweiligen Würfels
    Public intAugenzahlAktuell As Integer         ' aktuelle Augenzahl für die berechnung
    Public booGesperrt As Boolean                 ' würfel ohne bild
    Public booGewaehlt(11) As Boolean             ' bereits gewählte würfel
    Public intZwischenErgebnis As Integer = 0     ' zwischenergebnis der berechnungen

    Public intPunktZahl As Integer                ' aktuelle punktzahl    
    Public intPosRechenzeichen As Integer         ' gewählte rechenart
    Private booBereitsGezogen(100) As Boolean     ' keine zahl doppelt
    Private intRandom As New Random               ' zufallsgenerator

    ' wird aufgerufen vor spielbeginn
    Public Sub GrundEinstellung()
        Dim i As Integer
        With Form1
            .GrpBerechnungen.Enabled = False : .GrpRechenOperationen.Enabled = False
            .LstZahlen.Items.Clear() : .LstBonus.Items.Clear()
            For i = 0 To 5
                ZeichneWuerfel(i).Image = BildNr(0).Image
            Next
            .LblPunkte.Text = "0"
            .LblAktuell.Text = "0"
            .LblR.Text = "0"
            intZwischenErgebnis = 0
        End With
        For i = 0 To 19 : AlleZahlen(i).Text = "" : Next
        For i = 0 To 4 : RechenZeichen(i).Text = "" : Next
    End Sub
    Public Sub StarteDasSpiel()
        With Form1
            Dim i As Integer
            Dim intAnzahl As Integer = 0
            '---  20 zahlen ermitteln und 4 bonuszahlen bestimmen
            For i = 0 To 100 : booBereitsGezogen(i) = False : Next
            '.LblAktuell.Text = "0" : .LblPunkte.Text = "0"
            'intZwischenErgebnis = 0 : intAugenzahlAktuell = 0
            Do
                booBereitsGezogen(Zufallszahl(1, 101)) = True
                intAnzahl += 1
            Loop While intAnzahl < 20
            For i = 1 To 100 '- zahlen in die liste schreiben
                If booBereitsGezogen(i) = True Then
                    .LstZahlen.Items.Add(i.ToString)
                End If
            Next  '-- zahlen anzeigen
            For i = 0 To .LstZahlen.Items.Count - 1
                AlleZahlen(i).Text = .LstZahlen.Items(i)
            Next
            .LblInfo.Text = "Klicke auf >Würfeln<," & vbCrLf &
                     "um das Spiel zu beginnen."
        End With
        BonusZahlenBestimmen()
    End Sub
    '-- TODO zufallszahlen
    Public Function Zufallszahl(ByVal intTief As Integer, ByVal intHoch As Integer) As Integer
        Do
            Zufallszahl = intRandom.Next(intTief, intHoch)
            If Not booBereitsGezogen(Zufallszahl) Then
                Exit Do      ' korrekte zufallszahl
            End If
        Loop
        Return Zufallszahl
    End Function
    Public Sub BonusZahlenBestimmen()
        Dim i As Integer
        With Form1
            .LstBonus.Items.Clear()             '-- liste löschen
            If .LstZahlen.Items.Count >= 5 Then
                For i = 0 To 19 : booBereitsGezogen(i) = False : Next
                For i = 0 To 3                     '-- 4 zahlen ermitteln
                    booBereitsGezogen(Zufallszahl(0, .LstZahlen.Items.Count)) = True
                Next
                For i = 0 To 19                ' ermittelte zahlen in liste einfügen
                    If booBereitsGezogen(i) = True Then .LstBonus.Items.Add(i.ToString)
                Next
            Else
                '-- TODO 4 Bonuszahlen oder weniger behandeln
                For i = 0 To .LstZahlen.Items.Count - 1
                    .LstBonus.Items.Add(i.ToString)
                Next
            End If
            '-- alle vorhanden zahlen schwarz einfärben
            For i = 0 To .LstZahlen.Items.Count - 1
                AlleZahlen(i).ForeColor = Color.Black
            Next
            For i = 0 To .LstBonus.Items.Count - 1       ' aktuelle bonuzzahlen rot anzeigen
                AlleZahlen(Convert.ToInt32(.LstBonus.Items(i))).ForeColor = Color.Red
            Next
        End With
    End Sub
    Public Sub VerschiebeWuerfel(intWuerfelNr As Integer)
        Dim i As Integer, intPosition As Integer
        Dim strInfo As String = "Wähle eine Rechensymbol," & vbCrLf &
                    "um eine Berechnung auszuführen."
        '-- zuweisung der augenzahl
        intAugenzahlAktuell = intAugenZahlen(intWuerfelNr)
        booGewaehlt(intWuerfelNr) = True  '-- auswahl sperren
        For i = 6 To 11
            If Not booGewaehlt(i) Then
                intPosition = i  '-- nächste freie position finden
                Exit For
            End If
        Next
        intPosRechenzeichen = i - 7  '-- position für rechenzeichens
        '-- würfel auf freier postion darstellen
        ZeichneWuerfel(intPosition).Image = ZeichneWuerfel(intWuerfelNr).Image
        booGewaehlt(intPosition) = True              '-- position sperren
        ZeichneWuerfel(intWuerfelNr).Image = Nothing
        With Form1                  '-- abfrage der positionen
            If intPosition = 6 Then
                intZwischenErgebnis = intAugenzahlAktuell
                .LblInfo.Text = "Wähle einen zweiten Würfel," & vbCrLf &
                    "um die erste Berechnung auszuführen."
            ElseIf intPosition = 7 Then
                booGesperrt = True                       '-- alle würfel sperren
                .GrpRechenOperationen.Enabled = True     '-- rahmen berechnen aktivieren
                .CmdOk.Enabled = False                   '-- übernehmen deaktivieren
                .LblInfo.Text = strInfo
            Else
                intZwischenErgebnis = Convert.ToInt32(.LblAktuell.Text)
                booGesperrt = True
                .LblInfo.Text = strInfo
            End If
        End With
    End Sub
    '------------------------  würfeln
    Public Sub NeuWuerfeln()
        Dim i As Integer     ' schleifenlaufparameter   
        For i = 0 To 5       ' zufallszahl zuweisen
            intAugenZahlen(i) = intRandom.Next(1, 7)
        Next
    End Sub
    Public Sub BilderZuweisen()
        Dim i As Integer
        For i = 0 To 5
            ZeichneWuerfel(i).Image = BildNr(intAugenZahlen(i)).Image
        Next
    End Sub
    Public Sub WuerfelZuruecklegen()
        Dim i As Integer
        For i = 0 To 5
            ZeichneWuerfel(i).Image = BildNr(intAugenZahlen(i)).Image
            ZeichneWuerfel(i + 6).Image = Nothing
        Next
        For i = 0 To 11 : booGewaehlt(i) = False : Next
        For i = 0 To 4 : RechenZeichen(i).Text = "" : Next  ' alle rechenzeichen entfernen
        With Form1
            .GrpRechenOperationen.Enabled = False
            .LblInfo.Text = "Wähle den ersten Würfel" & vbCrLf & "für eine neue Berechnung."
            '.LblR.Text = 
            .LblAktuell.Text = "0" : intZwischenErgebnis = 0  ' aktuelle berechnung zurücksetzen
        End With
        booGesperrt = False
    End Sub
    '-- TODO berechnung des aktuellen ergebisses
    Public Sub BerechneZwischenergebnis(intRechenModus As Integer)
        Dim intAktuellZwischenErgebnis As Integer
        With Form1
            intAktuellZwischenErgebnis = Ergebnis(intRechenModus)    ' function     
            booGesperrt = False    ' auswahl der Würfel freigenen
            .LblAktuell.Text = intAktuellZwischenErgebnis.ToString
            If RechenZeichen(1).Text <> "" Then    '-- 2 rechenzeichen ist vorhanden
                .CmdOk.Enabled = True              '-- übernahme des Ergebnisses möglich
            End If
            '-- informatuionen für den spieler
            If Not .CmdOk.Enabled Then
                .LblInfo.Text = "Die Berechnung wurde durchgeführt." & vbCrLf &
                    "Wähle einen weiteren Würfel."
            Else
                If RechenZeichen(4).Text = "" Then
                    .LblInfo.Text = "Wähle einen weiteren Würfel," & vbCrLf &
                        "oder klicke auf >Übernehmen<."
                Else
                    .LblInfo.Text = "Die Berechnung ist abgeschlossen." & vbCrLf &
                        "Klicke auf >Übernehmen<," & vbCrLf &
                        "oder auf >Neuer Versuch<."
                End If
            End If
        End With
    End Sub
    Public Function Ergebnis(ByRef intModus As Integer) As Integer
        Select Case intModus
            Case 1   '-- +
                Ergebnis = intZwischenErgebnis + intAugenzahlAktuell
            Case 2   '-- -
                Ergebnis = intZwischenErgebnis - intAugenzahlAktuell
            Case 3   '-- X
                Ergebnis = intZwischenErgebnis * intAugenzahlAktuell
            Case 4   '-- / 
                Ergebnis = intZwischenErgebnis / intAugenzahlAktuell
        End Select
        Return Ergebnis
    End Function
    Public Sub ProbeIstZahlVorhanden()
        Dim strErgebnis As String
        Dim booBonusZahl As Boolean
        With Form1
            strErgebnis = .LblAktuell.Text
            If FindeZahl(strErgebnis, 0) Then
                booBonusZahl = FindeZahl(strErgebnis, 1)
                '--### TODO   sound ev. transparentes fenster 
                BerechneErgebnisSpielrunde(booBonusZahl)
            Else
                .LblInfo.Text = .LblAktuell.Text &
                    " ist als Zahl nicht vorhanden." & vbCrLf &
                    "Du bekommst keine Punkte." & vbCrLf &
                     "Klicke auf >Würfeln<" & vbCrLf &
                     "um die nächste Spielrunde zu beginnen."
                strErgebnis = ""
            End If
        End With
        EntferneZahl(strErgebnis)
    End Sub
    Function FindeZahl(ByVal strErgebnis As String, ByVal intBonus As Integer) As Boolean
        FindeZahl = False
        Dim i As Integer
        Dim strVergleich As String
        With Form1
            If intBonus = 0 Then
                For i = .LstZahlen.Items.Count - 1 To 0 Step -1
                    If strErgebnis = .LstZahlen.Items(i) Then FindeZahl = True
                Next
            Else                      ' bonuszahl
                For i = .LstBonus.Items.Count - 1 To 0 Step -1
                    ' in lstBonus sind die positionen der lstZahlen enthalten
                    strVergleich = .LstZahlen.Items(.LstBonus.Items(i))
                    If strErgebnis = strVergleich Then FindeZahl = True
                Next
            End If
        End With
        Return FindeZahl
    End Function
    Public Sub BerechneErgebnisSpielrunde(booBonusZahl As Boolean)
        Dim i As Integer, intErgibt As Integer
        Dim intAnzahl As Integer = 0
        For i = 6 To 11          ' zählen der würfel
            If booGewaehlt(i) Then intAnzahl += 1
        Next
        ' bonuszahl errechnet
        If booBonusZahl = True Then intAnzahl += 1
        intErgibt = 2 ^ intAnzahl
        With Form1

            .LblPunkte.Text = intErgibt + Convert.ToInt32(.LblPunkte.Text)
            .LblR.Text = intErgibt.ToString
            .LblInfo.Text = "Du hast " & intErgibt.ToString & " Punkte erhalten." & vbCrLf &
                    "Klicke auf >Würfeln<" & vbCrLf & "um die nächste Spielrunde zu beginnen."
        End With
    End Sub
    Public Sub EntferneZahl(ByVal strErgebnis As String)
        Dim i As Integer
        Dim strVergleich As String
        With Form1
            If .LstZahlen.Items.Count = 1 Then    '-- nur noch ein Eintrag
                .CmdWuerfeln.Text = "&Neues Spiel"
                .LblInfo.Text = "Das Spiel ist beendet." & vbCrLf &
                    "Du hast  " & .LblPunkte.Text & " Punkte erzielt." & vbCrLf &
                    "Klicke auf >Neues Spiel<," & vbCrLf &
                    "wenn Du ein neues Spiel beginnen möchtest."
                Dim Tipp As New ToolTip
                Tipp.SetToolTip(.CmdWuerfeln,
                                "Klicken um ein neues Spiel zu beginnen")
            End If
            If strErgebnis = "" Then
                .LstZahlen.Items.RemoveAt(intRandom.Next(0,
                                       .LstZahlen.Items.Count - 1))
            Else
                For i = .LstZahlen.Items.Count - 1 To 0 Step -1
                    strVergleich = .LstZahlen.Items(i)  '-- zahl gefunden
                    If strVergleich = strErgebnis Then
                        .LstZahlen.Items.RemoveAt(i)
                        Exit For   '------->
                    End If
                Next
            End If
            '-- neue spielrunde vorbereiten
            For i = 0 To 19 : AlleZahlen(i).Text = "" : Next
            For i = .LstZahlen.Items.Count - 1 To 0 Step -1
                AlleZahlen(i).Text = .LstZahlen.Items(i)
            Next

            .GrpBerechnungen.Enabled = False
            .GrpRechenOperationen.Enabled = False
            .CmdWuerfeln.Enabled = True
            booGesperrt = True
            BonusZahlenBestimmen()
        End With
    End Sub
End Module
