Overview

BlackJack is a card game for two or more players, but in this version, it's just the user versus the computer.








Game Core

The core of the game consists of the BlackJack (game) class, Player class, Deck class, Card class, and a Count utility class. 

  • BlackJack class: A new instance of this is instantiated in the GUI Form_Shown event after the user has entered their name. This class contains NewGame, hit, and stick methods with Public Access, as these are the methods called from the code behind the GUI. The class also contains a Private Access play method. The hit, stick, and play methods work together, recursively prompting the user to hit or stick while the user holds a valid hand (i.e. below or equal to 21). Sticking or busting, when the user has first move passes play to the computer, which must keep hitting while its hand' sum is below 17. When both players have stuck or bust, the computer's hand is revealed. Occasionally when the computer has the first move, it can bust and the user wins by default. If the user has first move and busts, the computer wins by default.
  • Player class: The user and the computer are both represented by instances of the Player class which has name and hand Properties as well as a hasStuck Property and a getHandAsString Function that returns a textual description of the hand.
  • Deck class: This holds the List(Of Card) that represents the deck of cards. It has createDeck, shuffleDeck, and deal methods.
  • Card class: Each card in the deck is represented by an instance of this class. It has suit, facevalue, and image Properties that describe and depict the card.
  • Count class: This is a utility class that contains five Shared Functions used in scoring and determining the winning hand.


The GUI


The GUI consists of a Form containing a Label for textual output, two handViewer UserControls that display the hands pictorially, and three Buttons used in gameplay. In this game I've reused my InputDialog class which requests the user's name.

  • handViewer UserControl: This is a simple control that displays the player's name and shows their hand pictorially. There are two of these controls, one for each player.

handViewer code



Public Class handViewer
 
    Public Sub setName(name As String)
        Label1.Text = name
    End Sub
 
    Public Sub setImage(Optional hand As List(Of Card) = Nothing)
        Dim img As Bitmap = Nothing
        If Not hand Is Nothing Then
            img = New Bitmap(105 + If(hand.Count > 2, (hand.Count - 2) * 15, 0), 120)
            Dim gr As Graphics = Graphics.FromImage(img)
            Dim m As New Drawing2D.Matrix
            m.RotateAt(-20, Point.Empty)
            gr.Transform = m
            gr.DrawImage(hand(0).getImage, New Point(-8, 22))
            gr.ResetTransform()
            Dim startX As Integer = 33
            For x As Integer = 1 To hand.Count - 1
                gr.DrawImage(hand(x).getImage, New Point(startX, 17))
                startX += 15
            Next
        End If
        PictureBox1.Image = img
    End Sub
 
    Private Sub PictureBox1_Resize(sender As Object, e As EventArgs) Handles PictureBox1.Resize
        Me.Width = Math.Max(PictureBox1.Width, Label1.Width) + 6
    End Sub
 
End Class


The Form code



Public Class Form1
 
    Private WithEvents game As BlackJack
 
    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
        Dim d As New InputDialog
        'this shows a modal Dialog with a prompt, and a  title, with no DefaultResponse
        If d.ShowDialog("Enter your name", "OOP BlackJack") = DialogResult.OK Then
            Dim playerName As String = d.returnedValue
            HandViewer1.setName(playerName)
            HandViewer2.setName("Computer")
            game = New BlackJack("Computer", playerName)
            btnNewGame.PerformClick()
        Else
            Application.Exit()
        End If
    End Sub
 
    Private Sub btnNewGame_Click(sender As Object, e As EventArgs) Handles btnNewGame.Click
        HandViewer1.setImage()
        HandViewer2.setImage()
        btnHit.Enabled = True
        btnStick.Enabled = True
        btnNewGame.Enabled = False
        game.NewGame()
    End Sub
 
    Private Sub btnStick_Click(sender As Object, e As EventArgs) Handles btnStick.Click
        game.stick()
    End Sub
 
    Private Sub btnHit_Click(sender As Object, e As EventArgs) Handles btnHit.Click
        game.hit()
    End Sub
 
    Private Sub game_displayHand(hand As List(Of Card), player As Integer) Handles game.displayHand
        If player = 1 Then
            HandViewer1.setImage(hand)
        Else
            HandViewer2.setImage(hand)
        End If
    End Sub
 
    Private Sub game_displayText(text As String) Handles game.displayText
        Label1.Text &= text & Environment.NewLine & Environment.NewLine
    End Sub
 
    Private Sub game_clearText() Handles game.clearText
        Label1.Text = ""
    End Sub
 
    Private Sub game_isOver() Handles game.isOver
        btnHit.Enabled = False
        btnStick.Enabled = False
        btnNewGame.Enabled = True
    End Sub
 
    Private Sub HandViewer1_Resize(sender As Object, e As EventArgs) Handles HandViewer1.Resize
        HandViewer2.Left = HandViewer1.Right + 6
    End Sub
 
End Class




Downloads

Resources