Hangman Game using C#
Posted by Samath
Last Updated: January 17, 2024

Hangman is a classic word-guessing game for one or more players. It is used often by teachers to practice spelling, vocabulary and just for fun. In this hangman game the user is given a few letters out of the word, in order to complete the game the user have to guess all the other letters in the word. If the user guess all the letters correctly they will win the game, on the other hand if the amount of try runs out they lose the game. The entire word will be revealed if they lose the game. The user has an option to create a new game when the game starts and an option to quit or reset while the game is in play.

In order for the game to run, a list of words must be added to the application executable folder.

Example: 

WordHolder Class:

 class WordHolder
    {
        public int Start { get; set; }
        public int End { get; set; }

        private List<WordHolder> _slotCollection = null;
        public List<WordHolder> SlotCollection { get { return _slotCollection; } }

        public WordHolder() { }

        public WordHolder(int count)
        {
            WordHolder obj = null;
            _slotCollection = new List<WordHolder>();

            if (count < 1000)
            {
                SlotCollection.Add(new WordHolder() { Start = 0, End = count });
                return;
            }
            else
            {
                int endValue = 0;

                for (int i = 0; i < count; i += 1000)
                {
                    obj = new WordHolder()
                    {
                        Start = i == 0 ? i : i + 1,
                        End = count - endValue > 1000 ? (1000 + endValue) : i + (count - endValue)
                    };

                    _slotCollection.Add(obj);
                    endValue += 1000;
                }
            }
        }
    }

 

Main Code:

using System;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Windows.Forms;

namespace HangMan
{

    public partial class frmHangmanGame : Form
    {
      

        private StreamReader _readit = null;
        private WordHolder _wordHolder = null;

        private String[] _wordListArray = null;
        private Char[] _wordArray = null;
        private Char[] _display = null;
        private int[] _randomCollection = null;

        private Random _random = null;

        private String _randomWord = String.Empty;

        private int _wordIndex = 0;
        private int _previousNumber = 0;
        private int _imageIndex = 0;
        private int _remain = 0;
        private int _slotCount = 0;
        private int _outerCount = 0;
        private int _innerCount = 0;

        private Boolean _isQuit = false;

        private KeysConverter _converter = null;

       


        public frmHangmanGame()
        {
            InitializeComponent();
        }

        private void FormHang_Load(object sender, EventArgs e)
        {
            _random = new Random();
            _converter = new KeysConverter();

            this.LoadWordBox();
            this.Reset();
        }

