Sha256: 9f4ae8fab35360ddbf07b0ad3d59da448bc3aab4f71ca4fe667b04e5bc525b1d

Contents?: true

Size: 1.99 KB

Versions: 281

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 HangmanStatus Status { get; set; }
    public int RemainingGuesses { get; set; }
    public string MaskedWord { get; set; }
    public HashSet<char> Guesses { get; set; }
}

public enum HangmanStatus
{
    Busy,
    Win,
    Lose
}

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

    private readonly string word;
    private readonly HangmanState state;

    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 = HangmanStatus.Win;
        else if (state.RemainingGuesses < 0)
            state.Status = HangmanStatus.Lose;        
        else
            state.Status = HangmanStatus.Busy;
    }
}

Version data entries

281 entries across 281 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/csharp/exercises/hangman/Example.cs
trackler-2.2.1.179 tracks/csharp/exercises/hangman/Example.cs
trackler-2.2.1.178 tracks/csharp/exercises/hangman/Example.cs
trackler-2.2.1.177 tracks/csharp/exercises/hangman/Example.cs
trackler-2.2.1.176 tracks/csharp/exercises/hangman/Example.cs
trackler-2.2.1.175 tracks/csharp/exercises/hangman/Example.cs
trackler-2.2.1.174 tracks/csharp/exercises/hangman/Example.cs
trackler-2.2.1.173 tracks/csharp/exercises/hangman/Example.cs
trackler-2.2.1.172 tracks/csharp/exercises/hangman/Example.cs
trackler-2.2.1.171 tracks/csharp/exercises/hangman/Example.cs
trackler-2.2.1.170 tracks/csharp/exercises/hangman/Example.cs
trackler-2.2.1.169 tracks/csharp/exercises/hangman/Example.cs
trackler-2.2.1.167 tracks/csharp/exercises/hangman/Example.cs
trackler-2.2.1.166 tracks/csharp/exercises/hangman/Example.cs
trackler-2.2.1.165 tracks/csharp/exercises/hangman/Example.cs
trackler-2.2.1.164 tracks/csharp/exercises/hangman/Example.cs
trackler-2.2.1.163 tracks/csharp/exercises/hangman/Example.cs
trackler-2.2.1.162 tracks/csharp/exercises/hangman/Example.cs
trackler-2.2.1.161 tracks/csharp/exercises/hangman/Example.cs
trackler-2.2.1.160 tracks/csharp/exercises/hangman/Example.cs