Italian Numeri diversi

Antonio67

Member
Ciao a tutti sto creando un app dove cui ci sono delle label che in ognuna di esse sortisce a caso un numero da 1 a 90. Tutto funziona come voglio, unico problema e che spesso due label sortisce lo stesso numero. Come dire a b4a che se la label2b e uguale alla label1 la label2 deve eseguire un altro numero? Grazie
 

sirjo66

Well-Known Member
Licensed User
Longtime User
E' un banalissimo problema di ciclo.
1) inizi il ciclo, ed estrai un numero a caso
2) fai un altro ciclo cercando questo numero nelle label già estratte
3) se lo stesso numero viene trovato, salti al punto (1), altrimenti esci dal ciclo

praticamente due cicli annidati

Sergio
 

Antonio67

Member
Ciao sirjo grazie per l'intervento. Se potresti farmi un piccolissimo esempio te ne sarei grato. Io al massimo posso tradurre in : if label2.text=label1.text then label2.text= random
 

LucaMs

Expert
Licensed User
Longtime User
Di solito si usa un metodo diverso.

Si prepara un array (o un List o altro):

Dim Numeri(90) As Int ' da 0 a 89 - stiamo giocando al Lotto, vero?
For n = 0 to 89
Numeri(n) = n + 1
Next
Dim NumeriDisponibili As Int = 90

Dim x As Int
x = Rnd(0, NumeriDisponibili)
lblNumero(0).Text = Numeri(x)

' si scambia l'ultimo numero in fondo all'array con quello "estratto"
Dim Buffer As Int = Numeri(NumeriDisponibili)
Numeri(NumeriDisponibili) = Numeri(x)
Numeri(x) = Buffer

' e si diminuisce il numero di numeri disponibili!
NumeriDisponibili = NumeriDisponibili - 1

' così al successivo:
x = Rnd(0, NumeriDisponibili)
l'ultimo numero non potrà uscire di nuovo ed è quello già uscito.

B4X:
' Inizializzazione
Dim Numeri(90) As Int
For n = 0 to 89
    Numeri(n) = n + 1
Next
Dim NumeriDisponibili As Int

' Estrazione
NumeriDisponibili = 90
For E = 0 to 4
    Dim x As Int
    x = Rnd(0, NumeriDisponibili)
    lblNumero(E).Text = Numeri(x)

    ' si scambia l'ultimo numero in fondo all'array con quello "estratto"
    Dim Buffer As Int = Numeri(NumeriDisponibili)
    Numeri(NumeriDisponibili) = Numeri(x)
    Numeri(x) = Buffer

    ' e si diminuisce il numero di numeri disponibili!
    NumeriDisponibili = NumeriDisponibili - 1
Next

Nota che l'ho scritto qui, al volo, quindi magari c'è qualche bug dovuto alla solita faccenda della base 0 degli array o altro


P.S. Se fai cinquina, ricordati di me
 
Last edited:

Antonio67

Member
Sicuramente .Provero quanto hai scritto anche se il mio scopo e quello di creare app con codici quanto piu corti possibili. Con if then era l'ideale, comunque......ci provo. Grazie
 

LucaMs

Expert
Licensed User
Longtime User
Poco codice non sempre è un bene, sia perché scrivere qualche riga in più non occupa tanta memoria, sia perché il programma diventa più comprensibile e gestibile.
Comunque, non l'ho scritto ma il codice dopo il commento "Estrazione" andrebbe in una routine separata (e non dovrebbe caricare le label ma restituire i 5 numeri estratti).

Già che ci sono... ho detto Lotto ma magari si parlava di Superenalotto. Beh, a parte l'enorme possibilità di azzeccare il 6 (circa una su 624 milioni!) siamo in Italia, quindi è mooolto più alta la probabilità che gli organizzatori del gioco inseriscano, "al poteriore di Anzio" , la loro bella schedina vincente, quindi meglio la cinquina al Lotto
 

Antonio67

Member
Ciao, per codice corto intendevo più che altro come metodo facilmente da ricordare, ecco per esempio prima di provare il tuo stò provando facendo semplicemente cosi:
Sub diverso
dim gira as int
gira=Rnd(1,91)
If L1.text=L2.Text Then
L2.Text=gira
End If
If L1.Text=L3.Text Then
L3.Text=gira
End If
If L1.text=L4.Text Then
L4.Text=gira
End If
If L1.text=L5.Text Then
L5.Text=gira
End If
(Devo continuare per le altre label) se funzionasse sarebbe comodo,pratico, e facile da ricordare
considerando che stò agli albori di b4a, il tuo codice anche se corretto per me sembra una formula di Einstein mi piacerebbe avere le stesse tue conoscenze ma credo che sia un pò presto.
 

LucaMs

Expert
Licensed User
Longtime User
Guarda che il codice che dovresti usare (quello che ho scritto, intendo) è solo quello nella "finestrella" Code, eh (la parte precedente è la spiegazione), quindi solo questo:
B4X:
' Inizializzazione
Dim Numeri(90) As Int  '<---  nella Globals
For n = 0 to 89       ' <---  nella Activity_Create
    Numeri(n) = n + 1
