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

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 :)
 
Boas!

Antes de mais, permite-me uma correcção:
comecei por construir o IDE
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:
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?
 
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
 
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.
 
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).
 
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
 
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)
 
É 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() :)
 
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.
 
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)
 
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:
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 ;)
 
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 ;)
 
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:
edit: alias, nem precisa de BD. Pode criar um Recordset on-the-fly e depois é só brincar com SQL
Recordset's rullez

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:
 
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.
 
Back
Topo