• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

C0PILHA

[Resolvido] Pessoal? VB é de Lua?

17 mensagens neste tópico

  Rsss

  Digo isso, pois no projecto que estou a fazer; no mesmo código, mesmo programa, tudo igualzinho, de vez em quando dá um erro de não aparecer a imagem de fundo de uma picture box e um timer faz suas funções só pela metade, e ora funciona tudo normal, conforme eu escrevi no código que éra para acontecer.  :wallbash: /  :eek:

 

  Já passaram por algo parecido, parceiros?

  Será que existe a possibilidade de um Timer não realizar seu trabalho por completo?

  Quanto tempo demora para uma picturebox mudar sua propriedade de Visible = true para visible = false????

  Será que o VB pode se "embaralhar" nas linhas de código e deixar algumas para tras de vez em quando?  :shocking:

  Agradeço desde já!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Um programa ou trabalha ou não trabalha, não existe "às vezes". Se não está a funcionar sempre bem, é porque alguma coisa não está certo.

Sem código não é fácil ajudar :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Rssss

Eu também pensava desse jeito, ou funciona ou não funciona, mas nesse caso, ele talves funciona ou talves não.

  Eu, para resolver um problema de lógica, costumo observar quando o problema acontece e em quais circunstancias, depois analiso os métodos que o fazem fazer seu trabalho para achar o defeito.

  Mas como analizar uma coisa que de vez funciona maravilhosamente bem, e de vez não? nas mesmas circunstancias?

  Ah sim..... queres que poste o código?  Só 1500 linhas.... rsss

  Parece que o Timer está a pular algumas linhas de vez em quando.

  No código acontece o seguinte....  É um joguinho de cartas, o timer distribui as cartas e faz jogar.  E de vez em quando ele joga sem ter cartas, para acontecer uma coisa tem que acontecer outra, mas mesmo assim falha....

  Minha pulga atrás da orelha é a seguinte, se no VB 2008 a picturebox demora para receber o valor visible = false, ou se o timer pulasse algumas linhas, o q me parecia impossivel, uma coisa grotesca, mas não tenho em mais o que pensar.

Obrigado pela atenção....  :biggrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O Timer não pula linhas ... o código é que pode não estar correcto!

Eu não quero obviamente ver 1500 linhas de código (nem se quer olhava para isso) mas de certeza que o código falha em alguma lado, e era essa lógica que queria ver (não tudo).

Por exemplo um timer ...

Deve-se definir primeiro o Interval e depois inicia-lo. Alem disso, no evento tick, deve-se para-lo, executar o código e só depois arranca-lo outra vez. É claro que isto é para a maioria dos casos e em alguns pode não funcionar assim.

A picturebox só leva algum tempo a carregar a imagem caso o tamanho da imagem seja demasiado grande.

Eu sugeria colocares um problema de cada vez e mostrares de uma forma geral como está desenhado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Qual é a funcionalidade do timer ao distribuir cartas?

Não vejo nenhum motivo para o uso de um timer. Cada interval do timer corresponde a que? A dar uma carta a 1 jogador?

Visto tares a usar timers o teu problema deve estar mesmo aí, problemas de sincronização. Talvez intervals curtos e que faz o código sobrepor-se em várias chamadas. Depois basta teres variáveis que façam parte do scope fora do método, que uma chamada do timer vai estar a influenciar outra que também esteja a correr nesse instante...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pessoal, aconteceu o que eu temia, o Timer realmente se embaralha, pois eu coloquei o código no evento Load do Form e testei umas 1.000 vezes e todas deram certo, fui por o código de volta no Timer e voltou a dar aqueles malditos erros dos Diabos.

Bom colegas, o único problema, é que eu pretendia fazer um joguinho de truco quando acabasse esse, pois esse era só para testes e tudo mais, e nesse jogo(pra quem não sabe), recebemos tres cartas, e a mesa deve ser limpada quando todos jogarem essas tres cartas, embaralhar o baralho e distribuir as cartas denovo, deve-se fazer isso em até alguém ganhar 12 pontos, e eu não vejo um modo de fazer isso se não em um Timer. =/

