Compare commits

...

12 Commits

8 changed files with 204 additions and 82 deletions

28
.github/workflows/dotnet.yml vendored 100644
View File

@ -0,0 +1,28 @@
# This workflow will build a .NET project
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net
name: .NET
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
jobs:
build:
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: 6.0.x
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Test
run: dotnet test --no-build --verbosity normal

View File

@ -1,45 +1,45 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<StartupObject>Sub Main</StartupObject>
<UseWindowsForms>true</UseWindowsForms>
<MyType>WindowsForms</MyType>
</PropertyGroup>
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<StartupObject>Sub Main</StartupObject>
<UseWindowsForms>true</UseWindowsForms>
<MyType>WindowsForms</MyType>
</PropertyGroup>
<ItemGroup>
<Import Include="System.Data" />
<Import Include="System.Drawing" />
<Import Include="System.Windows.Forms" />
</ItemGroup>
<ItemGroup>
<Import Include="System.Data" />
<Import Include="System.Drawing" />
<Import Include="System.Windows.Forms" />
</ItemGroup>
<ItemGroup>
<Compile Update="My Project\Application.Designer.vb">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Application.myapp</DependentUpon>
</Compile>
<Compile Update="My Project\Resources.Designer.vb">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<Compile Update="My Project\Application.Designer.vb">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Application.myapp</DependentUpon>
</Compile>
<Compile Update="My Project\Resources.Designer.vb">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="My Project\Resources.resx">
<CustomToolNamespace>My.Resources</CustomToolNamespace>
<Generator>VbMyResourcesResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.vb</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="My Project\Resources.resx">
<CustomToolNamespace>My.Resources</CustomToolNamespace>
<Generator>VbMyResourcesResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.vb</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Update="My Project\Application.myapp">
<Generator>MyApplicationCodeGenerator</Generator>
<LastGenOutput>Application.Designer.vb</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<None Update="My Project\Application.myapp">
<Generator>MyApplicationCodeGenerator</Generator>
<LastGenOutput>Application.Designer.vb</LastGenOutput>
</None>
</ItemGroup>
</Project>

View File

@ -0,0 +1,59 @@
Public Class Card
Private Shared idCounter As Integer = 1
Private id As Integer
Private boxId As PictureBox
Private cardImage As Image
Private card As (suit As String, number As String)
Private cardLocation As Point
Private cardHidden As Boolean
Private size As Size
Public Sub New(name As (String, String), Optional hidden As Boolean = False)
id = idCounter
idCounter += 1
boxId = New PictureBox()
card = name
cardHidden = hidden
cardImage = Utilities.GetCardImage(name, hidden)
size = New Size(125,175)
End Sub
Public Sub SetLocation(location As point)
cardLocation = location
End Sub
Public Sub SetName(name As (String, String))
card = name
End Sub
Public Sub SetHidden(hidden As Boolean)
cardHidden = hidden
End Sub
Public Function GetId()
Return id
End Function
Public Function GetBoxId()
Return boxId
End Function
Public Function GetName()
Return card
End Function
Public Function GetSuit() As String
Return card.suit
End Function
Public Function GetNumber() As String
Return card.number
End Function
Public Function GetLocation()
Return cardLocation
End Function
Public Function IsHidden()
Return cardHidden
End Function
End Class

View File

@ -3,11 +3,13 @@
Public Event CardDealt(card, cardNumber, hide)
Public Event SetTotalLabels(playerTotal, dealerTotal)
Public Event ShowDealerCard(card)
Public Event EndPlayerTurn()
Public Event EndGame(winMessage)
Public Event MessageLabel(message)
Private player As Player
Private dealer As Dealer
Private deck As List(Of Tuple(Of String, String))
Private deck As List(Of (String, String))
Private WithEvents dealerDelay As Timer
Public Sub Start()
@ -30,8 +32,9 @@
End Sub
Sub DealCard(playerDealt As Object, Optional hide As Boolean = False)
Dim card As Tuple(Of String, String) = deck(0)
playerDealt.hand.Add(card)
Dim card As (String, String) = deck(0)
Dim playingCard = New Card(card, hide)
playerDealt.hand.Add(playingCard)
deck.RemoveAt(0)
GetTotal(playerDealt, hide)
If hide Then
@ -40,12 +43,12 @@
Dim cardNumber As String =
If(TypeOf playerDealt Is Dealer, (playerDealt.hand.Count + 5).ToString(), playerDealt.hand.Count)
RaiseEvent CardDealt(card, cardNumber, hide)
RaiseEvent CardDealt(playingCard, cardNumber, hide)
RaiseEvent SetTotalLabels(player.total, dealer.total)
End Sub
Sub GetTotal(playerToCheck As Object, Optional hide As Boolean = False)
Dim cards As List(Of Tuple(Of String, String)) = playerToCheck.hand
Dim cards As List(Of Card) = playerToCheck.hand
If cards.Count = 0 Then
playerToCheck.total = 0
Return
@ -53,7 +56,7 @@
Dim total = 0
Dim aceTotal = 0
For Each card In cards
Dim num As String = card.Item2
Dim num As String = card.GetNumber()
If num = "K" Or num = "Q" Or num = "J" Then
num = 10
End If
@ -107,6 +110,8 @@
Sub DealerTurn()
GetTotal(dealer)
RaiseEvent MessageLabel("Dealer's turn...")
RaiseEvent EndPlayerTurn()
RaiseEvent SetTotalLabels(player.total, dealer.total)
RaiseEvent ShowDealerCard(dealer.hidden)
If player.winType = WinCondition.Bust Then
@ -184,13 +189,13 @@
End Select
End Function
Shared Function CreateDeck() As List(Of Tuple(Of String, String))
Dim response As New List(Of Tuple(Of String, String))
Shared Function CreateDeck() As List(Of (String,String))
Dim response As New List(Of (String, String))
Dim nums As String() = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"}
Dim suits As String() = {"Hearts", "Diamonds", "Spades", "Clubs"}
For Each suit As String In suits
For Each num As String In nums
response.Add(Tuple.Create(suit, num))
response.Add((suit, num))
Next
Next
Return Utilities.Shuffle(response)

