Wie mische ich Karten einzeln und nacheinander?

Das ist, was ich bis jetzt bekommen habe und festgefahren bin. = /

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 

Du musst das gesamte Deck im Voraus erstellen (52 Karten), es in einer Liste / einem Stapel / einer Warteschlange speichern und bei Bedarf einen Spieler abgeben.

Eine Doppelschleife sollte gut genug sein, um Karten sequentiell zu generieren und dann nach Zufallszahl zu sortieren:

 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) 

EDIT: Hier können Sie Ihre Etiketten füllen (nur eine Möglichkeit):

 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 

Referenz:

  • Stack (von T) .Pop @ MSDN .

Eine geeignete Lösung wäre es, Etiketten dynamisch zu erstellen, aber stellen Sie zuerst sicher, dass Sie dies zum Laufen bringen können. Refactoring wird normalerweise durchgeführt, nachdem Sie ein funktionierendes Produkt haben.

Das ist der falsche Weg:

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

Sie können leicht mit doppelten Karten enden, weil Sie diese Karte auswählen, ohne zu wissen, ob sie bereits ausgeteilt wurde (selbst bei diesem Klick!). Sie wollen auch einen Zufall pro Spiel / App, nicht pro Karte. Die Darstellung einer Karte als ” suit & face funktioniert, aber sie klebt 2 wichtige Informationen zusammen – in den meisten Spielen musst du sie später parsen, um diese Informationen zu erhalten.

Ein Deck besteht aus 52 Karten; Jede Karte besteht aus einem Anzug und einem Rang. Lässt eine einfache class oder zwei bauen, die das nachahmt:

 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 

In Wirklichkeit möchten Sie auch eine Value-Eigenschaft, da sie in den meisten Spielen nicht mit dem Rang übereinstimmt.

Mit dem Rank und Suit als individuellen Eigenschaften können Sie die Karten von einem Spieler gegen einen anderen testen, um zu sehen, wer die beste Karte hat. Das ist in einigen Spielen wie BlackJack einfach, da dir nur der Rang und die Summe wichtig sind. Handauswertung ist in anderen Spielen komplexer, da Sie Combos wie FullHouse und Flush haben können. Jetzt das Deck (mit beiden Shuffle-Methoden zur Veranschaulichung):

 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 

Anstatt einfach nach Code zum Einfügen zu suchen, sollten Sie versuchen, die präsentierten Konzepte zu lernen (auch wenn es nur das Erlernen der Namen von Konzepten ist, über die Sie mehr erfahren wollen / müssen: classn, Aufzählung, Sammlungen, Objekte, Methoden … ). Das Obige ist viel komplizierter als ein einfaches Array, aber wenn man es studiert, sieht man, dass Card und Deck die realen Versionen nachahmen. Das Deck baut sich so woanders auf, wir müssen es nur benutzen.

Als nächstes folgt eine Spielerklasse für die Karten und eine Spielklasse für die Umsetzung der Regeln für das Spiel, die Kartenausgabe und die Kontrolle der Reihenfolge (diese müssen vom Schüler abgeschlossen werden). Dies führt zu fast keinem Code in der Form, nur einige Aufrufe zum Spiel (und nur zum Spiel), welches wiederum Deck und Spieler benutzt, Kontrollen dreht, Karten an Spieler etc. gibt zB:

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

Shuffle-Taste:

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

Deal-Taste:

  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 

In 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) 

Bei Verwendung von classn weiß das Formular nicht, wie es geschieht (wie bei der Suffle-Methode), es geschieht nur, wenn es angefordert wird. Texas HoldEm Spiel, in dem die Gemeinschaftskarten von Spieler (0) gehalten werden, der eine IsHouse Eigenschaft hat und ein anderer Spieler, der IsHuman (grundsätzlich so, dass seine Karten immer IsHuman ):

Bildbeschreibung hier eingeben

.o0 (Ja, “Jon” geh rein, bitte geh alles rein.)
Und ich möchte auf jeden Fall eine “6” für “Neo” herauskommen sehen. Definitiv eine ‘6’ für “Neo”.