¿Cómo mezclo y trato las cartas de una en una para los jugadores?

Esto es lo que obtuve hasta ahora y me encuentro atascado. = /

Private Sub Dealbtn_Click(sender As Object, e As EventArgs) Handles Dealbtn.Click Dim Suits() As String = {"S", "D", "C", "H"} Dim Faces() As String = {"2", "3", "4", "5", "6", "7", "8", "9", "T", "J", "Q", "K", "A"} Dim rand As New Random Dim rand1 As Integer = rand.Next(12) Dim rand2 As Integer = rand.Next(3) Label2.Text() = Faces(rand1) + Suits(rand2) End Sub 

Debes generar todo el mazo por adelantado (52 cartas), almacenarlo en una lista / stack / cola, y cuando sea necesario, repartir uno al jugador.

Un bucle doble debería ser lo suficientemente bueno para generar tarjetas de forma secuencial, luego ordenar por número aleatorio:

 Dim Suits() As String = {"S", "D", "C", "H"} Dim Faces() As String = {"2", "3", "4", "5", "6", "7", "8", "9", "T", "J", "Q", "K", "A"} Dim cards As New List(Of String) For Each s As String In Suits For Each f As String In Faces cards.Add(s & f) Next Next Dim r As New Random Dim cardsShuffled = cards.OrderBy(Function() r.Next) 

EDITAR: Aquí puede completar sus tags (solo una forma de hacerlo):

 Dim deck As New Stack(Of String)(cardsShuffled) For Each lbl As Label in {Label1, Label2, Label3, ...} 'you need to write all Try lbl.Text = deck.Pop() Catch ex As InvalidOperationException MessageBox.Show("No more cards.") End Try Next 

Referencia:

  • Stack (Of T) .Pop @ MSDN .

Una solución adecuada sería crear tags dinámicamente, pero primero asegúrese de que pueda hacer que esto funcione. La refactorización generalmente se realiza después de que tiene un producto en funcionamiento.

Esta es la forma incorrecta de hacerlo:

 Dim rand As New Random Dim rand1 As Integer = rand.Next(12) Dim rand2 As Integer = rand.Next(3) 

Puede terminar fácilmente con tarjetas duplicadas porque está eligiendo ESTA tarjeta sin saber si ya se ha repartido (¡incluso con este clic!). También quiere un uso aleatorio por juego / aplicación, no por tarjeta. Representar una carta como ” suit & face funcionará, pero pega dos piezas importantes de información juntas: en la mayoría de los juegos, luego tendrá que analizarla para obtener esa información.

Un mazo está compuesto por 52 cartas; cada Tarjeta está hecha de un Traje y un Rango. Vamos a construir una clase simple o dos que imita eso:

 Public Class Card Public Property Suit As String Public Property Rank As Integer ' card images from ' http://www.jfitz.com/cards/ Public Property Img As Image Private Faces() As String = {"Jack", "Queen", "King", "Ace"} ' for text version of the game Public Function CardText() As String Dim tmp As String = Rank.ToString If Rank = 1 Then tmp = "Ace" ElseIf Rank >= 11 Then tmp = Faces(Rank - 11) End If Return String.Format("{0} of {1}", tmp, Suit) End Function ' iDeck class will assign Rank, Suit and img to an "empty" card Public Sub New(strSuit As String, nRank As Integer, i As Image) Suit = strSuit Rank = nRank Img = i End Sub Public Overrides Function ToString() As String Return CardText() End Function End Class 

En realidad, también querrás una propiedad Value ya que en la mayoría de los juegos no es lo mismo que Rank.