View File

@ -38,6 +38,7 @@ Partial Class GameWindow
PlayerTotal = New Label()
DealerTotal = New Label()
WinMessage = New Label()
deckPictureBox = New PictureBox()
CType(PlayerCard1, ComponentModel.ISupportInitialize).BeginInit()
CType(PlayerCard2, ComponentModel.ISupportInitialize).BeginInit()
CType(PlayerCard3, ComponentModel.ISupportInitialize).BeginInit()
@ -48,11 +49,12 @@ Partial Class GameWindow
CType(PlayerCard8, ComponentModel.ISupportInitialize).BeginInit()
CType(PlayerCard9, ComponentModel.ISupportInitialize).BeginInit()
CType(PlayerCard10, ComponentModel.ISupportInitialize).BeginInit()
CType(deckPictureBox, ComponentModel.ISupportInitialize).BeginInit()
SuspendLayout()
'
' HitButton
'
HitButton.Anchor = AnchorStyles.Top Or AnchorStyles.Right
HitButton.Anchor = AnchorStyles.Bottom Or AnchorStyles.Left
HitButton.Enabled = False
HitButton.Font = New Font("Segoe UI", 36.0F, FontStyle.Regular, GraphicsUnit.Point)
HitButton.Location = New Point(100, 490)
@ -64,7 +66,7 @@ Partial Class GameWindow
'
' StandButton
'
StandButton.Anchor = AnchorStyles.Top Or AnchorStyles.Right
StandButton.Anchor = AnchorStyles.Bottom Or AnchorStyles.Right
StandButton.Enabled = False
StandButton.Font = New Font("Segoe UI", 36.0F, FontStyle.Regular, GraphicsUnit.Point)
StandButton.Location = New Point(780, 490)
@ -76,11 +78,11 @@ Partial Class GameWindow
'
' PlayerCard1
'
PlayerCard1.Anchor = AnchorStyles.Top Or AnchorStyles.Right
PlayerCard1.Anchor = AnchorStyles.Bottom Or AnchorStyles.Left
PlayerCard1.ErrorImage = My.Resources.Resources.blue2
PlayerCard1.Image = My.Resources.Resources.blue
PlayerCard1.InitialImage = My.Resources.Resources.blue2
PlayerCard1.Location = New Point(150, 284)
PlayerCard1.Location = New Point(150, 303)
PlayerCard1.Name = "PlayerCard1"
PlayerCard1.Size = New Size(125, 175)
PlayerCard1.TabIndex = 2
@ -88,11 +90,11 @@ Partial Class GameWindow
'
' PlayerCard2
'
PlayerCard2.Anchor = AnchorStyles.Top Or AnchorStyles.Right
PlayerCard2.Anchor = AnchorStyles.Bottom Or AnchorStyles.Left
PlayerCard2.ErrorImage = My.Resources.Resources.blue2
PlayerCard2.Image = My.Resources.Resources.blue
PlayerCard2.InitialImage = My.Resources.Resources.blue2
PlayerCard2.Location = New Point(375, 284)
PlayerCard2.Location = New Point(364, 303)
PlayerCard2.Name = "PlayerCard2"
PlayerCard2.Size = New Size(125, 175)
PlayerCard2.TabIndex = 3
@ -100,10 +102,10 @@ Partial Class GameWindow
'
' PlayerCard3
'
PlayerCard3.Anchor = AnchorStyles.Top Or AnchorStyles.Right
PlayerCard3.Anchor = AnchorStyles.Bottom
PlayerCard3.ErrorImage = Nothing
PlayerCard3.InitialImage = Nothing
PlayerCard3.Location = New Point(578, 284)
PlayerCard3.Location = New Point(578, 303)
PlayerCard3.Name = "PlayerCard3"
PlayerCard3.Size = New Size(125, 175)
PlayerCard3.TabIndex = 4
@ -111,10 +113,10 @@ Partial Class GameWindow
'
' PlayerCard4
'
PlayerCard4.Anchor = AnchorStyles.Top Or AnchorStyles.Right
PlayerCard4.Anchor = AnchorStyles.Bottom Or AnchorStyles.Right
PlayerCard4.ErrorImage = Nothing
PlayerCard4.InitialImage = Nothing
PlayerCard4.Location = New Point(780, 284)
PlayerCard4.Location = New Point(792, 303)
PlayerCard4.Name = "PlayerCard4"
PlayerCard4.Size = New Size(125, 175)
PlayerCard4.TabIndex = 5
@ -122,10 +124,10 @@ Partial Class GameWindow
'
' PlayerCard5
'
PlayerCard5.Anchor = AnchorStyles.Top Or AnchorStyles.Right
PlayerCard5.Anchor = AnchorStyles.Bottom Or AnchorStyles.Right
PlayerCard5.ErrorImage = Nothing
PlayerCard5.InitialImage = Nothing
PlayerCard5.Location = New Point(1005, 284)
PlayerCard5.Location = New Point(1005, 303)
PlayerCard5.Name = "PlayerCard5"
PlayerCard5.Size = New Size(125, 175)
PlayerCard5.TabIndex = 6
@ -151,7 +153,7 @@ Partial Class GameWindow
PlayerCard7.ErrorImage = My.Resources.Resources.blue2
PlayerCard7.Image = My.Resources.Resources.blue
PlayerCard7.InitialImage = My.Resources.Resources.blue2
PlayerCard7.Location = New Point(780, 12)
PlayerCard7.Location = New Point(792, 12)
PlayerCard7.Name = "PlayerCard7"
PlayerCard7.Size = New Size(125, 175)
PlayerCard7.TabIndex = 10
@ -159,7 +161,7 @@ Partial Class GameWindow
'
' PlayerCard8
'
PlayerCard8.Anchor = AnchorStyles.Top Or AnchorStyles.Right
PlayerCard8.Anchor = AnchorStyles.Top
PlayerCard8.ErrorImage = Nothing
PlayerCard8.InitialImage = Nothing
PlayerCard8.Location = New Point(578, 12)
@ -170,10 +172,9 @@ Partial Class GameWindow
'
' PlayerCard9
'
PlayerCard9.Anchor = AnchorStyles.Top Or AnchorStyles.Right
PlayerCard9.ErrorImage = Nothing
PlayerCard9.InitialImage = Nothing
PlayerCard9.Location = New Point(375, 12)
PlayerCard9.Location = New Point(364, 12)
PlayerCard9.Name = "PlayerCard9"
PlayerCard9.Size = New Size(125, 175)
PlayerCard9.TabIndex = 8
@ -181,7 +182,6 @@ Partial Class GameWindow
'
' PlayerCard10
'
PlayerCard10.Anchor = AnchorStyles.Top Or AnchorStyles.Right
PlayerCard10.ErrorImage = Nothing
PlayerCard10.InitialImage = Nothing
PlayerCard10.Location = New Point(150, 12)
@ -192,7 +192,7 @@ Partial Class GameWindow
'
' StartGame
'
StartGame.Anchor = AnchorStyles.Top Or AnchorStyles.Right
StartGame.Anchor = AnchorStyles.Bottom
StartGame.Font = New Font("Segoe UI", 26.25F, FontStyle.Regular, GraphicsUnit.Point)
StartGame.Location = New Point(535, 490)
StartGame.Name = "StartGame"
@ -203,6 +203,7 @@ Partial Class GameWindow
'
' PlayerTotal
'
PlayerTotal.Anchor = AnchorStyles.Bottom
PlayerTotal.AutoSize = True
PlayerTotal.Font = New Font("Segoe UI", 15.75F, FontStyle.Regular, GraphicsUnit.Point)
PlayerTotal.Location = New Point(535, 561)
@ -213,6 +214,7 @@ Partial Class GameWindow
'
' DealerTotal
'
DealerTotal.Anchor = AnchorStyles.Bottom
DealerTotal.AutoSize = True
DealerTotal.Font = New Font("Segoe UI", 15.75F, FontStyle.Regular, GraphicsUnit.Point)
DealerTotal.Location = New Point(535, 610)
@ -230,10 +232,25 @@ Partial Class GameWindow
WinMessage.Size = New Size(0, 30)
WinMessage.TabIndex = 15
'
' deckPictureBox
'
deckPictureBox.Anchor = AnchorStyles.Top Or AnchorStyles.Right
deckPictureBox.BackgroundImageLayout = ImageLayout.None
deckPictureBox.ErrorImage = My.Resources.Resources.blue2
deckPictureBox.Image = My.Resources.Resources.blue
deckPictureBox.InitialImage = My.Resources.Resources.blue2
deckPictureBox.Location = New Point(1136, 156)
deckPictureBox.Name = "deckPictureBox"
deckPictureBox.Size = New Size(125, 175)
deckPictureBox.SizeMode = PictureBoxSizeMode.Zoom
deckPictureBox.TabIndex = 16
deckPictureBox.TabStop = False
'
' GameWindow
'
AutoScaleMode = AutoScaleMode.Inherit
ClientSize = New Size(1264, 681)
Controls.Add(deckPictureBox)
Controls.Add(WinMessage)
Controls.Add(DealerTotal)
Controls.Add(PlayerTotal)
@ -264,6 +281,7 @@ Partial Class GameWindow
CType(PlayerCard8, ComponentModel.ISupportInitialize).EndInit()
CType(PlayerCard9, ComponentModel.ISupportInitialize).EndInit()
CType(PlayerCard10, ComponentModel.ISupportInitialize).EndInit()
CType(deckPictureBox, ComponentModel.ISupportInitialize).EndInit()
ResumeLayout(False)
PerformLayout()
End Sub
@ -284,4 +302,5 @@ Partial Class GameWindow
Friend WithEvents PlayerTotal As Label
Friend WithEvents DealerTotal As Label
Friend WithEvents WinMessage As Label
Friend WithEvents deckPictureBox As PictureBox
End Class

