Un gioco per misurare i riflessi

venerdì 18 maggio 2007 - 11.04

frabas Profilo | Newbie

Vorrei realizzare un gioco per misurare i riflessi:
in un form viene estratto un numero casuale che va a comporre una stringa di 10 cifre da 1 a 10. Il numero sostituisce a una delle 10 cifre, un carattere jolly "|" nella posizione corrispondente al suo valore: es. 0123|56789 se è estratto 4.
La frequenza con cui viene estratto il numero è determinata da un timer con un valore determinato nel codice.

L'utente dovrebbe, mediante la tastiera numerica, avere la rapidità di digitare la cifra corrispondente prima che scada il timer e venga estratto il numero successivo. Se riesce si incrementa il numero delle prove riuscite. Altrimenti si incrementa il numero delle prove fallite.

Primo problema: non riesco a fare eseguire contemporaneamente due eventi: l'evento timer e l'evento keypress.

Secondo problema: posto che si voglia fare eseguire la prova un certo numero di volte (ad es. 3) il contatore delle prove fallite si incrementa di 3 volte anzichè confrontare il numero casuale con il numero digitato volta per volta.

Potete aiutarmi?

Francesco


Il codice scritto finora:

Imports System.Windows.Forms
Public Class Form1

Inherits System.Windows.Forms.Form


Friend WithEvents btnStart As System.Windows.Forms.Button
Friend WithEvents Label1 As System.Windows.Forms.Label
Friend WithEvents Label2 As System.Windows.Forms.Label
Public Shared myTimer As New System.Windows.Forms.Timer

Dim NumCifra As Integer
Dim Numero As Integer
Dim ProveRiuscite As Integer
Dim ProveFallite As Integer
Friend WithEvents lblAccettaNumero As System.Windows.Forms.Label
Friend WithEvents Label3 As System.Windows.Forms.Label
Friend WithEvents Label4 As System.Windows.Forms.Label

Private Shared exitFlag As Boolean = False

#Region " Codice generato da Progettazione Windows Form "

Public Sub New()
MyBase.New()

'Chiamata richiesta da Progettazione Windows Form.
InitializeComponent()

'Aggiungere le eventuali istruzioni di inizializzazione dopo la chiamata a InitializeComponent()

End Sub

'Form esegue l'override del metodo Dispose per pulire l'elenco dei componenti.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Richiesto da Progettazione Windows Form
Private components As System.ComponentModel.IContainer