Con el rango y el palo como propiedades individuales, puedes probar las cartas de un jugador contra otro para ver quién tiene la mejor carta. Esto es fácil en algunos juegos como BlackJack, ya que lo único que te interesará es el rango y la sum. La evaluación manual es más compleja en otros juegos ya que puedes tener combos como FullHouse y Flush. Ahora el mazo (con ambos métodos aleatorios allí con fines ilustrativos):

 Public Class Deck Dim rand As Random ' the deck will be built in the same order a real deck comes in Private Suits() As String = {"Spades", "Diamonds", "Clubs", "Hearts"} Private Rank() As Integer = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13} ' useful for blackjack Private Const Ace As Integer = 1 ' freshly opened pack where they are in order. this is reused rather ' than building a new deck each time Private freshDeck As List(Of Card) ' shuffled deck; Stack prevents any bugs from a botched counter var Private shoe As Stack(Of Card) ' using an imagelist but My.Resources could work depending on card names Private imglist As ImageList ' the GAME object passes us the imagelist holding the card pics Public Sub New(imgs As ImageList) ' ctor ' new random ONCE rand = New Random imglist = imgs NewDeck() End Sub ' create a new deck (done ONCE) but could be called again Private Sub NewDeck() freshDeck = New List(Of Card) ' new object For Each s As String In Suits For Each n As Integer In Rank Dim key As String = CardKey(s, n) freshDeck.Add(New Card(s, n, imglist.Images(key))) Next Next End Sub Private keys() As String = {"J", "Q", "K"} Private Function CardKey(suit As String, rank As Integer) As String ' convert Suit / Key to the key used in the imglist ' (eg C1.JPG for Clubs, Ace) ' cards come from http://www.jfitz.com/cards/ ' use the windows set (or rename them all) Dim key As String = suit.Substring(0, 1) ' => C, H, D, S If rank < 11 Then key &= rank.ToString Else key &= keys(rank - 11) ' cvt 11, 12, 13 => J, Q, K End If Return key & ".png" End Function ' Shuffle deck using Fisher-Yates; sub optimal here since we "use up" ' the shoe each hand and are not reshuffling a deck Public Sub Shuffle() ' new temp deck preserves the new deck starting point Dim thisDeck As New List(Of Card)(freshDeck.ToArray) Dim tmp As Card Dim j As Integer ' hi to low, so the rand pick result is meaningful ' lo to hi introduces a definite bias For i As Integer = thisDeck.Count - 1 To 0 Step -1 j = rand.Next(0, i + 1) ' NB max param is EXCLUSIVE tmp = thisDeck(j) ' swap Card j and Card i thisDeck(j) = thisDeck(i) thisDeck(i) = tmp Next ' using a stack for the actual deck in use; copy shuffled deck to the Shoe shoe = New Stack(Of Card)(thisDeck.ToArray) End Sub ' shuffle using random and LINQ (neo's answer) Public Sub ShuffleLinq() ' using the same rand per app run may be random enough ' but would not suffice for most 'serious' games or standards shoe = New Stack(Of Card)(freshDeck.OrderBy(Function() rand.Next)) End Sub Public Function DealCard() As Card ' get a card If shoe.Count = 0 Then ' ToDo: out of cards ' happens with 9+ handed, 7 card games and many hi-lo games... ' usually mucked and burn cards are reshuffled ' some games use shared cards at the end ' (muck/burn list not implemented) End If Return shoe.Pop End Function End Class 

En lugar de simplemente buscar el código para pegar, debe comenzar a tratar de aprender conceptos presentados (incluso si es solo el aprendizaje de los nombres de los conceptos sobre los que desea / necesita aprender más: Clases, Enum, Colecciones, Objetos, Métodos … ) Lo anterior es mucho más complicado que una simple matriz, pero si lo estudias verás que Card y Deck imitan las versiones del mundo real. El mazo se construye así que en otro lugar solo tenemos que usarlo.

Lo siguiente es una clase de jugador para mantener las cartas y una clase de juego para implementar las reglas del juego, repartir cartas y controlar el orden (estas se dejan para que el estudiante complete). Esto da como resultado casi ningún código en la forma, solo algunas llamadas al Juego (y solo el Juego) que a su vez usa Baraja y Jugador, controla los giros, da cartas a los jugadores, etc.

 Private poker As Game ... New Game(theImgList, 3) ' 3 == the human player 

Botón Shuffle:

  poker.ShuffleDeck() poker.NewHand() thisRound = Game.Rounds.HoleCards 

Botón Deal:

  Select Case thisRound Case Game.Rounds.HoleCards poker.NewHand() ' clears the display etc poker.DealRound(thisRound) ' deal cards thisRound = Game.Rounds.Flop ' change round indicator Case Game.Rounds.Flop ' even this could be internal to Game(poker) poker.DealRound(thisRound) thisRound = Game.Rounds.Turn 

En Game.DealRound:

  Case Rounds.Flop myDeck.DealCard() ' burn card players(0).AddCard(myDeck.DealCard) ' Player(0) is the house or community players(0).AddCard(myDeck.DealCard) players(0).AddCard(myDeck.DealCard) 

Al usar clases, el formulario no sabe ni le importa CÓMO sucede nada (como qué método alternativo), solo que sucede cuando se solicita. Juego Texas HoldEm, donde las Tarjetas comunitarias están en manos del Jugador (0) que tiene una propiedad IsHouse y otro jugador que IsHuman (básicamente para que sus tarjetas siempre se muestren):

enter image description here

.o0 (Sí, “Jon” ir all-in, POR FAVOR ir all-in)
Y definitivamente quiero ver un ‘6’ para “Neo”. Definitivamente un ‘6’ para “Neo”.