No meu código eu estava fazendo o seguinte...

Cada vez que a mesa ficava fazia, ele distribuia as cartas denovo, as fazia aparecer e desligava o timer...

                enbaralhar() ' Ele sorteava as cartas e as distribui-a para um vetor de String que contem os naipes e  os valores

                m1.Visible = True  ' Hora das cartas aparecerem denovo
                m2.Visible = True  ' Essas cartas são as Minhas....
                m3.Visible = True

                a1.Visible = True  'Essas são de um adversário
                a2.Visible = True
                a3.Visible = True

                P1.Visible = True 'Essas do meu parceiro
                P2.Visible = True
                P3.Visible = True

                AD1.Visible = True ' E essas do meu outro adversário
                ad2.Visible = True
                ad3.Visible = True

                vira.Visible = True ' Essa é a imagem da vira

Esse código estava no Timer, as vezes corria tudo bem, mas as vezes algumas cartas não apareciam, e não é problema na distribuição nem na embaralhação, pois o código funciona no Load do Form normal.

Por favor gente, tirar o código do timer no começo do jogo tudo bem, mas e no decorrer? Como eu faço? Estava pensando em por no evento Click da minha carta, mas as outras cartas só podem aparecer quando as da mesa sumirem, e é claro que precisaria ter um efeitinho das cartinhas andando lá né?.

Por que será que está a acontecer isso no timer? o Interval dele é 2.

Obrigado a todos pela atenção.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá a todos!!!

Pessoal, practicamente, aqui é o unico lugar onde pode estar a dar o problema, por favor me ajudem, me expliquem porque dá certo se eu por o código no Load do Form e não dá se eu por no Timer, nem em evento nenhum....

É a subrotina enbaralhar()...  'Eu sei q é com m, ^^  :)


   
'Variaveis da classe

    Dim naipe, carta, i, j, i2 As Integer 'VALOR DAS CARTAS
    Dim snaipe, scarta As String ' Valor do numero randomico das cartas e naipes
    Dim baraio(12) As String ' Caminho do arquivo do Image.FromFile
    Dim vscarta(12) As String    'vetor das cartas / valores delas
    Dim vsnaipe(12) As String ' vetor dos naipes
   




Sub enbaralhar() ' Essa sub eh responsavel por ñ deixar a mesma carta sair duas vezes

        For Me.i = 0 To 12

            Randomize()
            naipe = Int((Rnd() * 4) + 1)

            Select Case naipe
                Case 1 : snaipe = "Ouros"
                Case 2 : snaipe = "Pique"
                Case 3 : snaipe = "Copas"
                Case 4 : snaipe = "Paus"
            End Select

            Randomize()
            carta = Int((Rnd() * 10) + 1)

            Select Case carta
                Case 1 : scarta = "A"
                Case 2 : scarta = "2"
                Case 3 : scarta = "3"
                Case 4 : scarta = "4"
                Case 5 : scarta = "5"
                Case 6 : scarta = "6"
                Case 7 : scarta = "7"
                Case 8 : scarta = "Q"
                Case 9 : scarta = "J"
                Case 10 : scarta = "K"
            End Select

            baraio(i) = snaipe & "//" & scarta & ".jpg" 'Faz a concatenação para colocar no caminho do "Image.FromFile"
            vscarta(i) = scarta
            vsnaipe(i) = snaipe

            i2 = i

            If i > 0 Then    

                For Me.j = 0 To (i2 - 1)   'Verifica se a carta já saiu, se sim, então é só repetir mais uma vez

                    If baraio(i2) = baraio(j) Then

                        i += -1

                    End If

                Next

            End If

        Next

        advD.naipe1 = vsnaipe(0) ' Essa eh a verdadeira distribuicao
        advD.naipe2 = vsnaipe(1) ' Essas São Structures que cada participante tem
        advD.naipe3 = vsnaipe(2) 'cada structure tem naipe1,2,3; carta1,2,3 e baraio 1,2 e 3

        advD.carta1 = vscarta(0)  ' Otra structure, essa de outro personagem
        advD.carta2 = vscarta(1)
        advD.carta3 = vscarta(2)

        pco.naipe1 = vsnaipe(3)
        pco.naipe2 = vsnaipe(4)
        pco.naipe3 = vsnaipe(5)

        pco.carta1 = vscarta(3)
        pco.carta2 = vscarta(4)
        pco.carta3 = vscarta(5)

        adv.naipe1 = vsnaipe(6)
        adv.naipe2 = vsnaipe(7)
        adv.naipe3 = vsnaipe(8)

        adv.carta1 = vscarta(6) 'outra, representa outro personagem
        adv.carta2 = vscarta(7)
        adv.carta3 = vscarta(8)


        eu.naipe1 = vsnaipe(9) 'Essa representa minha mão
        eu.naipe2 = vsnaipe(10)
        eu.naipe3 = vsnaipe(11)

        eu.carta1 = vscarta(9)
        eu.carta2 = vscarta(10)
        eu.carta3 = vscarta(11)


        m1.Image = Image.FromFile(baraio(9))  ' Ele carrega a imagem num diretório
        m2.Image = Image.FromFile(baraio(10))
        m3.Image = Image.FromFile(baraio(11))

        vira.Image = Image.FromFile(baraio(12)) ' Vira/imagem dela no form

    End Sub