Next
Dim NumeriDisponibili As Int

' Estrazione               ' <--- in una sub routine
NumeriDisponibili = 90
For E = 0 to 4
    Dim x As Int
    x = Rnd(0, NumeriDisponibili)
    lblNumero(E).Text = Numeri(x)

    ' si scambia l'ultimo numero in fondo all'array con quello "estratto"
    Dim Buffer As Int = Numeri(NumeriDisponibili)
    Numeri(NumeriDisponibili) = Numeri(x)
    Numeri(x) = Buffer

    ' e si diminuisce il numero di numeri disponibili!
    NumeriDisponibili = NumeriDisponibili - 1
Next
 

Antonio67

Member
Si questo lo avevo capito. Poi la sub del codice va in ogni button? cioè button2 per ambo,button3 per terno ecc..
 

LucaMs

Expert
Licensed User
Longtime User
Si questo lo avevo capito. Poi la sub del codice va in ogni button? cioè button2 per ambo,button3 per terno ecc..
Beh, non so esattamente come e cosa debba fare l'app. Se deve estrarre a caso da 1 a 5 numeri (o 6, superenalotto ), direi che ti basterebbe un button (btnEstrai), una edittext (etQta) per chiedere all'utente quanti numeri estrarre e:

B4X:
' Inizializzazione
Dim Numeri(90) As Int  '<---  nella Globals
For n = 0 to 89       ' <---  nella Activity_Create
    Numeri(n) = n + 1
Next
Dim NumeriDisponibili As Int



Sub btnEstrai_Click
    ' qui serve un controllo sul contenuto di etQta.Text; meglio ancora metterlo nella routine Change della etQta
    Dim Qta As Int = etQta.Text
    Estrazione(Qta)
End Sub


Sub Estrazione(Qta As Int)
' vuota le label
For i = 0 to 4
    lblNumero(i).Text = ""
Next

NumeriDisponibili = 90
For E = 0 to Qta - 1
    Dim x As Int
    x = Rnd(0, NumeriDisponibili)
    lblNumero(E).Text = Numeri(x)

    ' si scambia l'ultimo numero in fondo all'array con quello "estratto"
    Dim Buffer As Int = Numeri(NumeriDisponibili)
    Numeri(NumeriDisponibili) = Numeri(x)
    Numeri(x) = Buffer

    ' e si diminuisce il numero di numeri disponibili!
    NumeriDisponibili = NumeriDisponibili - 1
Next
End Sub
 

Antonio67

Member
Buongiorno luca, se ho ben capito il codice andrebbe bene se avrei 1 button e una edittext. Ma la mia e diversa. Se vuoi ti invio direttamente l'apk dell app e la provi( dimmi come). E il codice.
 

LucaMs

Expert
Licensed User
Longtime User
Buongiorno luca, se ho ben capito il codice andrebbe bene se avrei 1 button e una edittext. Ma la mia e diversa. Se vuoi ti invio direttamente l'apk dell app e la provi( dimmi come). E il codice.
Se vuoi inviarmi il progetto in modo che io faccia qualche modifica, usa il menu File - Export As Zip e inviami il file zippato all'indirizzo di posta che vedi qui sotto
Considera però che ho poco tempo: a costo di legarmi qui, da oggi VOGLIO finalmente impegnarmi sulla mia app... prima o poi ne pubblicherò una, maremma sbigottita

[Nota che il tuo post è arrivato soltanto adesso, alle 16, anche se lo hai scritto alle 10:34; probabilmente perché non sei un utente... "licenziato"]
 

Antonio67

Member
Ciao Luca ho ripreso a provare l'app. Ho visto il tuo codice sicuramente funzionante magari con qualche modifica,ma lo vedo ancora troppo lungo e complicato(per me) per un'azione semplice. In visual basic per certi casi ce il ciclo do while che in pratica mi dovrebbe dire : se la label3.text=label2.text allora continua a girare.Ma non mi ricordo come fare. Ho provato con 'Do while if then timer.enabled=false and label3.text=label2 then loop. B4a mi ha fatto una pernacchia . Heeeelp
 

sirjo66

Well-Known Member
Licensed User
Longtime User
innazitutto non ho capito in totale quanti numeri devi estrarre (mi sembra di capire che sono solo 2) e poi se non mostri almeno un po' di codice (quello che hai provato a scrivere, anche se con le pernacchie), non ti possiamo essere utili
 

Antonio67

Member
Ciao. Ci sono 6 abel dove in ognuna di esse sortisce a caso un numero da 1 a 90 e 5 button dove ognuno di essi da una combinazione. Button1 fa sortire numeri a 2 label , button2 a tre label, e cosi via. Appena posso invio il codice
 

sirjo66

Well-Known Member
Licensed User
Longtime User
non vedo grossi problemi a realizzare il codice che chiedi, probabilmente il tuo livello di conoscenze in informatica non è sufficiente
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…