54_Letter - added csharp

This commit is contained in:
Peter Eastwood
2022-02-14 19:29:37 +00:00
parent d231336da4
commit a54369c677
3 changed files with 177 additions and 0 deletions

137
54_Letter/csharp/Game.cs Normal file
View File

@@ -0,0 +1,137 @@
namespace Letter
{
internal static class Game
{
/// <summary>
/// Maximum number of guesses.
/// Note the program doesn't enforce this - it just displays a message if this is exceeded.
/// </summary>
private const int MaximumGuesses = 5;
/// <summary>
/// Main game loop.
/// </summary>
public static void Play()
{
DisplayIntroductionText();
// Keep playing forever, or until the user quits.
while (true)
{
PlayRound();
}
}
/// <summary>
/// Play a single round.
/// </summary>
internal static void PlayRound()
{
var gameState = new GameState();
DisplayRoundIntroduction();
char letterInput = '\0'; // Set the initial character to something that's not A-Z.
while (letterInput != gameState.Letter)
{
letterInput = GetCharacterFromKeyboard();
gameState.GuessesSoFar++;
DisplayGuessResult(gameState.Letter, letterInput);
}
DisplaySuccessMessage(gameState);
}
/// <summary>
/// Display an introduction when the game loads.
/// </summary>
internal static void DisplayIntroductionText()
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("LETTER");
Console.WriteLine("Creative Computing, Morristown, New Jersey.");
Console.WriteLine("");
Console.ForegroundColor = ConsoleColor.DarkGreen;
Console.WriteLine("Letter Guessing Game");
Console.WriteLine("I'll think of a letter of the alphabet, A to Z.");
Console.WriteLine("Try to guess my letter and I'll give you clues");
Console.WriteLine("as to how close you're getting to my letter.");
Console.WriteLine("");
Console.ResetColor();
}
/// <summary>
/// Display introductionary text for each round.
/// </summary>
internal static void DisplayRoundIntroduction()
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("O.K., I have a letter. Start guessing.");
Console.ResetColor();
}
/// <summary>
/// Display text depending whether the guess is lower or higher.
/// </summary>
internal static void DisplayGuessResult(char letterToGuess, char letterInput)
{
Console.BackgroundColor = ConsoleColor.White;
Console.ForegroundColor = ConsoleColor.Black;
Console.Write(" " + letterInput + " ");
Console.ResetColor();
Console.ForegroundColor = ConsoleColor.Gray;
Console.Write(" ");
if (letterInput != letterToGuess)
{
if (letterInput > letterToGuess)
{
Console.WriteLine("Too high. Try a lower letter");
}
else
{
Console.WriteLine("Too low. Try a higher letter");
}
}
Console.ResetColor();
}
/// <summary>
/// Display success, and the number of guesses.
/// </summary>
internal static void DisplaySuccessMessage(GameState gameState)
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine($"You got it in {gameState.GuessesSoFar} guesses!!");
if (gameState.GuessesSoFar > MaximumGuesses)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine($"But it shouldn't take more than {MaximumGuesses} guesses!");
}
else
{
Console.WriteLine("Good job !!!!!");
}
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("");
Console.WriteLine("Let's play again.....");
Console.ResetColor();
}
/// <summary>
/// Get valid input from the keyboard: must be an alpha character. Converts to upper case if necessary.
/// </summary>
internal static char GetCharacterFromKeyboard()
{
char letterInput;
do
{
var keyPressed = Console.ReadKey(true);
letterInput = Char.ToUpper(keyPressed.KeyChar); // Convert to upper case immediately.
} while (!Char.IsLetter(letterInput)); // If the input is not a letter, wait for another letter to be pressed.
return letterInput;
}
}
}

View File

@@ -0,0 +1,37 @@
namespace Letter
{
/// <summary>
/// Holds the current state.
/// </summary>
internal class GameState
{
/// <summary>
/// Initialise the game state with a random letter.
/// </summary>
public GameState()
{
Letter = GetRandomLetter();
GuessesSoFar = 0;
}
/// <summary>
/// The letter that the user is guessing.
/// </summary>
public char Letter { get; set; }
/// <summary>
/// The number of guesses the user has had so far.
/// </summary>
public int GuessesSoFar { get; set; }
/// <summary>
/// Get a random character (A-Z) for the user to guess.
/// </summary>
internal static char GetRandomLetter()
{
var random = new Random();
var randomNumber = random.Next(0, 26);
return (char)('A' + randomNumber);
}
}
}

View File

@@ -0,0 +1,3 @@
using Letter;
Game.Play();