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

alphasil

Função Shuffle

14 mensagens neste tópico

Oi pessoal

Não me está a funcionar o código de shuffle

o código é este:

Imports System.IO

Public Class Form1

    Inherits System.Windows.Forms.Form

    Private Sub Shuffle()

        Dim Cards(50) As Integer

        Dim CardIndex As Integer

        Dim i, j, t As Integer

        For i = 1 To 50

            Cards(i) = i

        Next

        For j = 50 To 1 Step -1

            i = CInt(Rnd() * j - 0.5) + 1

            t = Cards(j)

            Cards(j) = Cards(i)

            Cards(i) = t

        Next

        CardIndex = 1

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim cartas As String

        cartas = Application.StartupPath

        Dim face As Boolean = False

        Dim CardIndex As Integer

        Dim PicBoxes(6) As PictureBox

        'Cartas escondidas

        pic1.Image = Image.FromFile(cartas & "\Cartas\" & "esce1.png")

        pic2.Image = Image.FromFile(cartas & "\Cartas\" & "esce1.png")

        pic3.Image = Image.FromFile(cartas & "\Cartas\" & "esce1.png")

        'Cartas que aparecem

        PicBoxes(0) = pic1

        PicBoxes(1) = pic2

        PicBoxes(2) = pic3

        PicBoxes(3) = pic4

        PicBoxes(4) = pic5

        PicBoxes(5) = pic6

        Call Shuffle()

        For PicBoxNumber = 3 To 5

            PicBoxes(PicBoxNumber).Image = Image.FromFile(cartas & "\Cartas\" & CStr(cartas(CardIndex)) & ".gif")

            PicBoxes(PicBoxNumber).BringToFront()

            PicBoxes(PicBoxNumber).Visible = True

            Call Shuffle()

        Next

    End Sub

End Class

Ora isto está a dar-me este erro

FileNotfound

C:\Users\Gil\Documents\Visual Studio 2008\Projects\cartas\cartas\bin\Debug\Cartas\C.gif

so que ao fazer shuffle devia escolher uma das cartas de forma aleatoria, não é?

As cartas estão numeradas de 1  a 50 estão em PictureBox

alguma coisa errada no código?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para fazeres uma função shuffle utilizas o seguinte código:

Dim rnd As New Random
rnd.Next(1,50)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Oi

Tiro isto?

Private Sub Shuffle()

        Dim Cards(50) As Integer

        Dim CardIndex As Integer

        Dim i, j, t As Integer

        For i = 1 To 50

            Cards(i) = i

        Next

        For j = 50 To 1 Step -1

            i = CInt(Rnd() * j - 0.5) + 1

            t = Cards(j)

            Cards(j) = Cards(i)

            Cards(i) = t

        Next

        CardIndex = 1

e ponho

Dim rnd As New Randomr

nd.Next(1,50)

ou acrescento este código no shuffle?

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A função que tinhas "shuffle" tinha por objectivo criar um número aleatório. Para criar um número aleatório utilizas o código que te mostrei.

Depois adicionas a uma lista (Dim myList As New List(Of Byte) o que já saiu. Depois só tens de verificar antes de inserir na lista se já la existe e caso exista criar um novo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Oi

Obrigado por ajudar

Continua a não dar, diz que n encontra o file

código

Imports System.IO

Public Class Form1

    Inherits System.Windows.Forms.Form

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim cartas As String

        cartas = Application.StartupPath

        Dim face As Boolean = False

        Dim CardIndex As Integer

        Dim PicBoxes(6) As PictureBox

        Dim rnd As New Random

        Dim myList As New List(Of Byte)

        'Cartas escondidas

        pic1.Image = Image.FromFile(cartas & "\Cartas\" & "0.png")

        pic2.Image = Image.FromFile(cartas & "\Cartas\" & "0.png")

        pic3.Image = Image.FromFile(cartas & "\Cartas\" & "0.png")

        'Cartas que aparecem

        PicBoxes(0) = pic1

        PicBoxes(1) = pic2

        PicBoxes(2) = pic3

        PicBoxes(3) = pic4

        PicBoxes(4) = pic5

        PicBoxes(5) = pic6

        For PicBoxNumber = 3 To 5

            rnd.Next(1, 50)

            PicBoxes(PicBoxNumber).Image = Image.FromFile(cartas & "\Cartas\" & ".gif")

            PicBoxes(PicBoxNumber).BringToFront()

            PicBoxes(PicBoxNumber).Visible = True

        Next

    End Sub

End Class

k ves de mal aí?

cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Por uma questão de ser mais perceptível, deverias utilizar o geshi para mostrar o teu código no fórum.

Quanto ao código que ficheiro é que falta? Onde é que ele te para a execução do programa?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que é isso ?

(cartas & "\Cartas\" & "0.png")

isto dá qualquer coisa como "c:\loalização do programa\cartas\0.png"

Não devias indicar o número que saiu?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Imports System.IO

Public Class Form1

    Inherits System.Windows.Forms.Form

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim cartas As String

        cartas = Application.StartupPath

        Dim face As Boolean = False

        Dim CardIndex As Integer

        Dim PicBoxes(6) As PictureBox

        Dim rnd As New Random

        'Cartas escondidas

        pic1.Image = Image.FromFile(cartas & "\Cartas\" & "0.png")

        pic2.Image = Image.FromFile(cartas & "\Cartas\" & "0.png")

        pic3.Image = Image.FromFile(cartas & "\Cartas\" & "0.png")

        'Cartas que aparecem

        PicBoxes(0) = pic1

        PicBoxes(1) = pic2

        PicBoxes(2) = pic3

        PicBoxes(3) = pic4

        PicBoxes(4) = pic5

        PicBoxes(5) = pic6

        For PicBoxNumber = 3 To 5

            rnd.Next(1, 50)

            PicBoxes(PicBoxNumber).Image = Image.FromFile(cartas & "\Cartas\" & CStr(cartas(CardIndex)) & ".gif")

            PicBoxes(PicBoxNumber).BringToFront()

            PicBoxes(PicBoxNumber).Visible = True

        Next

    End Sub

End Class

(cartas & "\Cartas\" & "0.png") (esta parte dá, ele vai buscar a carta)

o problema é o random, aí n faz nada

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Creio que era nesta que devia colocar o número gerado. Porque está  a fazer um ciclo para colocar em cada uma das pictureboxes sempre a imagem ".gif" (não sei se o Windows aceita um ficheiro sem nome, porque neste momento estou no Ubuntu)

PicBoxes(PicBoxNumber).Image = Image.FromFile(cartas & "\Cartas\" & ".gif")

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Utiliza isto.

Imports System.IO

Public Class Form1
    Inherits System.Windows.Forms.Form

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim cartas As String
        cartas = Application.StartupPath
        Dim face As Boolean = False
        Dim CardIndex As Integer
        Dim PicBoxes(6) As PictureBox
        Dim rnd As New Random
        'Cartas escondidas
        pic1.Image = Image.FromFile(cartas & "\Cartas\" & "0.png")
        pic2.Image = Image.FromFile(cartas & "\Cartas\" & "0.png")
        pic3.Image = Image.FromFile(cartas & "\Cartas\" & "0.png")
        'Cartas que aparecem
        PicBoxes(0) = pic1
        PicBoxes(1) = pic2
        PicBoxes(2) = pic3
        PicBoxes(3) = pic4
        PicBoxes(4) = pic5
        PicBoxes(5) = pic6
        For PicBoxNumber = 3 To 5
            PicBoxes(PicBoxNumber).Image = Image.FromFile(cartas & "\Cartas\" & (rnd.Next(1, 50)).tostring & ".gif")
            PicBoxes(PicBoxNumber).BringToFront()
            PicBoxes(PicBoxNumber).Visible = True
        Next
    End Sub
End Class 

Como o "rnd.Next" te devolve o valor aleartório deves guardá-lo ou utilizá-lo logo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Oi

Ja funcionou, obrigado

mas n percebi esta linha

"PicBoxes(PicBoxNumber).Image = Image.FromFile(cartas & "\Cartas\" & (rnd.Next(1, 50)).tostring & ".gif")"

o que percebo é que faz random(rnd.Netx(1,50) mas e o tostring?

Já agora, vou ter 3 botões para trocar as cartas geradas, em cada um deles vou ter de utilizar esta linha, certo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O ToString serve simplesmente para fazer uma conversão explicita. Como programador deves tentar saber exactamente tudo o que o teu programa faz. Como tal, quando não colocas o ToString, o VB encarrega-se de fazer uma conversão para string (uma vez que um caminho é uma string). Podes retirá-lo caso tenhas o option strict a off. Mas isto são opiniões. E eu gosto de mandar no "computador" e não que ele mande em mim ou no que eu faço.  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Oi

Continuo com um problema, quando carrego em trocar, dá erro no mesmo sítio, porque será?

A first chance exception of type 'System.NullReferenceException'

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim cartas As String

        cartas = Application.StartupPath

        Dim rnd As New Random

        Dim PicBoxes(6) As PictureBox

        For PicBoxNumber = 3 To 3

            rnd.Next(1, 50)

            PicBoxes(PicBoxNumber).Image = Image.FromFile(cartas & "\Cartas\" & (rnd.Next(1, 50)).ToString & ".gif")

            PicBoxes(PicBoxNumber).BringToFront()

            PicBoxes(PicBoxNumber).Visible = True

        Next

    End Sub

End Class

Que se passa agora?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

1º Podes-me explicar porquê que fazes um ciclo de 3 até 3 quando sabes que isto significa apenas uma vez?  :)

2º A seguir do dim das PicBoxes coloca

For I As Integer = 0 To 6
    PicBoxes(I) = New PictureBox
Next

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