diff --git a/01_Acey_Ducey/vbnet/AceyDucy.sln b/01_Acey_Ducey/vbnet/AceyDucy.sln new file mode 100644 index 00000000..881d7c9c --- /dev/null +++ b/01_Acey_Ducey/vbnet/AceyDucy.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "AceyDucy", "AceyDucy\AceyDucy.vbproj", "{37496710-B458-4502-ADCB-4C57203866F9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {37496710-B458-4502-ADCB-4C57203866F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {37496710-B458-4502-ADCB-4C57203866F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {37496710-B458-4502-ADCB-4C57203866F9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {37496710-B458-4502-ADCB-4C57203866F9}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C01D9DAE-644C-455F-8365-E14E49074BC3} + EndGlobalSection +EndGlobal diff --git a/01_Acey_Ducey/vbnet/AceyDucy/AceyDucy.vbproj b/01_Acey_Ducey/vbnet/AceyDucy/AceyDucy.vbproj new file mode 100644 index 00000000..98a07001 --- /dev/null +++ b/01_Acey_Ducey/vbnet/AceyDucy/AceyDucy.vbproj @@ -0,0 +1,9 @@ + + + + Exe + AceyDucy + net6.0 + + + diff --git a/01_Acey_Ducey/vbnet/AceyDucy/Program.vb b/01_Acey_Ducey/vbnet/AceyDucy/Program.vb new file mode 100644 index 00000000..bfa518ca --- /dev/null +++ b/01_Acey_Ducey/vbnet/AceyDucy/Program.vb @@ -0,0 +1,178 @@ +Imports System + +''' +''' This is a modern adapation of Acey Ducey from BASIC Computer Games. +''' +''' The structural changes primarily consist of replacing the many GOTOs with +''' Do/Loop constructs to force the continual execution of the program. +''' +''' Because modern Basic allows multi-line If/Then blocks, many GOTO jumps were +''' able to be eliminated and the logic was able to be moved to more relevant areas, +''' For example, the increment/decrement of the player's balance could be in the same +''' area as the notification of win/loss. +''' +''' Some modern improvements were added, primarily the inclusion of a function, which +''' eliminated a thrice-repeated block of logic to display the card value. The archaic +''' RND function is greatly simplified with the .NET Framework's Random class. +''' +''' Elementary comments are provided for non-programmers or novices. +''' +Module Program + Sub Main(args As String()) + ' These are the variables that will hold values during the program's execution + Dim input As String + Dim rnd As New Random ' You can create a new instance of an object during declaration + Dim currentBalance As Integer = 100 ' You can set a initial value at declaration + Dim currentWager As Integer + Dim cardA, cardB, cardC As Integer ' You can specify multiple variables of the same type in one declaration statement + + ' Display the opening title and instructions + ' Use a preceding $ to insert calculated values within the string using {} + Console.WriteLine($"{Space((Console.WindowWidth \ 2) - 10)}ACEY DUCEY CARD GAME") + Console.WriteLine($"{Space((Console.WindowWidth \ 2) - 21)}CREATIVE COMPUTING MORRISTOWN, NEW JERSEY") + Console.WriteLine("") + Console.WriteLine("") + Console.WriteLine("ACEY-DUCEY IS PLAYED IN THE FOLLOWING MANNER") + Console.WriteLine("THE DEALER (COMPUTER) DEALS TWO CARDS FACE UP") + Console.WriteLine("YOU HAVE AN OPTION TO BET OR NOT BET DEPENDING") + Console.WriteLine("ON WHETHER OR NOT YOU FEEL THE CARD WILL HAVE") + Console.WriteLine("A VALUE BETWEEN THE FIRST TWO.") + Console.WriteLine("IF YOU DO NOT WANT TO BET, INPUT A 0") + + Do ' This loop continues as long as the player wants to keep playing + + Do ' This loop continues as long as the player has money to play + + Console.WriteLine("") + Console.WriteLine($"YOU NOW HAVE {currentBalance} DOLLARS.") + Console.WriteLine("") + + Console.WriteLine("HERE ARE YOUR NEXT TWO CARDS:") + + ' We need to ensure that card B is a higher value for our later comparison, + ' so we will loop until we have two cards that meet this criteria + Do + cardA = rnd.Next(2, 14) + cardB = rnd.Next(2, 14) + + Loop While cardA > cardB + + ' We use a function to display the text value of the numeric card value + ' because we do this 3 times and a function reduces repetition of code + Console.WriteLine(DisplayCard(cardA)) + Console.WriteLine(DisplayCard(cardB)) + + Do ' This loop continues until the player provides a valid wager value + Console.WriteLine("") + Console.WriteLine("WHAT IS YOUR BET") + + currentWager = 0 + input = Console.ReadLine + + ' Any input from the console is a string, but we require a number. + ' Test the input to make sure it is a numeric value. + If Integer.TryParse(input, currentWager) Then + ' Test to ensure the player has not wagered more than their balance + If currentWager > currentBalance Then + Console.WriteLine("SORRY, MY FRIEND, BUT YOU BET TOO MUCH.") + Console.WriteLine($"YOU HAVE ONLY {currentBalance} DOLLARS TO BET.") + + Else + ' The player has provided a numeric value that is less/equal to their balance, + ' exit the loop and continue play + Exit Do + + End If ' check player balance + + End If ' check numeric input + + Loop ' wager loop + + ' If the player is wagering, draw the third card, otherwise, mock them. + If currentWager > 0 Then + cardC = rnd.Next(2, 14) + + Console.WriteLine(DisplayCard(cardC)) + + ' The effort we made to have two cards in numeric order earlier makes this check easier, + ' otherwise we would have to have a second check in the opposite direction + If cardC < cardA OrElse cardC >= cardB Then + Console.WriteLine("SORRY, YOU LOSE") + currentBalance -= currentWager ' Shorthand code to decrement a number (currentBalance=currentBalance - currentWager) + + Else + Console.WriteLine("YOU WIN!!!") + currentBalance += currentWager ' Shorthand code to increment a number (currentBalance=currentBalance + currentWager) + + End If + + Else + Console.WriteLine("CHICKEN!!") + Console.WriteLine("") + + End If + + Loop While currentBalance > 0 ' loop as long as the player has money + + ' At this point, the player has no money (currentBalance=0). Inform them of such. + Console.WriteLine("") + Console.WriteLine("SORRY, FRIEND, BUT YOU BLEW YOUR WAD.") + Console.WriteLine("") + Console.WriteLine("") + + ' We will loop to ensure the player provides some answer. + Do + Console.WriteLine("TRY AGAIN (YES OR NO)") + Console.WriteLine("") + + input = Console.ReadLine + + Loop While String.IsNullOrWhiteSpace(input) + + ' We will assume that the player wants to play again only if they answer yes. + ' (yeah and ya are valid as well, because we only check the first letter) + If input.Substring(0, 1).Equals("y", StringComparison.CurrentCultureIgnoreCase) Then ' This allows upper and lower case to be entered. + currentBalance = 100 ' Reset the players balance before restarting + + Else + ' Exit the outer loop which will end the game. + Exit Do + + End If + + Loop ' The full game loop + + Console.WriteLine("O.K., HOPE YOU HAD FUN!") + + End Sub + + ' This function is called for each of the 3 cards used in the game. + ' The input and the output are both consistent, making it a good candidate for a function. + Private Function DisplayCard(value As Integer) As String + ' We check the value of the input and run a block of code for whichever + ' evaluation matches + Select Case value + Case 2 To 10 ' Case statements can be ranges of values, also multiple values (Case 2,3,4,5,6,7,8,9,10) + Return value.ToString + + Case 11 + Return "JACK" + + Case 12 + Return "QUEEN" + + Case 13 + Return "KING" + + Case 14 + Return "ACE" + + End Select + + ' Although we have full knowledge of the program and never plan to send an invalid + ' card value, it's important to provide a message for the next developer who won't + Throw New ArgumentOutOfRangeException("Card value must be between 2 and 14") + + End Function + +End Module