Oooh gente, eu sei que eu ando a torrar a paciência dos colegas, mas me dêem mais essa ajudinha, por favor.  :cheesygrin:

Valeu desde já.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esse código estava no Timer, as vezes corria tudo bem, mas as vezes algumas cartas não apareciam, e não é problema na distribuição nem na embaralhação, pois o código funciona no Load do Form normal.

Por que será que está a acontecer isso no timer? o Interval dele é 2.

Olá,

Leste o que coloquei  ?

Por exemplo um timer ...

Deve-se definir primeiro o Interval e depois inicia-lo. Alem disso, no evento tick, deve-se para-lo, executar o código e só depois arranca-lo outra vez. É claro que isto é para a maioria dos casos e em alguns pode não funcionar assim.

Definiste o Interval do timer para 2 o que significa que corre de 2 em 2 milisegundos. O que acontesse é que está constantemente a tentar carregar imagens, fazer operações, etc, etc, e é obvio que há coisas que não consegue fazer nesse tempo de acção.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nossa, desculpe Sr. Paulino, passei meus olhos por despercebido de sua citação, mil perdões pela distração única. :-[  :-[

Vou-me por a ajuda do colega em ação.  :D

Mais uma vez agradeço pela atenção, disculp'alguma coisa ae gente!! ^^

Depois posto dizendo se deu certo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Por um momento, achei que viria a dar certo...

Mas, na terceira distribuição de cartas, voltou o maldito erro, a carta do jogador "pco" aparece na mesa e ele continua com três cartas na mão, e a que ele jogou é a mesma nas três vazas, é um erro inexplicável, pois coloquei o código em um botão e o erro persistiu depois da quinta ou sexta vez que o cliquei.

Juro que nunca vi nada parecido, nem no Delphi que tem mania de dar esses erros macabros.

  :shocking:

E aí pessoal? Alguém sugere alguma coisa? rSsSs

Está tudo APARENTEMENTE correto, mas o código dá erro quando ele quer. :eek:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens de mostrar como está o código agora ....

- Já aumentaste o timer ?

- Quando é que o timer é chamado ?

- Estás a parar o timer e a arrancá-lo no evento tick ?

Esses problemas chamam-se bugs! :confused:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não há erros macabros, nem truques de magia. O ilusionismo poderá parecer magia mas só quando não se sabe como as coisas funcionam...

Para além de veres o que o jpaulino disse, para evitar que tenhas multiplos eventos do timer a correr ao mesmo tempo, também era uma boa ideia pores essas todas tuas variáveis a serem declaradas dentro do método enbaralhar. Todas excepto os:

Dim baraio(12) As String ' Caminho do arquivo do Image.FromFile

Dim vscarta(12) As String    'vetor das cartas / valores delas

Dim vsnaipe(12) As String ' vetor dos naipes

Já que parece serem as únicas que realmente são necessárias fora do método, e isso sempre te ajudará a evitar erros. Mas múltiplos eventos de timer é sempre mau e tens de impedir que isso aconteça.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Rssss, sim, esses são os famosos "Bugs"...

Primeiramente obrigado, mais uma vez, pessoal, pela atenção. :P

E.. continuando,

Sim, já modifiquei o Timer, colocarei o código dele, ele é parado quando começa o código e quando termina ele é arrancado denovo.

Ele é acionado na subrotina "Joga(ByVal com As String)" que é acionada quando carrega a Form se for outra personagem que comece além de mim e quando eu clico em alguma carta...

Essa Sub joga() é responsável por chamar a Inteligência Artificial dos jogadores que está dentro de outra Sub a "IA()", a joga() taca uma carta do personagem a jogar na mesa e, se todos já jogaram, chama o Timer "limpamesa"...

O código do Timer Limpamesa está aqui...


        Limpamesa.Enabled = False

        If a.Visible Then  'Essa é a imagem que fica na mesa quando o personagem adversario do lado esquerdo joga...

            If a.Left < 650 Then   'Esse código faz ela andar no form até chegar num canto e sumir..
                a.Left += 15
            Else

                If a.Left > 12 And a.Left > 650 Then
                    a.Top = a.Top - 15
                End If

            End If

            If a.Left >= 650 And a.Top <= 12 Then ' Se ela já chegou onde eu queria então coloca ela no lugar de sempre e a deixe invisível
                a.Visible = False
                a.Top = 251
                a.Left = 256
            End If

        End If

        If d.Visible Then ' Carta que aparece na mesa quando o adversário da direita joga

            If d.Left < 650 Then   ' Mesma coisa que a carta anterior
                d.Left += 15
            Else

                If d.Left > 12 And d.Left > 650 Then
                    d.Top = d.Top - 15
                End If
            End If

            If d.Left >= 650 And d.Top <= 12 Then
                d.Visible = False
                d.Top = 256
                d.Left = 411
            End If

        End If

        If w.Visible Then  ' Carta que aparece na mesa quando o parceiro do usuário joga

            If w.Left < 650 Then
                w.Left += 15
            Else

                If w.Left > 12 And w.Left > 650 Then
                    w.Top = w.Top - 15
                End If
            End If

            If w.Left >= 650 And w.Top <= 12 Then
                w.Visible = False
                w.Top = 187
                w.Left = 331
            End If

        End If

        If s.Visible Then  ' Carta que aparece quando o usuário joga

            If s.Left < 650 Then
                s.Left += 15
            Else

                If s.Left > 12 And s.Left > 650 Then
                    s.Top = s.Top - 15
                End If
            End If

            If s.Left >= 650 And s.Top <= 12 Then
                s.Visible = False
                s.Left = 331
                s.Top = 300
            End If

        End If

            Limpamesa.Enabled = True  'Se acabou de fazer tudo, então arranca o timer denovo

            If a.Visible = False And s.Visible = False And d.Visible = False And w.Visible = False Then  

                Limpamesa.Enabled = False  'Se todas as cartas da mesa estiverem invisíveis, desliga o Timer

                If m1.Visible = False And m2.Visible = False And m3.Visible = False Then 'Se todas as minhas cartas estiverem invisíveis, então deixa todas as cartas visíveis denovo e reimbaralha

                 m1.Visible = True  ' Código que o FormLoad contém
                 m2.Visible = True
                 m3.Visible = True

                 a1.Visible = True
                 a2.Visible = True
                 a3.Visible = True

                 P1.Visible = True
                 P2.Visible = True
                 P3.Visible = True

                ad2.Visible = True
                ad3.Visible = True
                AD1.Visible = True

                vira.Visible = True

                enbaralhar()

                End If

            End If

O Timer Limpamesa é chamado dentro do Joga()...


Sub joga(ByVal com As String)

        Select Case com

            Case "ad"  'Se quem for começar for o adversário da direita então todos jogam e espera o usuário

                IA(advD.carta1, advD.carta2, advD.carta3, advD.naipe1, advD.naipe2, advD.naipe3, AD1, ad2, ad3)
                d.Visible = True ' O IA() é responsável por delimitar que carta estará no d

                If w.Visible = False Then

                    IA(pco.carta1, pco.carta2, pco.carta3, pco.naipe1, pco.naipe2, pco.naipe3, P1, P2, P3)
                    w.Visible = True

                    If a.Visible = False Then

                        IA(adv.carta1, adv.carta2, adv.carta3, adv.naipe1, adv.naipe2, adv.naipe3, a1, a2, a3)
                        a.Visible = True

                    End If

                End If

                If s.Visible Then  ' Se a carta na mesa que representa as do usuário estiver visivel então liga o Timer limpamesa...

                    Limpamesa.Enabled = True

                End If

            Case "a" ' Se for o adversário da esquerda só ele joga e espera o usuário

                IA(adv.carta1, adv.carta2, adv.carta3, adv.naipe1, adv.naipe2, adv.naipe3, a1, a2, a3)
                a.Visible = True

            Case "pco" ' se for o parceiro, ele joga e o adversario da esquerda para esperar o usuário

                IA(pco.carta1, pco.carta2, pco.carta3, pco.naipe1, pco.naipe2, pco.naipe3, P1, P2, P3)
                w.Visible = True

                IA(adv.carta1, adv.carta2, adv.carta3, adv.naipe1, adv.naipe2, adv.naipe3, a1, a2, a3)
                a.Visible = True

        End Select

    End Sub

:biggrin:

Estão a ver, colegas? Sem erros  :wallbash: ... huehuehuehuehuehue

Estou a esperar sujestões, ^^

Valeu aeeee gente.... :biggrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

:cheesygrin:Gente....

O código do enbaralhar() falta um pedacinho, deixei de por, porque vocês não conheciam o código do Joga()

O pedacinho era esse....

rand = Int((Rnd() * 4) + 1)

        Select Case rand
            Case 1 : joga("a")
            Case 2 : joga("ad")
            Case 3 : joga("pco")
        End Select

:biggrin:

Ele faz de errado o seguinte, de vez em quando algum personagem continua com as três cartas e fica aparecendo na mesa sempre a mesma(carta esta que não faz parte das desse personagem) até as cartas do usuário acabar e o limpamesa ser chamado outra vez a fim de limpar a mesa e redistribuir as cartas, as vezes quando isto acontece algum personagem joga duas cartas duma vez....

O maldito erro é este, se quiseres o código da sub IA(), da ultima sub que falta lhes mostras, está aqui...  Essa sub é responsável por fazer o personagem jogar sua maior carta...


Sub IA(ByVal _c1 As String, ByVal _c2 As String, ByVal _c3 As String, ByVal _n1 As String, ByVal _n2 As String, ByVal _n3 As String, ByVal pb1 As PictureBox_
, ByVal pb2 As PictureBox, ByVal pb3 As PictureBox)

        Dim n1, n2, n3 As Integer
        Dim aux As Integer = 0

        If pb1.Visible Then  ' Se a imagem não estiver visível não é preciso saber o quanto ela vale 
            n1 = valoriza(_n1, _c1)  'A sub valoriza retorna um valor inteiro dependendo da carta do personagem
        End If
        If pb2.Visible Then
            n2 = valoriza(_n2, _c2)
        End If
        If pb3.Visible Then
            n3 = valoriza(_n3, _c3)
        End If


        If pb1.Visible Then  ' Verifica qual das cartas é a maior


            If n1 >= aux Then
                aux = n1
            End If

        End If
        If pb2.Visible Then

            If n2 >= aux Then
                aux = n2
            End If

        End If
        If pb3.Visible Then

            If n3 >= aux Then
                aux = n3
            End If

        End If

        Select Case _c1

            Case adv.carta1  ' Se a carta for do adversário da esquerda então verifica qual das cartas deve ser jogada

                Select Case aux

                    Case n1  'Se o maior número for o n1 então joga a primeira carta

                        aM.carta = _c1  'Nome da carta
                        aM.naipe = _n1  'Naipe dela
                        a.Image = Image.FromFile(_n1 & "//" & _c1 & ".jpg")  'Junta os dois e forma um caminho pra imagem da carta da mesa
                        a1.Visible = False ' Faz a carta da mão do personagem ficar invisível
             


                    Case n2 ' Se for a segunda carta a maior, então taca ela

                        aM.carta = _c2   'Mesa coisa
                        aM.naipe = _n2
                        a.Image = Image.FromFile(_n2 & "//" & _c2 & ".jpg")
                        a2.Visible = False
                   


                    Case n3

                        aM.carta = _c3
                        aM.naipe = _n3
                        a.Image = Image.FromFile(_n3 & "//" & _c3 & ".jpg")
                        a3.Visible = False
                   


                End Select


            Case advD.carta1    'Mesa coisa...............

                Select Case aux

                    Case n1

                        dM.carta = _c1
                        dM.naipe = _n1
                        d.Image = Image.FromFile(_n1 & "//" & _c1 & ".jpg")
                        AD1.Visible = False



                    Case n2

                        dM.carta = _c2
                        dM.naipe = _n2
                        d.Image = Image.FromFile(_n2 & "//" & _c2 & ".jpg")
                        ad2.Visible = False


                    Case n3

                        dM.carta = _c3
                        dM.naipe = _n3
                        d.Image = Image.FromFile(_n3 & "//" & _c3 & ".jpg")
                        ad3.Visible = False


                End Select

            Case pco.carta1   'Mesa coisa..........

                Select Case aux

                    Case n1

                        wM.carta = _c1
                        wM.naipe = _n1
                        w.Image = Image.FromFile(_n1 & "//" & _c1 & ".jpg")
                        P1.Visible = False

                    Case n2

                        wM.carta = _c2
                        wM.naipe = _n2
                        w.Image = Image.FromFile(_n2 & "//" & _c2 & ".jpg")
                        P2.Visible = False

                    Case n3

                        wM.carta = _c3
                        wM.naipe = _n3
                        w.Image = Image.FromFile(_n3 & "//" & _c3 & ".jpg")
                        P3.Visible = False


                End Select

        End Select
End Sub

vlw aeee gente

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Detalhe pessoal, fiz também a dica do colega de colocar as variáveis apenas onde eu as uso, mas o erro continua.  :wallbash:

Não sei mais o que fazer, conto com a ajuda dos colegas...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

He he heeeeeee.......

PESSOAL...... DEPOIS DE MUITAS QUEBRADAS DE CABEÇA, ACABEI-ME POR DESCOBRIR EM QUE LUGAR O ERRO SE ENCONTRA, É NA SUB IA(), A ULTIMA QUE LHES MOSTREI....

E PARECE-ME QUE ERA ERRO DE LÓGICA  :shocking:  :wallbash:  :-[

POIS COLOQUEI UM OUTRO CÓDIGO MAIS SIMPLES, SÓ PRA TESTES, QUE IA JOGANDO QUALQUER CARTA DO PERSONAGEM NA SORTE, E DEU CERTO.....

O GENTE.... AJUDEM-ME A ENCONTRAR O ERRO DE LÓGICA QUE TINHA NAQUELA SUB....

VLW AEEE PESSOAL, DESDE JÁ FICO AGRADICIDO

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora