Sha256: 5be1a498191253425ac30226d2b326052f552464547fc47c34215d324eeee335

Contents?: true

Size: 1.99 KB

Versions: 48

Compression:

Stored size: 1.99 KB

Contents

using System.Collections.Generic;
using System.Linq;

public delegate void HangmanChangedEventHandler(object sender, HangmanState state);

public class HangmanState
{
    public HangmanGame.Status Status { get; set; }
    public int RemainingGuesses { get; set; }
    public string MaskedWord { get; set; }
    public HashSet<char> Guesses { get; set; }
}

public class HangmanGame
{
    private const int NumberOfAllowedGuesses = 9;
    private const char UnguessedCharacterPlaceHolder = '_';

    private readonly string word;
    private readonly HangmanState state;

    public enum Status
    {
        Busy,
        Win,
        Lose
    }

    public HangmanGame(string word)
    {
        this.word = word;

        state = new HangmanState
        {
            RemainingGuesses = NumberOfAllowedGuesses,
            Guesses = new HashSet<char>()
        };

        UpdateMaskedWord();
        UpdateStatus();
    }

    public event HangmanChangedEventHandler StateChanged;

    public void Start()
    {
        StateChanged?.Invoke(this, state);
    }

    public void Guess(char c)
    {
        UpdateRemainingGuesses(c);
        UpdateMaskedWord();
        UpdateStatus();

        StateChanged?.Invoke(this, state);
    }

    private void UpdateRemainingGuesses(char c)
    {
        if (UnknownCharacter(c) || CharacterAlreadyGuessed(c))
            state.RemainingGuesses--;

        state.Guesses.Add(c);
    }

    private bool UnknownCharacter(char c) => word.All(x => x != c);

    private bool CharacterAlreadyGuessed(char c) => state.Guesses.Contains(c);    

    private void UpdateMaskedWord()
    {
        state.MaskedWord = new string(word.Select(c => state.Guesses.Contains(c) ? c : UnguessedCharacterPlaceHolder).ToArray());
    }

    private void UpdateStatus()
    {
        if (state.MaskedWord == word)
            state.Status = Status.Win;
        else if (state.RemainingGuesses < 0)
            state.Status = Status.Lose;        
        else
            state.Status = Status.Busy;
    }
}

Version data entries

48 entries across 48 versions & 1 rubygems

Version Path
trackler-2.0.8.14 tracks/csharp/exercises/hangman/Example.cs
trackler-2.0.8.13 tracks/csharp/exercises/hangman/Example.cs
trackler-2.0.8.12 tracks/csharp/exercises/hangman/Example.cs
trackler-2.0.8.11 tracks/csharp/exercises/hangman/Example.cs
trackler-2.0.8.10 tracks/csharp/exercises/hangman/Example.cs
trackler-2.0.8.9 tracks/csharp/exercises/hangman/Example.cs
trackler-2.0.8.8 tracks/csharp/exercises/hangman/Example.cs
trackler-2.0.8.7 tracks/csharp/exercises/hangman/Example.cs
trackler-2.0.8.6 tracks/csharp/exercises/hangman/Example.cs
trackler-2.0.8.5 tracks/csharp/exercises/hangman/Example.cs
trackler-2.0.8.4 tracks/csharp/exercises/hangman/Example.cs
trackler-2.0.8.3 tracks/csharp/exercises/hangman/Example.cs
trackler-2.0.8.2 tracks/csharp/exercises/hangman/Example.cs
trackler-2.0.8.1 tracks/csharp/exercises/hangman/Example.cs
trackler-2.0.7.0 tracks/csharp/exercises/hangman/Example.cs
trackler-2.0.6.44 tracks/csharp/exercises/hangman/Example.cs
trackler-2.0.6.43 tracks/csharp/exercises/hangman/Example.cs
trackler-2.0.6.42 tracks/csharp/exercises/hangman/Example.cs
trackler-2.0.6.41 tracks/csharp/exercises/hangman/Example.cs
trackler-2.0.6.40 tracks/csharp/exercises/hangman/Example.cs