Option Explicit
Class clsAmbo
Private aAmbi
Private IdEstrazione
Private IdRuota
Sub GeneraAmbi(idEstr,Ruota)
IdEstrazione = idEstr
IdRuota = Ruota
ReDim aN(0)
Call GetArrayNumeriRuota(IdEstrazione,IdRuota,aN)
'Call OrdinaMatrice ( aN ,1)
If aN(1) > 0 Then
aAmbi = SviluppoIntegrale(aN,2)
Else
ReDim aAmbi(0)
End If
End Sub
Function GetQuantitaAmbi
GetQuantitaAmbi = UBound(aAmbi)
End Function
Function GetAmbo(idAmbo)
ReDim aN(2)
aN(1) = aAmbi(idAmbo,1)
aN(2) = aAmbi(idAmbo,2)
GetAmbo = aN
End Function
Function GetRuota
GetRuota = IdRuota
End Function
End Class
Class clsQuartinaAmboTrasposto
Private aNum(4)
Public Ruota1
Public Ruota2
Public IdEstrazione
Sub SetNumeri(aNumAmboR1,aNumAmboR2)
Dim k
For k = 1 To 4
If k <= 2 Then
aNum(k) = aNumAmboR1(k)
Else
aNum(k) = aNumAmboR2(k - 2)
End If
Next
End Sub
Function GetNumeri()
ReDim aNumTmp(UBound(aNum))
Dim k
For k = 0 To UBound(aNum)
aNumTmp(k) = aNum(k)
Next
GetNumeri = aNumTmp
End Function
Function GetRuote()
ReDim aRuote(2)
aRuote(1) = Ruota1
aRuote(2) = Ruota2
GetRuote = aRuote
End Function
Function IsSommaPari()
If pari(aNum(1) + aNum(2)) Then
If pari(aNum(3) + aNum(4)) Then
IsSommaPari = True
End If
End If
End Function
Function QuantitaNumeriDiversi
Dim aTmp
Dim k,t
aTmp = aNum
t = 0
Call EliminaRipetuti(aTmp)
For k = 1 To UBound(aTmp)
If aTmp(k) <> 0 Then
t = t + 1
End If
Next
QuantitaNumeriDiversi = t
End Function
End Class
Sub Main
Dim idEstr,Ruota
Dim Inizio,Fine
Dim r,rr,i,ii,k
Dim aNumAmbo,aNumAmboT
Dim nDiff,nSomma
ReDim acAmbiRuota(11)
Dim nCasi
Dim bQualsiasiDisp
Dim nCasiParz
Dim bEseguiGiocate
Dim bEseguiStatistica
Dim CollCasiRilevati
Dim clsQuartina
Dim n1,n2
Dim clsDisegno , collFigure
Inizio = EstrazioneIni
Fine = EstrazioneFin
bQualsiasiDisp = False
bEseguiGiocate = True
bEseguiStatistica = True
nCasi = 0
' If MsgBox("Considerare gli ambi trasposti a prescindere dalla disposizione fisica dei numeri usciti ?",vbQuestion + vbYesNo) = vbYes Then
' bQualsiasiDisp = True
' End If
For idEstr = Inizio To Fine
i = 0
nCasiParz = 0
' prima genero per ogni ruota tutti gli ambi costituiti dai nuemeri estratti
For r = 1 To 12
If r <> 11 Then
i = i + 1
Set acAmbiRuota(i) = New clsAmbo
Call acAmbiRuota(i).GeneraAmbi(idEstr,r)
End If
Next
' poi ricerco gli ambi trasposti tra 2 ruote
Set CollCasiRilevati = GetNewCollection
For r = 1 To 10
For rr = r + 1 To 11
Call Messaggio("Estrazione : " & idEstr & " confronto ruote : " & SiglaRuota(acAmbiRuota(r).GetRuota) & " --> " & SiglaRuota(acAmbiRuota(rr).GetRuota))
For i = 1 To acAmbiRuota(r).GetQuantitaAmbi
aNumAmbo = acAmbiRuota(r).Getambo(i)
For ii = 1 To acAmbiRuota(rr).GetQuantitaAmbi
aNumAmboT = acAmbiRuota(rr).Getambo(ii)
If IsAmboTrasposto(aNumAmbo,aNumAmboT,bQualsiasiDisp) Then
Set clsQuartina = New clsQuartinaAmboTrasposto
clsQuartina.Ruota1 = acAmbiRuota(r).GetRuota
clsQuartina.Ruota2 = acAmbiRuota(rr).GetRuota
clsQuartina.IdEstrazione = idEstr
Call clsQuartina.SetNumeri(aNumAmbo,aNumAmboT)
CollCasiRilevati.add clsQuartina
If CollCasiRilevati.Count > 1 Then Exit For
End If
Next
Next
If CollCasiRilevati.Count > 1 Then Exit For
Next
If CollCasiRilevati.Count > 1 Then Exit For
Next
If CollCasiRilevati.Count = 1 Then
Set clsQuartina = CollCasiRilevati(1)
If clsQuartina.IsSommaPari Then
If clsQuartina.QuantitaNumeriDiversi = 4 Then
Dim aNumQ
ReDim aNumC(6)
ReDim aNumQ(0)
aNumQ = clsQuartina.GetNumeri
Call GetAmboDaGiocare(aNumQ,n1,n2)
If n1 > 0 And n2 > 0 Then
aNumC(1) = aNumQ(1)
aNumC(2) = aNumQ(2)
aNumC(3) = aNumQ(3)
aNumC(4) = aNumQ(4)
aNumC(5) = n1
aNumC(6) = n2
Call Scrivi("Estrazione " & GetInfoEstrazione(idEstr))
Call Scrivi("Ruote " & SiglaRuota(clsQuartina.Ruota1) & " - " & SiglaRuota(clsQuartina.Ruota2))
Call Scrivi(StringaNumeri(clsQuartina.GetNumeri))
' eventualmente per far apparire anche la figura ottenuta con i numeri in gioco
' levare i commenti lle linee successive
'Set clsDisegno = GetNewDisegnoCiclometrico
'For k = 1 To 6
' clsDisegno.AddNumero(aNumC (k))
'Next
'clsDisegno.ColoreBordo = vbCyan
'Set collFigure = GetNewCollection
'collFigure.add clsDisegno
'Call DisegnaCerchioCiclometrico(aNumQ,True,,,collFigure )
' disegna i 4 numeri dell'ambo trasposto nel cerchio e mostra le distanze
Call DisegnaCerchioCiclometrico(aNumQ,True )
' disegna il cerchio con la figura ottenuta considerando anche i numeri in gioco
'Call DisegnaCerchioCiclometrico(aNumC )
ReDim aNum(2)
aNum(1) = n1
aNum(2) = n2
ReDim aRuote(3)
aRuote(1) = clsQuartina.ruota1
aRuote(2) = clsQuartina.ruota2
aRuote(3) = TU_
ReDim aPoste(2)
aPoste(2) = 1
nCasi = nCasi + 1
nCasiParz = nCasiParz + 1
'Call Scrivi(String(50,"=") & " Caso " & FormatSpace(nCasi,5,True))
'Call Scrivi("Estrazione : " & GetInfoEstrazione(idEstr))
'Call Scrivi("Condizione : " & SiglaRuota(aRuote(1)) & " " & StringaNumeri(aNumAmbo) & " - " & SiglaRuota(aRuote(2)) & " " & StringaNumeri(aNumAmboT))
Call ImpostaGiocata(nCasi,aNum,aRuote,aPoste,13,2)
Call Gioca(idEstr)
End If
End If
End If
End If
'If nCasiParz > 0 And bEseguiGiocate Then
' Call Gioca(idEstr)
'End If
Call AvanzamentoElab(Inizio,Fine,idEstr)
If ScriptInterrotto Then Exit For
Next
Call ScriviResoconto
End Sub
Function IsAmboTrasposto(aNumAmbo,aNumAmboT,bQualsiasiDisp)
Dim b
b = False
If aNumAmboT(1) > 0 And aNumAmboT(2) > 0 Then
If aNumAmboT(1) = Trasposizione(aNumAmbo(1),aNumAmbo(2)) Then
If aNumAmboT(2) = Trasposizione(aNumAmbo(2),aNumAmbo(1)) Then
b = True
End If
ElseIf aNumAmboT(1) = Trasposizione(aNumAmbo(2),aNumAmbo(1)) Then
If bQualsiasiDisp Then
If aNumAmboT(2) = Trasposizione(aNumAmbo(1),aNumAmbo(2)) Then
b = True
End If
End If
End If
End If
IsAmboTrasposto = b
End Function
Function GetAmboDaGiocare(aNumQ,n1,n2)
Dim d
ReDim aQDist(45)
Dim k
n1 = 0
n2 = 0
Call OrdinaMatrice(aNumQ,1)
d = Distanza(aNumQ(1),aNumQ(2))
aQDist(d) = aQDist(d) + 1
d = Distanza(aNumQ(2),aNumQ(3))
aQDist(d) = aQDist(d) + 1
d = Distanza(aNumQ(3),aNumQ(4))
aQDist(d) = aQDist(d) + 1
d = Distanza(aNumQ(4),aNumQ(1))
aQDist(d) = aQDist(d) + 1
For k = 1 To 45
If aQDist(k) = 1 Then
If n1 = 0 Then
n1 = k / 2
Else
n2 = k / 2
End If
End If
Next
End Function