PDA

View Full Version : [VB2008] Select case casuale e non ripetere sempre lo stesso case...


Pino67
16-01-2010, 12:39
Salve ora vi mostro cosa ho scritto...

Select Case Int(Rnd() * 7)
Case 0
Label1.Text = "Dove morì Napoleone?"
CheckBox1.Text = "Ajaccio"
CheckBox2.Text = "Sant'Elena"
CheckBox3.Text = "Parigi"
Case 1
Label1.Text = "Dove nacque Napoleone?"
CheckBox1.Text = "Lisbona"
CheckBox2.Text = "Ajaccio"
CheckBox3.Text = "Roma"
Case 2
Label1.Text = "Chi era il Mazzini della" & vbCrLf & """Giovine Italia""?"
CheckBox1.Text = "Mario"
CheckBox2.Text = "Antonio"
CheckBox3.Text = "Giuseppe"
Case 3
Label1.Text = "Dove si trova Reykjavík?"
CheckBox1.Text = "Islanda"
CheckBox2.Text = "Russia"
CheckBox3.Text = "Polonia"
Case 4
Label1.Text = "Quanto fà 4.671.171 : 12.659?"
CheckBox1.Text = "369"
CheckBox2.Text = "467"
CheckBox3.Text = "329"
Case 5
Label1.Text = "Quando iniziò la Rivoluzione Francese?"
CheckBox1.Text = "Nel 1755"
CheckBox2.Text = "Nel 1700"
CheckBox3.Text = "Nel 1789"
Case 6
Label1.Text = "Come si chiama l'attore," & vbCrLf & "che interpreta Scofield," & vbCrLf & "nel telefilm""Prison Break""?"
CheckBox1.Text = "Dominic Purcell"
CheckBox2.Text = "Robert Knepper"
CheckBox3.Text = "Wentworth Miller"

End Select

Quando il programma arriva a questa funzione,
ogni volta fa gli stessi casi nello stesso ordine...:(
Come posso fare in modo che li fà ogni volta diversi?
e come posso fare in modo che ogni volta, mi fà prima tutti i casi prima di ripeterli (ovviamente in ordine sparso)?
spero di essermi spiegato bene :)
grazie ancora in anticipo =):D

nuovoUtente86
16-01-2010, 12:57
effettui la chiamata a Randomize() prima di chiamare Rnd() ?
Personalmente però eviterei questa serie di switch-case costruendo degli oggetti Command e utilizzando una mappa di puntatori.

Pino67
16-01-2010, 13:14
:D Scusami io non sono molto esperto... potresti farmi una dimostrazione perfavore?

nuovoUtente86
16-01-2010, 13:24
Da quello che vedo dovrebbe trattarsi di un gioco a quiz, quindi quella di memorizzare i quesiti nel codice non è una buona idea ma sarebbe meglio utilizzare una sorgente dati esterna, come file di testo ad esempio.
Quindi una volta recuperata randomicamente la domanda, sarebbe opportuno costruirne un' oggetto (istanziando una classe Domanda) da passare alla grafica che ne può recuperare i valori attraverso i metodi accessori.

Pino67
16-01-2010, 14:22
senti scusa ma nel programma io che dovrei scrivere?

MarcoGG
16-01-2010, 19:36
Quando il programma arriva a questa funzione,
ogni volta fa gli stessi casi nello stesso ordine...:(
Come posso fare in modo che li fà ogni volta diversi?


Inizia con l'usare questa :

Private Function RandomizzaIntero(ByVal Min As Integer, ByVal Max As Integer) As Integer

Dim Generator As New System.Random(System.DateTime.Now.Millisecond)
Return Generator.Next(Min, Max + 1)

End Function

Nella tua Select Case la userai così :

Select Case RandomizzaIntero(0, 6)
...
...
End Select

;)

Pino67
16-01-2010, 21:30
Grazie mille sembra funzionare... pero qulche volta ripete le stesse 2 o 3 volte..

MarcoGG
17-01-2010, 09:29
Grazie mille sembra funzionare... pero qulche volta ripete le stesse 2 o 3 volte..

Dipende dal tempo intercorso tra 2 o più chiamate successive... E' normale che succeda questo. In ogni caso si può giocare con il Seed ed inoltre impedire 2 eventi uguali in successione... :

Private Function RandomizzaIntero(ByVal Min As Integer, ByVal Max As Integer, ByVal Seed As Integer) As Integer

Dim Generator As New System.Random(System.DateTime.Now.Millisecond * Seed)
Return Generator.Next(Min, Max + 1)

End Function

> Definisco 2 variabili esterne alla routine che genera i numeri casuali :
Private ultimoRnd As Integer = 0
Private S As Integer = 1

> La nuova routine :
Dim R As Integer = RandomizzaIntero(0, 6, S)
While R = ultimoRnd
If S >= Integer.MaxValue / 1000 Then
S = 1
Else
S += 1
End If
R = RandomizzaIntero(0, 6, S)
End While
ultimoRnd = R

Select Case R
Case 0
Label1.Text = "Dove morì Napoleone?"
CheckBox1.Text = "Ajaccio"
CheckBox2.Text = "Sant'Elena"
CheckBox3.Text = "Parigi"
Case 1
Label1.Text = "Dove nacque Napoleone?"
CheckBox1.Text = "Lisbona"
CheckBox2.Text = "Ajaccio"
CheckBox3.Text = "Roma"
Case 2
Label1.Text = "Chi era il Mazzini della" & vbCrLf & """Giovine Italia""?"
CheckBox1.Text = "Mario"
CheckBox2.Text = "Antonio"
CheckBox3.Text = "Giuseppe"
Case 3
Label1.Text = "Dove si trova Reykjavík?"
CheckBox1.Text = "Islanda"
CheckBox2.Text = "Russia"
CheckBox3.Text = "Polonia"
Case 4
Label1.Text = "Quanto fà 4.671.171 : 12.659?"
CheckBox1.Text = "369"
CheckBox2.Text = "467"
CheckBox3.Text = "329"
Case 5
Label1.Text = "Quando iniziò la Rivoluzione Francese?"
CheckBox1.Text = "Nel 1755"
CheckBox2.Text = "Nel 1700"
CheckBox3.Text = "Nel 1789"
Case 6
Label1.Text = "Come si chiama l'attore," & vbCrLf & "che interpreta Scofield," & vbCrLf & "nel telefilm""Prison Break""?"
CheckBox1.Text = "Dominic Purcell"
CheckBox2.Text = "Robert Knepper"
CheckBox3.Text = "Wentworth Miller"
End Select

Direi che adesso il comportamento assomiglia molto di più al "casuale" di quanto non fosse prima... ;)