mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2026-06-22 14:51:43 -07:00
Merge pull request #751 from MacroScenery/main
93_23_Matches C# Rewrite
This commit is contained in:
@@ -0,0 +1,167 @@
|
||||
using System;
|
||||
|
||||
namespace Program
|
||||
{
|
||||
class Program
|
||||
{
|
||||
|
||||
// Initialize 3 public variables so that they can be ascessed anywhere in the code
|
||||
public static int numberOfMatches;
|
||||
public static int numberOfMatchesRemovedByPlayer;
|
||||
public static bool playerGoesFirst = false; // a flag to show if the player won the coin toss
|
||||
static void Main(string[] args)
|
||||
{
|
||||
// Print introduction text
|
||||
|
||||
// Prints the title with 31 spaces placed in front of the text using the PadLeft() string function
|
||||
Console.WriteLine("23 MATCHES".PadLeft(31));
|
||||
Console.WriteLine("CREATIVE COMPUTING MORRISTOWN, NEW JERSEY".PadLeft(15));
|
||||
|
||||
// Print 3 blank lines with \n escape sequence
|
||||
Console.Write("\n\n\n");
|
||||
Console.WriteLine(" THIS IS A GAME CALLED '23 MATCHES'.");
|
||||
Console.Write("\n");
|
||||
|
||||
Console.WriteLine("WHEN IT IS YOUR TURN, YOU MAY TAKE ONE, TWO, OR THREE");
|
||||
Console.WriteLine("MATCHES. THE OBJECT OF THE GAME IS NOT TO HAVE TO TAKE");
|
||||
Console.WriteLine("THE LAST MATCH.");
|
||||
Console.Write("\n");
|
||||
Console.WriteLine("LET'S FLIP A COIN TO SEE WHO GOES FIRST.");
|
||||
Console.WriteLine("IF IT COMES UP HEADS, I WILL WIN THE TOSS.");
|
||||
Console.Write("\n");
|
||||
|
||||
// Set the number of matches to 23
|
||||
numberOfMatches = 23;
|
||||
|
||||
// Create a random class object to generate the coin toss
|
||||
Random random = new Random();
|
||||
// Generates a random number between 0.0 and 1.0
|
||||
// Multiplies that number by 2 and then
|
||||
// Converts it into an integer giving either a 0 or a 1
|
||||
int coinTossResult = (int)(2 * random.NextDouble());
|
||||
|
||||
if (coinTossResult == 1)
|
||||
{
|
||||
Console.WriteLine("TAILS! YOU GO FIRST. ");
|
||||
// Sets the player coin toss flag to true
|
||||
playerGoesFirst = true;
|
||||
PlayerTurn();
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("HEADS! I WIN! HA! HA!");
|
||||
Console.WriteLine("PREPARE TO LOSE, MEATBALL-NOSE!!");
|
||||
Console.Write("\n");
|
||||
Console.WriteLine("I TAKE 2 MATCHES");
|
||||
numberOfMatches = numberOfMatches - 2;
|
||||
}
|
||||
|
||||
// loops the code until there is 1 or fewer matches
|
||||
do
|
||||
{
|
||||
// Checks if the player has already gone
|
||||
// because they won the coin toss
|
||||
// if they have not then the player can go
|
||||
if (playerGoesFirst == false)
|
||||
{
|
||||
Console.Write("THE NUMBER OF MATCHES IS NOW " + numberOfMatches);
|
||||
PlayerTurn();
|
||||
}
|
||||
// sets the coint toss flag to false since
|
||||
// this is only needed on the first loop of the code
|
||||
playerGoesFirst = false;
|
||||
ComputerTurn();
|
||||
} while (numberOfMatches > 1);
|
||||
|
||||
}
|
||||
|
||||
static void PlayerTurn()
|
||||
{
|
||||
Console.WriteLine("\n");
|
||||
Console.WriteLine("YOUR TURN -- YOU MAY TAKE 1, 2, OR 3 MATCHES.");
|
||||
Console.Write("HOW MANY DO YOU WISH TO REMOVE ?? ");
|
||||
// Get player input
|
||||
numberOfMatchesRemovedByPlayer = ReadPlayerInput();
|
||||
// If the input is invalid (not 1, 2, or 3)
|
||||
// then ask the player to input again
|
||||
while (numberOfMatchesRemovedByPlayer > 3 || numberOfMatchesRemovedByPlayer <= 0)
|
||||
{
|
||||
Console.WriteLine("VERY FUNNY! DUMMY!");
|
||||
Console.WriteLine("DO YOU WANT TO PLAY OR GOOF AROUND?");
|
||||
Console.Write("NOW, HOW MANY MATCHES DO YOU WANT ?? ");
|
||||
numberOfMatchesRemovedByPlayer = ReadPlayerInput();
|
||||
}
|
||||
|
||||
// Remove the player specified number of matches
|
||||
numberOfMatches = numberOfMatches - numberOfMatchesRemovedByPlayer;
|
||||
|
||||
Console.WriteLine("THE ARE NOW " + numberOfMatches + " MATCHES REMAINING");
|
||||
}
|
||||
static void ComputerTurn()
|
||||
{
|
||||
// Initialize the numberOfMatchesRemovedByComputer
|
||||
int numberOfMatchesRemovedByComputer = 0;
|
||||
switch (numberOfMatches)
|
||||
{
|
||||
case 4:
|
||||
numberOfMatchesRemovedByComputer = 3;
|
||||
break;
|
||||
case 3:
|
||||
numberOfMatchesRemovedByComputer = 2;
|
||||
break;
|
||||
case 2:
|
||||
numberOfMatchesRemovedByComputer = 1;
|
||||
break;
|
||||
case 1: case 0: // If the computer losses call this case
|
||||
Console.WriteLine("YOU WON, FLOPPY EARS !");
|
||||
Console.WriteLine("THING YOU'RE PRETTY SMART !");
|
||||
Console.WriteLine("LETS PLAY AGAIN AND I'LL BLOW YOUR SHOES OFF !!");
|
||||
break;
|
||||
default: // If there are > than 4 matches call this case
|
||||
numberOfMatchesRemovedByComputer = 4 - numberOfMatchesRemovedByPlayer;
|
||||
break;
|
||||
}
|
||||
// If the numberOfMatchesRemovedByComputer has been updated run this code,
|
||||
// if not them the computer has lost
|
||||
if (numberOfMatchesRemovedByComputer != 0)
|
||||
{
|
||||
Console.WriteLine("MY TURN ! I REMOVE " + numberOfMatchesRemovedByComputer + " MATCHES");
|
||||
numberOfMatches = numberOfMatches - numberOfMatchesRemovedByComputer;
|
||||
// If there are less than or equal to 1 matches
|
||||
// then the player has lost
|
||||
if (numberOfMatches <= 1)
|
||||
{
|
||||
Console.Write("\n");
|
||||
Console.WriteLine("YOU POOR BOOB! YOU TOOK THE LAST MATCH! I GOTCHA!!");
|
||||
Console.WriteLine("HA ! HA ! I BEAT YOU !!!");
|
||||
Console.Write("\n");
|
||||
Console.WriteLine("GOOD BYE LOSER!");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// This method handles the player input
|
||||
// and will handle inncorrect input
|
||||
static int ReadPlayerInput()
|
||||
{
|
||||
// Read user input and convert to integer
|
||||
int playerInput = 0;
|
||||
// Try to read player input
|
||||
try
|
||||
{
|
||||
playerInput = Convert.ToInt32(Console.ReadLine());
|
||||
}
|
||||
// If there is an error in the player input
|
||||
catch (System.Exception)
|
||||
{
|
||||
Console.WriteLine("?REENTER");
|
||||
Console.Write("?? ");
|
||||
// Ask the player to reenter their input
|
||||
playerInput = ReadPlayerInput();
|
||||
}
|
||||
return playerInput;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||
<RootNamespace>_23matches</RootNamespace>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
@@ -1,25 +0,0 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.32002.261
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "23matches", "23matches.csproj", "{9DBE7354-0749-4750-9224-5F9F95C64905}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{9DBE7354-0749-4750-9224-5F9F95C64905}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{9DBE7354-0749-4750-9224-5F9F95C64905}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{9DBE7354-0749-4750-9224-5F9F95C64905}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{9DBE7354-0749-4750-9224-5F9F95C64905}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {0A87AE2F-68AC-4354-9C8D-578209D41174}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -1,129 +0,0 @@
|
||||
using System;
|
||||
using System.Threading;
|
||||
|
||||
namespace _23matches
|
||||
{
|
||||
class Program
|
||||
{
|
||||
/// <summary>
|
||||
/// Mimics the "goto" version of the original program
|
||||
/// </summary>
|
||||
/// <param name="args"></param>
|
||||
static void Main(string[] args)
|
||||
{
|
||||
Random random = new Random();
|
||||
StartNewGame:
|
||||
Console.WriteLine("23 MATCHES".PadLeft(31));
|
||||
Console.WriteLine("CREATIVE COMPUTING MORRISTOWN, NEW JERSEY".PadLeft(15));
|
||||
Console.WriteLine();
|
||||
Console.WriteLine();
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("THIS IS A GAME CALLED '23 MATCHES'.");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("WHEN IT IS YOUR TURN, YOU MAY TAKE ONE, TWO, OR THREE");
|
||||
Console.WriteLine("MATCHES. THE OBJECT OF THE GAME IS NOT TO HAVE TO TAKE");
|
||||
Console.WriteLine("THE LAST MATCH.");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("Input exit to close the program.");
|
||||
Console.WriteLine("Input cls Screen Clear.");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("LET'S FLIP A COIN TO SEE WHO GOES FIRST.");
|
||||
Console.WriteLine("IF IT COMES UP HEADS, I WILL WIN THE TOSS.");
|
||||
Console.WriteLine();
|
||||
StartTheGame:
|
||||
string command;
|
||||
int N = 23;
|
||||
int K = 0;
|
||||
int Q = random.Next(2);
|
||||
if (Q == 1)
|
||||
goto ComputerFirst;
|
||||
else
|
||||
goto PlayerFirst;
|
||||
|
||||
ComputerFirst:
|
||||
Console.WriteLine("HEADS! I WIN! HA! HA!");
|
||||
Console.WriteLine("PREPARE TO LOSE, MEATBALL-NOSE!!");
|
||||
Console.WriteLine();
|
||||
int ain = random.Next(1, 3);
|
||||
Console.WriteLine($"I TAKE {ain} MATCHES");
|
||||
N = N - ain;
|
||||
goto PlayersProceed;
|
||||
|
||||
PlayerFirst:
|
||||
Console.WriteLine("TAILS! YOU GO FIRST. ");
|
||||
Console.WriteLine();
|
||||
goto PlayersSpeak;
|
||||
|
||||
PlayersProceed:
|
||||
Console.WriteLine($"THE NUMBER OF MATCHES IS NOW {N}");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("YOUR TURN -- YOU MAY TAKE 1, 2 OR 3 MATCHES.");
|
||||
Console.WriteLine("HOW MANY DO YOU WISH TO REMOVE ");
|
||||
goto PlayersSpeak;
|
||||
|
||||
PlayersSpeak:
|
||||
command = Console.ReadLine().ToLower();
|
||||
if (command.Equals("exit"))
|
||||
{
|
||||
System.Diagnostics.Process tt = System.Diagnostics.Process.GetProcessById(System.Diagnostics.Process.GetCurrentProcess().Id);
|
||||
tt.Kill();
|
||||
}
|
||||
if (command.Equals("cls"))
|
||||
{
|
||||
Console.Clear();
|
||||
goto PlayersProceed;
|
||||
}
|
||||
try
|
||||
{
|
||||
K = Convert.ToInt32(command);
|
||||
}
|
||||
catch (System.Exception)
|
||||
{
|
||||
goto PlayerInputError;
|
||||
}
|
||||
if (K > 3 || K <= 0)
|
||||
goto PlayerInputError;
|
||||
N = N - K;
|
||||
Console.WriteLine($"THERE ARE NOW {N} MATCHES REMAINING.");
|
||||
if (N == 4 || N == 3 || N == 2)
|
||||
goto TheComputerSpeaks;
|
||||
else if (N <= 1)
|
||||
goto ThePlayerWins;
|
||||
else
|
||||
goto TheComputerSpeaks;
|
||||
|
||||
TheComputerSpeaks:
|
||||
int Z = 4 - K;
|
||||
Console.WriteLine($"MY TURN ! I REMOVE {Z} MATCHES");
|
||||
N = N - Z;
|
||||
if (N <= 1)
|
||||
goto TheComputerWins;
|
||||
else
|
||||
goto PlayersProceed;
|
||||
|
||||
PlayerInputError:
|
||||
Console.WriteLine("VERY FUNNY! DUMMY!");
|
||||
Console.WriteLine("DO YOU WANT TO PLAY OR GOOF AROUND?");
|
||||
Console.WriteLine("NOW, HOW MANY MATCHES DO YOU WANT ");
|
||||
goto PlayersSpeak;
|
||||
ThePlayerWins:
|
||||
Console.WriteLine("YOU WON, FLOPPY EARS !");
|
||||
Console.WriteLine("THINK YOU'RE PRETTY SMART !");
|
||||
Console.WriteLine("LETS PLAY AGAIN AND I'LL BLOW YOUR SHOES OFF !!");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine();
|
||||
goto StartTheGame;
|
||||
TheComputerWins:
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("YOU POOR BOOB! YOU TOOK THE LAST MATCH! I GOTCHA!!");
|
||||
Console.WriteLine("HA ! HA ! I BEAT YOU !!!");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("GOOD BYE LOSER!");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine();
|
||||
goto StartNewGame;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,161 +0,0 @@
|
||||
using System;
|
||||
using System.Threading;
|
||||
|
||||
namespace _23matches
|
||||
{
|
||||
class ObjectOrientedVersion_Program
|
||||
{
|
||||
/// <summary>
|
||||
/// Object-oriented version
|
||||
/// </summary>
|
||||
/// <param name="args"></param>
|
||||
static void Main_Two(string[] args)
|
||||
{
|
||||
Game game = new Game();
|
||||
game.GameRun();
|
||||
}
|
||||
}
|
||||
public class Game
|
||||
{
|
||||
string command;
|
||||
int N;
|
||||
int K;
|
||||
Random random = new Random();
|
||||
public void GameRun()
|
||||
{
|
||||
StartNewGame();
|
||||
StartTheGame();
|
||||
}
|
||||
void StartNewGame()
|
||||
{
|
||||
Console.WriteLine("23 MATCHES".PadLeft(31));
|
||||
Console.WriteLine("CREATIVE COMPUTING MORRISTOWN, NEW JERSEY".PadLeft(15));
|
||||
Console.WriteLine();
|
||||
Console.WriteLine();
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("THIS IS A GAME CALLED '23 MATCHES'.");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("WHEN IT IS YOUR TURN, YOU MAY TAKE ONE, TWO, OR THREE");
|
||||
Console.WriteLine("MATCHES. THE OBJECT OF THE GAME IS NOT TO HAVE TO TAKE");
|
||||
Console.WriteLine("THE LAST MATCH.");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("Input exit to close the program.");
|
||||
Console.WriteLine("Input cls Screen Clear.");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("LET'S FLIP A COIN TO SEE WHO GOES FIRST.");
|
||||
Console.WriteLine("IF IT COMES UP HEADS, I WILL WIN THE TOSS.");
|
||||
Console.WriteLine();
|
||||
}
|
||||
void StartTheGame()
|
||||
{
|
||||
N = 23;
|
||||
K = 0;
|
||||
int Q = random.Next(2);
|
||||
if (Q == 1)
|
||||
ComputerFirst();
|
||||
else
|
||||
{
|
||||
PlayerFirst();
|
||||
}
|
||||
}
|
||||
void ComputerFirst()
|
||||
{//210
|
||||
Console.WriteLine("HEADS! I WIN! HA! HA!");
|
||||
Console.WriteLine("PREPARE TO LOSE, MEATBALL-NOSE!!");
|
||||
Console.WriteLine();
|
||||
int ain = random.Next(1, 3);
|
||||
Console.WriteLine($"I TAKE {ain} MATCHES");
|
||||
N = N - ain;
|
||||
PlayersProceed();
|
||||
}
|
||||
void PlayerFirst()
|
||||
{
|
||||
Console.WriteLine("TAILS! YOU GO FIRST. ");
|
||||
Console.WriteLine();
|
||||
PlayersSpeak();
|
||||
}
|
||||
void PlayersProceed()
|
||||
{
|
||||
Console.WriteLine($"THE NUMBER OF MATCHES IS NOW {N}");
|
||||
Console.WriteLine();
|
||||
PlayersSpeak();
|
||||
}
|
||||
void RemindsPlayersToEnter()
|
||||
{
|
||||
Console.WriteLine("YOUR TURN -- YOU MAY TAKE 1, 2 OR 3 MATCHES.");
|
||||
Console.WriteLine("HOW MANY DO YOU WISH TO REMOVE ");
|
||||
}
|
||||
void PlayersSpeak()
|
||||
{
|
||||
RemindsPlayersToEnter();
|
||||
command = Console.ReadLine().ToLower();
|
||||
if (command.Equals("exit"))
|
||||
{
|
||||
System.Diagnostics.Process tt = System.Diagnostics.Process.GetProcessById(System.Diagnostics.Process.GetCurrentProcess().Id);
|
||||
tt.Kill();
|
||||
}
|
||||
if (command.Equals("cls"))
|
||||
{
|
||||
Console.Clear();
|
||||
PlayersSpeak();
|
||||
}
|
||||
try
|
||||
{
|
||||
K = Convert.ToInt32(command);
|
||||
}
|
||||
catch (System.Exception)
|
||||
{
|
||||
PlayerInputError();
|
||||
}
|
||||
if (K > 3 || K <= 0)
|
||||
PlayerInputError();
|
||||
N = N - K;
|
||||
Console.WriteLine($"THERE ARE NOW {N} MATCHES REMAINING.");
|
||||
if (N == 4 || N == 3 || N == 2)
|
||||
TheComputerSpeaks(N);
|
||||
else if (N <= 1)
|
||||
ThePlayerWins();
|
||||
else
|
||||
TheComputerSpeaks(4 - K);
|
||||
|
||||
}
|
||||
void PlayerInputError()
|
||||
{
|
||||
Console.WriteLine("VERY FUNNY! DUMMY!");
|
||||
Console.WriteLine("DO YOU WANT TO PLAY OR GOOF AROUND?");
|
||||
Console.WriteLine("NOW, HOW MANY MATCHES DO YOU WANT ");
|
||||
PlayersSpeak();
|
||||
}
|
||||
void TheComputerSpeaks(int ain)
|
||||
{
|
||||
int Z = ain;
|
||||
Console.WriteLine($"MY TURN ! I REMOVE {Z} MATCHES");//390
|
||||
N = N - Z;
|
||||
if (N <= 1)
|
||||
TheComputerWins();
|
||||
else
|
||||
PlayersProceed();
|
||||
}
|
||||
void ThePlayerWins()
|
||||
{
|
||||
Console.WriteLine("YOU WON, FLOPPY EARS !");
|
||||
Console.WriteLine("THINK YOU'RE PRETTY SMART !");
|
||||
Console.WriteLine("LETS PLAY AGAIN AND I'LL BLOW YOUR SHOES OFF !!");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine();
|
||||
StartTheGame();
|
||||
}
|
||||
void TheComputerWins()
|
||||
{
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("YOU POOR BOOB! YOU TOOK THE LAST MATCH! I GOTCHA!!");
|
||||
Console.WriteLine("HA ! HA ! I BEAT YOU !!!");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("GOOD BYE LOSER!");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine();
|
||||
GameRun();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html)
|
||||
|
||||
Conversion to [Microsoft C#](https://docs.microsoft.com/en-us/dotnet/csharp/)
|
||||
|
||||
The program is available in two versions, a "goto" version that mimics the original program and an "object-oriented" version.
|
||||
@@ -0,0 +1,10 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
Reference in New Issue
Block a user