        private void FormHang_Shown(object sender, EventArgs e)
        {
            this.Cursor = Cursors.WaitCursor;

            try
            {
                this.LoadWordList();
                _wordHolder = new WordHolder(_wordListArray.Length);
                _slotCount = _wordHolder.SlotCollection.Count;
            }
            catch (Exception ex)
            {
                buttonReset.Enabled = false;
                buttonNewGame.Enabled = false;

                MessageBox.Show(ex.Message.StartsWith("Could not find file") == true ?
                    "Please Copy the list of words file into application executable folder." : ex.Message, 
                    this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            this.Cursor = Cursors.Default;
        }

        private void buttonAbandon_Click(object sender, EventArgs e)
        {
            this.GameQuit();
        }

        private void buttonReset_Click(object sender, EventArgs e)
        {
            this.Reset();

            buttonQuit.Enabled = false;
            buttonNewGame.Enabled = true;
        }

        private void buttonNewGame_Click(object sender, EventArgs e)
        {
            try
            {
                if (_wordListArray.Length == 0)
                {
                    MessageBox.Show("Dictionary not found.", 
                        this.Text, 
                        MessageBoxButtons.OK, MessageBoxIcon.Error);

                    Application.ExitThread();
                    Application.Exit();

                    return;
                }

                this.Reset();

                int showValues = 0;

                if (_outerCount >= _slotCount)
                {
                    _outerCount = 0;
                    _innerCount = 0;

                    _randomCollection = null;
                    _randomCollection = new int[1];
                }

                WordHolder obj = new WordHolder();

                obj.Start = _wordHolder.SlotCollection[_outerCount].Start;
                obj.End = _wordHolder.SlotCollection[_outerCount].End;

                bool result = true;

                if (_randomCollection == null) _randomCollection = new int[1];

                while (result)
                {
                    result = true;

                    _wordIndex = _random.Next(obj.Start, obj.End - 1);

                    var isfound = (from n in _randomCollection
                                   where n == _wordIndex
                                   select n).Count();

                    if (isfound <= 0)
                    {
                        if (_randomCollection.Length == 1) 
                            _randomCollection[_randomCollection.Length - 1] = _wordIndex;

                        _randomCollection[_randomCollection.Length - 1] = _wordIndex;
                        Array.Resize(ref _randomCollection, _randomCollection.Length + 1);

                        result = false;
                    }
                }

                _innerCount += 1;

                if (_innerCount >= 10)
                {
                    _innerCount = 0;
                    _outerCount += 1;

                    _randomCollection = null;
                    _randomCollection = new int[1];
                }

                _previousNumber = _wordIndex;
                _randomWord = _wordListArray[_wordIndex].ToUpper();
                _wordArray = _randomWord.ToCharArray();
                
                this.CreateLabelBox(_wordArray.Length);

                foreach (Control control in this.Controls)
                    if (control is Button) control.Enabled = true;

                switch (_wordArray.Length)
                {
                    case 1:
                    case 2:
                    case 3:
                    case 4:
                        showValues = 1;
                        break;
                    case 5:
                    case 6:
                    case 7:
                    case 8:
                        showValues = 2;
                        break;
                    default:
                        showValues = 3;
                        break;
                }

                Control.ControlCollection collection = this.Controls;
                _display = new Char[showValues];

                foreach (Control control in collection)
                {
                    if (control is Label)
                            switch (showValues)
                            {
                                case 1:
                                    if (control.Name == String.Format("{0}{1}", "labelWord", "01"))
                                    {
                                        control.Text = _wordArray[0].ToString();
                                        _display[0] = Char.Parse(control.Text);
                                    }
                                    break;
                                case 2:
                                    if (control.Name == String.Format("{0}{1}", "labelWord", "01"))
                                    {
                                        control.Text = _wordArray[0].ToString();
                                        _display[0] = Char.Parse(control.Text);
                                    }

                                    if (control.Name == String.Format("{0}{1}", "labelWord", (_wordArray.Length).ToString("00")))
                                    {
                                        control.Text = _wordArray[_wordArray.Length - 1].ToString();
                                        _display[1] = Char.Parse(control.Text);
                                    }
                                    break;
                                case 3:
                                    if (control.Name == String.Format("{0}{1}", "labelWord", "01"))
                                    {
                                        control.Text = _wordArray[0].ToString();
                                        _display[0] = Char.Parse(control.Text);
                                    }

                                    int middle = _wordArray.Length / 2;
                                    if (control.Name == String.Format("{0}{1}", "labelWord", middle.ToString("00")))
                                    {
                                        control.Text = _wordArray[middle - 1].ToString();
                                        _display[1] = Char.Parse(control.Text);
                                    }

                                    if (control.Name == String.Format("{0}{1}", "labelWord", (_wordArray.Length).ToString("00")))
                                    {
                                        control.Text = _wordArray[_wordArray.Length - 1].ToString();
                                        _display[2] = Char.Parse(control.Text);
                                    }
                                    break;
                            }
                        
                }

                Array.Sort(_display);
                char value = '@';

                foreach (Char charvalue in _display)
                {
                    if (value == charvalue)continue;

                    value = charvalue;
                    int innerCount = (from c in _display
                                      where c == charvalue
                                      select c).Count();

                    int outerCount = (from c in _wordArray
                                      where c == charvalue
                                      select c).Count();


                    if (outerCount - innerCount <= 0)
                    {
                        foreach (Control control in collection)
                        {
                            if (control is Button)
                            {
                                if (control.Name == String.Format("{0}{1}", "button", value))
                                    control.Enabled = false;
                            }
                        }
                    }
                }

                buttonQuit.Enabled = true;
                buttonNewGame.Enabled = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        

        private void GameQuit()
        {
            _isQuit = true;

            this.GameStatus(true);
        }

        private void Reset()
        {
            pictureBoxHangMan.Image = null;

            foreach (Control control in this.Controls)
            {
                if (control is Label)
                { 
                        control.ForeColor = Color.Lime;
                        control.Visible = false;
                        control.ResetText();
                }

                if (control is Button) control.Enabled = false;
            }

            _outerCount = 0;
            _innerCount = 0;
            _randomCollection = null;

            _wordIndex = 0;
            _imageIndex = 0;
            _isQuit = false;
            _wordArray = null;

            buttonQuit.Enabled = false;
        }

        private void ShowHangMan(int position)
        {
            switch (position)
            {
                case 1:
                    pictureBoxHangMan.Image = Properties.Resources.IMG_01;
                    break;
                case 2:
                    pictureBoxHangMan.Image = Properties.Resources.IMG_02;
                    break;
                case 3:
                    pictureBoxHangMan.Image = Properties.Resources.IMG_03;
                    break;
                case 4:
                    pictureBoxHangMan.Image = Properties.Resources.IMG_04;
                    break;
                case 5:
                    pictureBoxHangMan.Image = Properties.Resources.IMG_05;
                    break;
                case 6:
                    pictureBoxHangMan.Image = Properties.Resources.IMG_06;
                    break;
                case 7:
                    pictureBoxHangMan.Image = Properties.Resources.IMG_07;
                    break;
                case 8:
                    pictureBoxHangMan.Image = Properties.Resources.IMG_08;
                    break;
                case 9:
                    pictureBoxHangMan.Image = Properties.Resources.IMG_FINAL;
                    break;
                default:
                    pictureBoxHangMan.Image = null;
                    break;
            }
        }

        private void TextButton(object sender, EventArgs e)
        {
            Button btn = sender as Button;
            String btnText = btn.Text;

            this.SetGame(btnText);
        }

        private void LoadWordList()
        {
            _readit = new StreamReader(File.Open("listOfWords.txt", FileMode.Open, FileAccess.Read));

            int count = 0;
            _wordListArray = new String[1];

            string line = string.Empty;

            while (_readit.Peek() != -1)
            {
                Application.DoEvents();
                line = _readit.ReadLine().Trim();

                if (line.Length >= 19)
                    continue;

                count += 1;
                Array.Resize(ref _wordListArray, count);
                _wordListArray[count - 1] = line;
            }

            _readit.Close();
            _readit.Dispose();

            _readit = null;
        }

        private void LoadWordBox()
        {
            int lineOne = 198;
            int lineTwo = 198;

            for (int i = 1; i <= 18; i++)
            {
                String labelName = String.Format("{0}{1}", "labelWord", i.ToString("00"));
                Control ctrl = new Control();

                Label word = new Label();

                word.Name = String.Format("{0}{1}", "labelWord", i.ToString("00"));
                word.Size = new Size(35, 35);
                word.TextAlign = ContentAlignment.MiddleCenter;
                word.BackColor = Color.Black;
                word.ForeColor = Color.Lime;
                word.Font = new Font("Calibri", 20, FontStyle.Bold);

                if (i <= 9)
                {
                    word.Location = new Point(lineOne, 12);
                    lineOne += 37;
                }
                if (i >= 10)
                {
                    word.Location = new Point(lineTwo, 47);
                    lineTwo += 37;
                }

                word.Text = String.Empty;
                word.BorderStyle = BorderStyle.Fixed3D;
                word.Visible = true;

                this.Controls.Add(word);
            }
        }

        private void CreateLabelBox(int count)
        {
            int index = 1;

            Control.ControlCollection collection = this.Controls;

            foreach (Control control in collection)
                if (control is Label)
                        if (control.Name == String.Format("{0}{1}", "labelWord", index.ToString("00")))
                        {
                            control.Font = new Font("Calibri", 20, FontStyle.Bold);
                            control.ResetText();
                            control.Visible = true;

                            index += 1;
                            if (index > count) return;
                        }
        }

     private void GameStatus(Boolean islost)
        {
            if (islost) pictureBoxHangMan.Image = Properties.Resources.IMG_FINAL;
            
            _wordIndex = 0;

            foreach (Control control in this.Controls)
            {
                if (control is Label)
                    if (control.Name != "myLabel")
                    {
                        if ((String.IsNullOrEmpty(control.Text)) && (control.Visible == true))
                        {
                            control.Font = new Font("Calibri", 20, FontStyle.Bold);
                            control.ForeColor = Color.DarkSeaGreen;
                            control.Text = _wordArray[_wordIndex].ToString();
                        }

                        if ((!String.IsNullOrEmpty(control.Text)) && (control.Visible == true)) _wordIndex += 1;
                    }

                if (control is Button) control.Enabled = false;
            }

            buttonQuit.Enabled = false;
            buttonNewGame.Enabled = true;
        }

        private void SetGame(String word)
        {
            int result = (from w in _wordArray
                          where w == Char.Parse(word)
                          select w).Count();

            int count = 0;
            int[] indexArray = new int[1];

            for (int i = 0; i < _wordArray.Length; i++)
            {
                if (_wordArray[i] == Char.Parse(word))
                {
                    count += 1;
                    Array.Resize(ref indexArray, count);
                    indexArray[count - 1] = i;
                }
            }

            _remain = 0;
            Control.ControlCollection collection = this.Controls;

            foreach (Control control in collection)
            {
                if (control is Label)
                    if (control.Name != "myLabel")
                    {
                        foreach (int index in indexArray)
                        {
                            if (control.Name == String.Format("{0}{1}", "labelWord", (index + 1).ToString("00")) && control.Visible)
                            {
                                if (String.IsNullOrEmpty(control.Text))
                                    control.Text = word;
                            }
                        }

                        if (String.IsNullOrEmpty(control.Text) && control.Visible)
                            _remain += 1;
                    }

                if (control is Button)
                {
                    if (control.Name == String.Format("{0}{1}", "button", word.ToUpper()))
                    {
                        if (!control.Enabled) return;
                        control.Enabled = false;
                    }
                }
            }

            if (result == 0)
            {
                _imageIndex += 1;
                ShowHangMan(_imageIndex);
                if (_imageIndex >= 9) GameStatus(true);
                return;
            }

            if (_remain <= 0)
            {
                MessageBox.Show("Congratulations! You Successfully Won.",
                    this.Text, MessageBoxButtons.OK,
                    MessageBoxIcon.Information);
                GameStatus(false);
            }
        }

       
    }
}
Related Content
Hangman Game in C++
Hangman Game in C++
Samath | Jan 17, 2024
The Matching Game in Java
The Matching Game in Java
Samath | Mar 20, 2015
Animal Game in Java
Animal Game in Java
gideonna | Apr 13, 2016
Number Guessing Game using C++
Number Guessing Game using C++
Samath | Jan 04, 2017
Blackjack Game in C++
Blackjack Game in C++
Samath | Jan 05, 2017
Checkers Game using C++
Checkers Game using C++
Samath | Jan 17, 2024
Minesweeper Game using C++
Minesweeper Game using C++
Samath | Jan 05, 2017
Craps Dice game in C++
Craps Dice game in C++
Samath | Jan 06, 2021
Paper Strip Game using Python
Paper Strip Game using Python
Samath | Jan 17, 2024
Tic Tac Toe Game using C#
Tic Tac Toe Game using C#
Samath | Jan 17, 2024
John Conway's Game of Life using C++
John Conway's Game of Life using C++
Samath | Jan 04, 2017
C++ Rock Paper Scissors Game
C++ Rock Paper Scissors Game
Samath | Jan 05, 2017
Tic Tac Toe Game using Python
Tic Tac Toe Game using Python
Samath | Jan 17, 2024
Casino Number Guessing Game in C++
Casino Number Guessing Game in C++
Samath | Jan 20, 2024