[VB6] p_PoKer - Projecto de poker em construção | ZWAME Fórum
[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: 5897)
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 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.
value = CInt(Int((4 * Rnd()) + 1))
If i = 1 Then List2.AddItem value: v(1) = value
Loop While value = v(1)
List2.AddItem value
v(2) = value
Loop While value = v(1) Or value = v(2)
v(3) = value
Loop While value = v(1) Or value = v(2) Or value = v(3)
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!
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
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
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
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.
õk já entendi mas neste exemplo só baralha as cartas a não ser que eu na array deck ponha a carta+naipe certo?
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?
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()
value = CInt(Int((52 * Rnd()) + 1))
j = Deck(i)
Deck(i) = Deck(value)
Deck(value) = j
List2.AddItem Deck(i)
MsgBox List2.ListCount
Deck(i) = i & " " & j
List1.AddItem Deck(i)
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.
Dim Ciclo        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
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
Estuda o código e depois recria-o; não te limites a copiar nada.
porque nao crias uma bd com as cartas, e fazes um
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.
edit: alias, nem precisa de BD. Pode criar um Recordset on-the-fly e depois é só brincar com SQL
Recordset's rullez
Agora isso depende apenas da experiencia do user em usar BD's
É 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.
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?
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.
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.