1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[VB6] p_PoKer - Projecto de poker em construção

Discussão em 'Programação' iniciada por WinAce_Boy, 4 de Agosto de 2008. (Respostas: 65; Visualizações: 5534)

  1. WinAce_Boy

    WinAce_Boy Power Member

    Boas,

    Estou a desenvolver um jogo de poker em vb6 para 2 jogadores jogarem em rede. A parte da comunicação entre os dois vou deixar para o fim, comecei por construir o IDE até que depois de essa parte concluída passei para o código, baralhar as 52 cartas tendo 4 naipes diferentes e 13 cartas cada um como é óbvio (52/4) e pôr a lista das cartas já baralhadas numa listbox para posteriormente ser possível jogar com elas :P como se a listbox fosse o baralho de cartas já baralhado.

    Tive a testar a função Randomize e a função Rnd necessárias para a geração de números aleatórios, entre esses testes está aqui um pequeno algoritmo que gera 4 números aleatórios testando se existe algum número igual ao que vai ser gerado; se isso se verificar ele gera outro número até que sejaM diferentes dos outros todos gerados anteriormente.

    Código:
    Private Sub Command2_Click()
        List2.Clear
        
            For i = 1 To 4
            Randomize
            value = CInt(Int((4 * Rnd()) + 1))
        
                If i = 1 Then List2.AddItem value: v(1) = value
        
                If i = 2 Then
                        Do
                            value = CInt(Int((4 * Rnd()) + 1))
                        Loop While value = v(1)
            
                    List2.AddItem value
                    v(2) = value
                End If
        
                If i = 3 Then
                        Do
                            value = CInt(Int((4 * Rnd()) + 1))
                        Loop While value = v(1) Or value = v(2)
            
                    List2.AddItem value
                    v(3) = value
                End If
        
                If i = 4 Then
                        Do
                            value = CInt(Int((4 * Rnd()) + 1))
                        Loop While value = v(1) Or value = v(2) Or value = v(3)
            
                    List2.AddItem value
                End If
            Next i
    End Sub
    Questões:

    1- Gostava que me me dissessem se é possível fazer as mesmas instruções do algoritmo em cima mas com menos palavras e que me explicassem por passos o mesmo algoritmo já modificado.

    Vou também precisar de ajuda (mas isso é mais à frente, depois de me responderem à primeira questão) com a minha primeira dúvida - baralhar o baralho de cartas.

    Só espero ter-me explicado bem e que me ajudem o mais rapidamente possível.
    Obrigado desde já e Obrigado pela atenção!

    Abraços para todos :)
     
  2. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Boas!

    Antes de mais, permite-me uma correcção:
    Penso que queiras dizer que começaste por construir a Interface Gráfica (GUI - Graphical User Interface). Uma IDE é um ambiente - Integrated Development Environment - como o próprio Visual Studio.

    Em relação ao resto do teu post, em primeiro lugar, não ponhas o Randomize logo a seguir ao For. Ele assim perde efeito ;)
    Em vez disso, coloca apenas "Randomize Timer" logo no início do programa --> no Form_Load.

    Quanto a baralhares as cartas, procurei no Google por "vb6 shuffle listbox" e encontrei um resultado que aconselho:
    http://www.xtremevbtalk.com/showpost.php?p=883510&postcount=7
    Isso é um algoritmo que "troca" quaisquer duas cartas aleatoriamente. É um método mais eficaz de fazer o baralho.
    Esse post trabalha com uma array, e não com uma listbox. No entanto, deixo-te isto como um desafio para trabalhares mais um pouco ;)

    Dá uma vista de olhos e depois diz qualquer coisa :)
     
    Última edição: 4 de Agosto de 2008
  3. WinAce_Boy

    WinAce_Boy Power Member

    Código:
    For C = 1 To 52
       K = Int(Rnd() * 52) + 1   ' choose a random card to swap card C with
       J = Deck(C)
       Deck(C) = Deck(K)   ' swap cards C and K
       Deck(K) = J
       Next
    Não percebo muito bem o código, onde é que ele está a ir buscar as cartas?
     
  4. MPalhas

    MPalhas Power Member

    a cartas estão na variavel Deck, que é um array

    esse ciclo, vai trocar a carta Deck(C) (C é o contador do ciclo) por outra de indice aleatório

    agora ou alteras esse código para trabalhar com uma ListBox como tu tinhas, ou fazes o contrário, e passas tu a trabalhar com um array
     
  5. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Exactamente :)

    Esse código funciona da seguinte maneira:
    faz um ciclo entre as 52 cartas, escolhe um número aleatório, e as três linhas de código seguintes limitam-se a trocar o valor da carta actual com a carta que se encontra na posição do número aleatório. Como são só trocas, os dados não são modificados, só a ordem deles.

    Como está a trabalhar com uma array, é como o MPalhas disse - ou modificas o código para que ele trabalhe com uma listbox (tu consegues, só tens é de pensar um pouco ;) ), ou fazes com que o conteúdo da listbox vá para uma array.
     
  6. WinAce_Boy

    WinAce_Boy Power Member

    õk já entendi mas neste exemplo só baralha as cartas a não ser que eu na array deck ponha a carta+naipe certo?
     
  7. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    O que esse exemplo faz é baralhar uma array. Ponto.
    Se quiseres ter uma array com as 52 cartas ou 4 arrays com 13 cartas, uma array por naipe, é contigo. No entanto, acho que a forma ideal de baralhar é mesmo a array de 52 cartas (carta + naipe).
     
  8. MPalhas

    MPalhas Power Member

    podes por exemplo declarar o array como sendo de strings, e usar desta forma:

    "2e" -> corresponde ao dois de espadas
    "ko" -> rei de ouros

    e assim sucessivamente. depois é só criar uma função que receba essa string e retorne o valor que realmente queres (tanto o nome da carta, como o seu valor no jogo)

    porque se fizesses 4 arrays, um para cada naipe, complicava mais, porque ainda tinhas que arranjar maneira de ir buscar a próxima carta escolhendo aleatoriamente um desses arrays
     
  9. WinAce_Boy

    WinAce_Boy Power Member

    e como guardo o naipe+carta dentro de um array unidimensional?
    é do genero:

    Carta- 4
    Naipe- 1

    deck(i)= i & naipe ou deck(i)= i & " " & naipe

    (o naipe varia de 1 a 4)
     
  10. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    É como quiseres. "Dois | Ouros", "2O", "2|o", "2 o"... tu fazes a organização conforme te der mais jeito. Mas é nestas situações que é sempre bom pensares primeiro no que vais fazer, para escolheres a organização que mais te convém. É só aí que está a grande diferença.

    Pessoalmente, iria para 2o, já que os quatro naipes são Espadas, Copas, Paus e Ouros, não há iniciais repetidas, e os números são A234567890JQK (podemos considerar o 10 como sendo 0, e assim continuaremos com apenas um caracter para designar um número).
    Ou seja, de AE a KO.

    Como guardas isso tudo numa array unidimensional?
    Pensa em dois ciclos e duas variáveis, uma com o valor "A234567890JQK", outra com o valor "ECPO", e algum manuseio da função Mid() :)
     
  11. WinAce_Boy

    WinAce_Boy Power Member

    Código:
    Private Sub Command1_Click()
    
    For i = 2 To 53
        value = CInt(Int((52 * Rnd()) + 1))
        j = Deck(i)
        Deck(i) = Deck(value)
        Deck(value) = j
        List2.AddItem Deck(i)
    Next
    MsgBox List1.ListCount
    MsgBox List2.ListCount
    End Sub
    
    Private Sub Form_Load()
    Dim a As Integer
    
    For j = 1 To 4
        For i = 2 To 14
        Deck(i) = i & " " & j
        List1.AddItem Deck(i)
        Next
    Next
    End Sub
    Fiz desta maneira, está-me a dar mal, não está a baralhar bem.
     
  12. MPalhas

    MPalhas Power Member

    porque é que na atribuição, fazes o ciclo interno entre 2 e 14? não deveria ser entre 0 e 12?

    e ao atribuir não podes fazer Deck(i)=... porque a variavel i apenas varia entre 2 e 14, ou seja vais estar a altera os 13 primeiros valores 4 vezes cada.

    talvez com Deck(i*j)
     
  13. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Já vi que isto é um bocado complicado.
    Cola isto num programa novo que apenas tenha uma listbox e uma commandbutton.
    Código:
    Private Sub Command1_Click()
        Dim Ciclo        As Integer
        Dim NumAleatorio As Integer
        Dim Temporario   As String
     
        For Ciclo = 0 To List1.ListCount - 1
            NumAleatorio = Int(Rnd() * List1.ListCount)
            Temporario = List1.List(Ciclo)
            List1.List(Ciclo) = List1.List(NumAleatorio)
            List1.List(NumAleatorio) = Temporario
        Next Ciclo
     
    End Sub
     
    Private Sub Form_Load()
        Dim Valores        As Integer
        Dim Naipes         As Integer
        Dim TodosOsValores As String
        Dim TodosOsNaipes  As String
     
        Command1.Caption = "Baralhar"
     
        TodosOsValores = "A234567890JQK"
        TodosOsNaipes = "ECPO"
     
        For Naipes = 1 To Len(TodosOsNaipes)
            For Valores = 1 To Len(TodosOsValores)
                List1.AddItem ( _
                                Mid(TodosOsValores, Valores, 1) & _
                                Mid(TodosOsNaipes, Naipes, 1) _
                              )
     
            Next Valores
        Next Naipes
     
    End Sub
    
    Estuda o código e depois recria-o; não te limites a copiar nada.
     
    Última edição: 4 de Agosto de 2008
  14. Armadillo

    Armadillo Folding Member

    bitaite:
    porque nao crias uma bd com as cartas, e fazes um
    Código:
    SELECT carta FROM baralho ORDER BY NEWID()?
    
    Isto em SQL server funciona
    Tenta ver se existe isto em Access

    simplificava-te o codigo ;)
     
  15. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Armadillo, acho que isso é complicar desnecessariamente. O WinAce_Boy ainda está a ver se consegue baralhar uma listbox. Passar disso para as BDs ainda é complicar mais ;)
     
  16. Armadillo

    Armadillo Folding Member

    olha que nao. tens na bd 52 cartas/registos (coisa que tens que ter sempre, nem que seja num array, numa listbox, whatever). Para escolher aleatoriamente as cartas basta-te um "select". Sem Arrays, sem algoritmos de "baralhar" manhosos. ;)

    Agora isso depende apenas da experiencia do user em usar BD's, visto que a nivel de codigo ficaria uma coisa ridiculamente pequena e simples.

    my .02€

    edit: alias, nem precisa de BD. Pode criar um Recordset on-the-fly e depois é só brincar com SQL
    Recordset's rullez
     
    Última edição: 4 de Agosto de 2008
  17. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    É aí que está a questão. Se o OP souber usar BDs, tudo bem, mas se não souber, é melhor não ir por aí ainda.
     
  18. IComeFromBehind

    IComeFromBehind Power Member

    Uma base de dados para armazenar uma lista de cartas só para poupar uma linha ou duas linhas de código mas que engenheiros são estes?
     
  19. Armadillo

    Armadillo Folding Member

    Estive a experimentar criar um Recordset sem BD. Conclusão: Não se consegue ordenar um Recordset, visto este, teoricamente, já ser o resultado de uma query (apesar de se poder usar filtros). Só usando mesmo uma BD é que a minha sugestão é exequível.

    @IComeFromBehind: qual é o problema? se as BD existem é para serem usadas. Se me pouparem uma linha, eu aproveito. :002:
     
  20. AliFromCairo

    AliFromCairo Power Member

    Na minha opinião, utilizar uma BD para fazer shuffle de um baralho é overkill porque neste caso, estás a utilizar a BD apenas para efeitos de ordenação. Isto pode ser feito de maneira bem mais eficiente (e simples) através de código.
     

Partilhar esta Página