Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    come fare un gioco del tipo "chi clicca per primo" con vb 2010

    ciao a tutti, sto cercando di fare un gioco con vb dove chi clicca per primo, dopo il segnale (un picture box che diventa verde, dopo un numero random di tempo trascorso), vince.
    codice:
    Public Class Form1
        Dim a As Integer
        Dim b As Integer = 0
        Dim p1 As Boolean = False
        Dim p2 As Boolean = False
        Dim v As Boolean = False
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim a1 As New System.Random
            a = a1.Next(3, 9)
            Timer1.Start()
    
        End Sub
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            b += 1
            If b = a Then
                PictureBox3.BackColor = Color.LawnGreen
                v = True
            End If
        End Sub
    
        Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
            'payer 1
            If e.KeyCode = Keys.Left Then
                'se è partito 
                If v = True Then
                    'se è attivato l'altro 
                    If p1 = True Then
                        ' se non è attivato l'altro
                    ElseIf p1 = False Then
                        p2 = True
                        PictureBox1.BackColor = Color.LawnGreen
                    End If
                    'se non è partito 
                ElseIf v = False Then
                    Timer1.Stop()
                    PictureBox3.BackColor = Color.Silver
                    Label1.Text = "FALSA PARTENZA"
                    a = 0
                    b = 0
                End If
    
                'player 2
            ElseIf e.KeyCode = Keys.Right Then
                'se è partito
                If v = True Then
                    'se l'altro è attivato
                    If p2 = True Then
                        'se non è attivato l'altro
                    ElseIf p2 = False Then
                        p1 = True
                        PictureBox2.BackColor = Color.LawnGreen
                    End If
                    'se non è partito
                ElseIf v = False Then
                    Timer1.Stop()
                    PictureBox3.BackColor = Color.Silver
                    Label1.Text = "FALSA PARTENZA"
                    a = 0
                    b = 0
                End If
            End If
        End Sub
    End Class
    questo è il programma, funziona fino a far diventare verde il picturebox3 , dopo, indipendentemente da che pulsante viene premuto e quando, non succede più niente. non vorrei aver sbagliato a scrivere questa parte:
    codice:
    Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
            If e.KeyCode = Keys.Left Then
            'comandi 
            end if
    comunque so quasi per certo che l'errore sta qua:

    codice:
    Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
            'payer 1
            If e.KeyCode = Keys.Left Then
                'se è partito 
                If v = True Then
                    'se è attivato l'altro 
                    If p1 = True Then
                        ' se non è attivato l'altro
                    ElseIf p1 = False Then
                        p2 = True
                        PictureBox1.BackColor = Color.LawnGreen
                    End If
                    'se non è partito 
                ElseIf v = False Then
                    Timer1.Stop()
                    PictureBox3.BackColor = Color.Silver
                    Label1.Text = "FALSA PARTENZA"
                    a = 0
                    b = 0
                End If
    
                'player 2
            ElseIf e.KeyCode = Keys.Right Then
                'se è partito
                If v = True Then
                    'se l'altro è attivato
                    If p2 = True Then
                        'se non è attivato l'altro
                    ElseIf p2 = False Then
                        p1 = True
                        PictureBox2.BackColor = Color.LawnGreen
                    End If
                    'se non è partito
                ElseIf v = False Then
                    Timer1.Stop()
                    PictureBox3.BackColor = Color.Silver
                    Label1.Text = "FALSA PARTENZA"
                    a = 0
                    b = 0
                End If
            End If
        End Sub
    consigli ?
    più di così non so che dire
    Sellione98

  2. #2
    Scusa la domanda, ma la proprietà "KeyPreview" del Form è settata su "True"?

  3. #3
    no, non lo era... ora l'ho messa su true, ma non cambia niente :\
    e comunque non è la prima volta che uso questo comando, ma ha sempre funzionato senza che modificassi niente...
    Sellione98

  4. #4
    Allora fai due cose

    1) Prima che la PictureBox cambi colore assicurati che il Form sia attivo.

    codice:
        
           If b = a Then
                Me.Activate  'attiva il form **********
                PictureBox3.BackColor = Color.LawnGreen
                v = True
            End If
    2) Metti una marea di Debug.Print nella Sub Key_Down per vedere se il codice viene letto (ovviamente lanci in modalità Debug)

    codice:
     Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
    
            Debug.Print("KeyCode: " & e.KeyCode.ToString)
    
            'payer 1
            If e.KeyCode = Keys.Left Then
                'se è partito 
    
                Debug.Print("v è " & v.ToString)
    
                If v = True Then
                    'se è attivato l'altro 
                    If p1 = True Then
                        ' se non è attivato l'altro
                    ElseIf p1 = False Then
                        p2 = True
                        PictureBox1.BackColor = Color.LawnGreen
                    End If
                    'se non è partito 
                ElseIf v = False Then
                    Timer1.Stop()
                    PictureBox3.BackColor = Color.Silver
                    Label1.Text = "FALSA PARTENZA"
                    a = 0
                    b = 0
                End If
    
                'player 2
            ElseIf e.KeyCode = Keys.Right Then
    
                Debug.Print("Sono in player 2... v è: " & v.ToString)
    
                'se è partito
                If v = True Then
                    'se l'altro è attivato
                    If p2 = True Then
                        'se non è attivato l'altro
                    ElseIf p2 = False Then
                        p1 = True
                        PictureBox2.BackColor = Color.LawnGreen
                    End If
                    'se non è partito
                ElseIf v = False Then
                    Timer1.Stop()
                    PictureBox3.BackColor = Color.Silver
                    Label1.Text = "FALSA PARTENZA"
                    a = 0
                    b = 0
                End If
            End If
        End Sub

  5. #5
    niente .-. ... non so proprio quale possa essere l'errore
    Sellione98

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    E' il button che interferisce con la gestione dei tasti ... aggiungi questo

    codice:
    Private Sub Button1_PreviewKeyDown(sender As Object, e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles Button1.PreviewKeyDown
        e.IsInputKey = True
    End Sub
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Originariamente inviato da Sellione98
    niente .-. ... non so proprio quale possa essere l'errore
    Si, ma non hai precisato se tramite i Debug.Print hai verificato se il codice della Form_KeyDown viene letto o no.

    Oregon, ma se la proprietà KeyPreview del Form è su True... il codice della Sub Form non dovrebbe essere letto prima di qualsiasi altro?

    .

  8. #8
    Utente di HTML.it L'avatar di Vinsent
    Registrato dal
    May 2011
    Messaggi
    314
    Credo che il problema derivi dal fatto che la Form non registra l' evento keydown....spero di non dire una fesseria...ma ho inserito un 'console.writeline', come ha suggerito eziogsv, nella sub dell' evento in questione e con i quattro tasti "freccia" non scrive niente nell' output, il perchè non lo so.
    Si potrebbe sostituire la sub "keydown" con questa funzione:
    codice:
        Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean
            '37 = left
            '39 = right
    
            If keyData = 37 Then
                Console.WriteLine("hai premuto il tasto: " & keyData.ToString)
            End If
    
            If keyData = 39 Then
                Console.WriteLine("hai premuto il tasto: " & keyData.ToString)
            End If
    
            Return MyBase.ProcessCmdKey(msg, keyData)
        End Function
    che io di solito uso in controlli personalizzati per evitare l' inserimento di caratteri o funzioni come "ctrl+C", ecc. impostando 'msg = Nothing'. Però mettendo più controlli, ad esempio due button, e premendo le frecce il focus sui controlli si sposta ugualmente.
    Quindi, o cambi i tasti nella tua sub o usi la funzione sopra con degli accorgimenti per evitare che dei controlli prendano il focus e possano causare inconvenienti.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.