View File

@ -27,20 +27,15 @@
StartGame.Enabled = False
End Sub
Private Sub OnCardDealt(card As Tuple(Of String, String), cardNumber As String, hide As Boolean) _
Private Sub OnCardDealt(card As Card, cardNumber As String, hide As Boolean) _
Handles game.CardDealt
Dim pictureBox As PictureBox
Debug.Print(cardNumber)
Try
pictureBox = CType(Me.Controls.Find("PlayerCard" + cardNumber, True).First(), PictureBox)
If hide Then
pictureBox.Image = My.Resources.blue
Else
pictureBox.Image = Utilities.GetCardImage(card)
End If
Catch ex As Exception
EndGame("Error: " + ex.Message)
End Try
pictureBox = CType(Me.Controls.Find("PlayerCard" + cardNumber, True).First(), PictureBox)
If hide Then
pictureBox.Image = My.Resources.blue
Else
pictureBox.Image = Utilities.GetCardImage((card.GetSuit(), card.GetNumber()))
End If
End Sub
Private Sub SetTotalLabels(playerTotalAmount, dealerTotalAmount) Handles game.SetTotalLabels
@ -54,10 +49,19 @@
PlayerCard7.Image = Utilities.GetCardImage(card)
End Sub
Private Sub EndPlayerTurn() Handles game.EndPlayerTurn
HitButton.Enabled = False
StandButton.Enabled = False
End Sub
Private Sub MessageLabel(message) Handles game.MessageLabel
WinMessage.Text = message
End Sub
Private Sub EndGame(message) Handles game.EndGame
WinMessage.Text = message
HitButton.Enabled = False
StandButton.Enabled = False
StartGame.Enabled = True
End Sub
End Class
End Class

View File

@ -1,10 +1,10 @@
Public Class Player
Public Property hand As New List(Of Tuple(Of String, String))
Public Property hand As New List(Of Card)
Public Property total As Integer
Public Property ingame As Boolean
Public Property winType As WinCondition
Sub Start()
Public Sub Start()
hand.Clear()
total = 0
ingame = True
@ -16,6 +16,6 @@ Public Class Dealer
Inherits Player
Public Property limit As Integer = 17
Public Property hidden As Tuple(Of String, String)
Public Property hidden As (String, String)
Public Property trueTotal As Integer
End Class

View File

@ -11,7 +11,10 @@
Return list
End Function
Public Shared Function GetCardImage(card As Tuple(Of String, String)) As Image
Public Shared Function GetCardImage(card As (String, String), Optional hidden As Boolean = False) As Image
If hidden Then
Return My.Resources.blue
End If
Dim suit As String = card.Item1
Dim num As String = card.Item2
Select Case num
@ -26,6 +29,10 @@
End Select
Dim img As String = suit + "_" + num
Return My.Resources.ResourceManager.GetObject(img.ToLower())
Try
Return My.Resources.ResourceManager.GetObject(img.ToLower())
Catch
Return My.Resources.blue
End Try
End Function
End Class