'NOTA: la procedura che segue è richiesta da Progettazione Windows Form.
'Può essere modificata in Progettazione Windows Form.
'Non modificarla nell'editor del codice.
Friend WithEvents lblCifre As System.Windows.Forms.Label
Friend WithEvents lblRandom As System.Windows.Forms.Label
Friend WithEvents lblProveRiuscite As System.Windows.Forms.Label
Friend WithEvents lblProveFallite As System.Windows.Forms.Label
Friend WithEvents Timer1 As System.Windows.Forms.Timer
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.components = New System.ComponentModel.Container
Me.lblCifre = New System.Windows.Forms.Label
Me.lblRandom = New System.Windows.Forms.Label
Me.lblProveRiuscite = New System.Windows.Forms.Label
Me.lblProveFallite = New System.Windows.Forms.Label
Me.Timer1 = New System.Windows.Forms.Timer(Me.components)
Me.btnStart = New System.Windows.Forms.Button
Me.Label1 = New System.Windows.Forms.Label
Me.Label2 = New System.Windows.Forms.Label
Me.lblAccettaNumero = New System.Windows.Forms.Label
Me.Label3 = New System.Windows.Forms.Label
Me.Label4 = New System.Windows.Forms.Label
Me.SuspendLayout()
'
'lblCifre
'
Me.lblCifre.BackColor = System.Drawing.SystemColors.ControlLightLight
Me.lblCifre.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.lblCifre.Location = New System.Drawing.Point(12, 112)
Me.lblCifre.Name = "lblCifre"
Me.lblCifre.Size = New System.Drawing.Size(136, 24)
Me.lblCifre.TabIndex = 0
'
'lblRandom
'
Me.lblRandom.BackColor = System.Drawing.SystemColors.ControlLightLight
Me.lblRandom.Font = New System.Drawing.Font("Microsoft Sans Serif", 12.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.lblRandom.Location = New System.Drawing.Point(14, 60)
Me.lblRandom.Name = "lblRandom"
Me.lblRandom.Size = New System.Drawing.Size(95, 24)
Me.lblRandom.TabIndex = 1
'
'lblProveRiuscite
'
Me.lblProveRiuscite.BackColor = System.Drawing.SystemColors.ControlLightLight
Me.lblProveRiuscite.ForeColor = System.Drawing.SystemColors.GradientActiveCaption
Me.lblProveRiuscite.Location = New System.Drawing.Point(375, 45)
Me.lblProveRiuscite.Name = "lblProveRiuscite"
Me.lblProveRiuscite.Size = New System.Drawing.Size(88, 24)
Me.lblProveRiuscite.TabIndex = 12
'
'lblProveFallite
'
Me.lblProveFallite.BackColor = System.Drawing.SystemColors.ControlLightLight
Me.lblProveFallite.Location = New System.Drawing.Point(375, 100)
Me.lblProveFallite.Name = "lblProveFallite"
Me.lblProveFallite.Size = New System.Drawing.Size(96, 24)
Me.lblProveFallite.TabIndex = 13
'
'Timer1
'
Me.Timer1.Enabled = True
Me.Timer1.Interval = 3000
'
'btnStart
'
Me.btnStart.Location = New System.Drawing.Point(225, 26)
Me.btnStart.Name = "btnStart"
Me.btnStart.Size = New System.Drawing.Size(75, 23)
Me.btnStart.TabIndex = 16
Me.btnStart.Text = "Start"
Me.btnStart.UseVisualStyleBackColor = True
'
'Label1
'
Me.Label1.AutoSize = True
Me.Label1.Location = New System.Drawing.Point(375, 85)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(62, 13)
Me.Label1.TabIndex = 17
Me.Label1.Text = "Prove fallite"
'
'Label2
'
Me.Label2.AutoSize = True
Me.Label2.Location = New System.Drawing.Point(378, 29)
Me.Label2.Name = "Label2"
Me.Label2.Size = New System.Drawing.Size(71, 13)
Me.Label2.TabIndex = 18
Me.Label2.Text = "Prove riuscite"
'
'lblAccettaNumero
'
Me.lblAccettaNumero.AutoSize = True
Me.lblAccettaNumero.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.lblAccettaNumero.Location = New System.Drawing.Point(256, 112)
Me.lblAccettaNumero.Name = "lblAccettaNumero"
Me.lblAccettaNumero.Size = New System.Drawing.Size(17, 17)
Me.lblAccettaNumero.TabIndex = 19
Me.lblAccettaNumero.Text = "0"
'
'Label3
'
Me.Label3.AutoSize = True
Me.Label3.Location = New System.Drawing.Point(225, 83)
Me.Label3.Name = "Label3"
Me.Label3.Size = New System.Drawing.Size(84, 13)
Me.Label3.TabIndex = 20
Me.Label3.Text = "Accetta Numero"
'
'Label4
'
Me.Label4.AutoSize = True
Me.Label4.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.Label4.ForeColor = System.Drawing.Color.Red
Me.Label4.Location = New System.Drawing.Point(14, 36)
Me.Label4.Name = "Label4"
Me.Label4.Size = New System.Drawing.Size(95, 13)
Me.Label4.TabIndex = 21
Me.Label4.Text = "NumeroCasuale"
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(502, 292)
Me.Controls.Add(Me.Label4)
Me.Controls.Add(Me.Label3)
Me.Controls.Add(Me.lblAccettaNumero)
Me.Controls.Add(Me.Label2)
Me.Controls.Add(Me.Label1)
Me.Controls.Add(Me.btnStart)
Me.Controls.Add(Me.lblProveFallite)
Me.Controls.Add(Me.lblProveRiuscite)
Me.Controls.Add(Me.lblRandom)
Me.Controls.Add(Me.lblCifre)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
Me.PerformLayout()

End Sub

#End Region

Protected Overridable Sub TimerOnTick(ByVal obj As Object, ByVal ea As EventArgs) _
Handles Timer1.Tick
OnResize(EventArgs.Empty)
Timer1.Interval = 3000
Dim Prova As Integer
Dim NumCifra As Integer
Dim Numero As Integer


'Cifra è un nuovo oggetto della classe Random
Dim Cifra As Random = New Random

For Prova = 1 To 3
'NumCifra è la variabile alla quale viene assegnato il numero estratto casualmente
NumCifra = Cifra.Next(1, 10)

' la variabile viene visualizzata nella label
lblRandom.Text = NumCifra

' viene costruita la stringa con il carattere random
lblCifre.Text = Mid("0123456789", 1, NumCifra) & "|" & Mid("0123456789", NumCifra + 2, 10)

'viene effettuato il confronto tra la variabile casuale e il valore cliccato, o inserito
'tramite clic sui pulsanti numerici
'NumCifra è il numero casuale
'Numero dovrebbe essere quello inserio dall'utente

Numero = lblAccettaNumero.Text


If Numero = NumCifra Then
ProveRiuscite += 1
lblProveRiuscite.Text = ProveRiuscite
Else : ProveFallite += 1
lblProveFallite.Text = ProveFallite
End If

Next Prova
End Sub 'TimerOnTick


Private Sub Gianni_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles MyBase.KeyPress
lblAccettaNumero.Text = e.KeyChar
End Sub


End Class


1024x742 24Kb



dedalo.nel.labirinto Profilo | Newbie

ciao

>Primo problema: non riesco a fare eseguire contemporaneamente
>due eventi: l'evento timer e l'evento keypress.

non penso che il problema sia questo.
il timer genera l'evento tick da solo ad intervalli regolari quello che tu fai è dirgli cosa deve accadere ogni volta.

l'evento keypress così come lo hai scritto tu non viene sollevato.

>Private Sub Gianni_KeyPress(ByVal sender As System.Object, ByVal
>e As System.Windows.Forms.KeyPressEventArgs) _
> Handles MyBase.KeyPress
> lblAccettaNumero.Text = e.KeyChar
> End Sub

potresti inserire una textbox per l'input dell'utente e gestire il suo evento keypress per controllare i valori digitati


>Secondo problema: posto che si voglia fare eseguire la prova
>un certo numero di volte (ad es. 3) il contatore delle prove
>fallite si incrementa di 3 volte anzichè confrontare il numero
>casuale con il numero digitato volta per volta.

per prima cosa nel codice per l'incremento del punteggio in realtà non stai gestendo la possibilità di diversi tentativi
prima di valorizzare l'esito come positivo o negativo.

in realtà stai dicendo al programma di generare un numero casuale per tre volte (il ciclo for), di confrontarne il valore con un altro numero e incrementare la variabile proveriuscite se il numero coincide, provefallite se non coincide, e questo ogni tre secondi.



cmq non penso che inserire tutto il codice nell'evento tick del timer sia la soluzione migliore.
secondo me qui dovresti gestire principalmente la generazione dei numeri random e occuparti del controllo dei valori
nel momento in cui vengono inseriti.


metto in allegato un esempio di come potrebbe essere gestito il gioco, magari può esserti d'aiuto


frabas Profilo | Newbie

Ti ringrazio di cuore! Era parecchio tempo che ci rimuginavo sopra senza riuscirci.
Non mi resta che migliorarlo graficamente!

Ciao

Francesco


>ciao
>
>>Primo problema: non riesco a fare eseguire contemporaneamente
>>due eventi: l'evento timer e l'evento keypress.
>
>non penso che il problema sia questo.
>il timer genera l'evento tick da solo ad intervalli regolari
>quello che tu fai è dirgli cosa deve accadere ogni volta.
>
>l'evento keypress così come lo hai scritto tu non viene sollevato.
>
>>Private Sub Gianni_KeyPress(ByVal sender As System.Object, ByVal
>>e As System.Windows.Forms.KeyPressEventArgs) _
>> Handles MyBase.KeyPress
>> lblAccettaNumero.Text = e.KeyChar
>> End Sub
>
>potresti inserire una textbox per l'input dell'utente e gestire
>il suo evento keypress per controllare i valori digitati
>
>
>>Secondo problema: posto che si voglia fare eseguire la prova
>>un certo numero di volte (ad es. 3) il contatore delle prove
>>fallite si incrementa di 3 volte anzichè confrontare il numero
>>casuale con il numero digitato volta per volta.
>
>per prima cosa nel codice per l'incremento del punteggio in realtà
>non stai gestendo la possibilità di diversi tentativi
>prima di valorizzare l'esito come positivo o negativo.
>
>in realtà stai dicendo al programma di generare un numero casuale
>per tre volte (il ciclo for), di confrontarne il valore con un
>altro numero e incrementare la variabile proveriuscite se il
>numero coincide, provefallite se non coincide, e questo ogni
>tre secondi.
>
>
>
>cmq non penso che inserire tutto il codice nell'evento tick del
>timer sia la soluzione migliore.
>secondo me qui dovresti gestire principalmente la generazione
>dei numeri random e occuparti del controllo dei valori
>nel momento in cui vengono inseriti.
>
>
>metto in allegato un esempio di come potrebbe essere gestito
>il gioco, magari può esserti d'aiuto
>
>
>

dedalo.nel.labirinto Profilo | Newbie


di nulla, è un piacere
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5