/// <summary>
        /// Method to instantiate a letterbutton
        /// </summary>
        /// <param name="letter"></param>
        /// <param name="isFirstLetter"></param>
        /// <param name="isSecondLetter"></param>
        /// <param name="row"></param>
        /// <param name="index"></param>
        /// <returns></returns>
        public LetterBlock InstantiateLetterButton(char letter, bool isFirstLetter = false, bool isSecondLetter = false, int row = 1, int?index = null)
        {
            LetterBlock block;

            block = (isFirstLetter || isSecondLetter) ? FixedLettersBlockObject : PlayerLetterBlockObject;
            return(Spawn(block, this, lttrBlock =>
            {
                lttrBlock.IsFirstLetter = isFirstLetter;
                lttrBlock.IsSecondLetter = isSecondLetter;
                lttrBlock.OnLetterTouched += LetterTouched;
                //Todo
                //lttrBlock.OnLetterDragged += LetterDragged;
                lttrBlock.GetComponentsInChildren <Text>()[0].text = letter.ToString().ToUpper();
                if (letter != '?')
                {
                    lttrBlock.GetComponentsInChildren <Text>()[1].text = TheLetterManager.CharactersValues.First(x => x.Key == char.ToLower(letter)).Value.ToString();
                }
                else
                {
                    lttrBlock.GetComponentsInChildren <Text>()[1].text = "";
                }
                GameObject parentRow = GetRightRow(row);
                lttrBlock.transform.SetParent(parentRow.transform, false);
                if (index != null)
                {
                    lttrBlock.transform.SetSiblingIndex((int)index);
                }
                PlayerLetters.Add(new LetterPosition(row, lttrBlock.transform.GetSiblingIndex(), lttrBlock));
            }));
        }
        /// <summary>
        /// Method to add a char to a letterBlock
        /// </summary>
        /// <param name="row"></param>
        /// <param name="index"></param>
        /// <returns>LetterBlock</returns>
        public LetterBlock AddLetter(int row, int index)
        {
            List <char> myLetters = GetPlayerLetters().Select(p => char.ToLower(p?.LetterBlock?.GetLetter() ?? default)).ToList();

            char[]      letters = TheLetterManager.GetLetters(1, myLetters);
            LetterBlock block   = InstantiateLetterButton(letters[0], false, false, row, index);

            PlayerLetters.Add(new LetterPosition(row, index, block));
            return(block);
        }
        /// <summary>
        /// Method that is called when a letter is touched
        /// </summary>
        /// <param name="block"></param>
        public void LetterTouched(LetterBlock block)
        {
            bool canMove = GameInstance.instance.IsMultiplayer ?  (bool)PhotonNetwork.LocalPlayer.CustomProperties["CanMove"] : Player.CanMove;

            if (!canMove)
            {
                return;
            }

            // Wanneer hij in de lijst placedLetters staat, moet deze terug naar beneden gezet worden, anders naar boven
            if (PlacedLetters.Select(x => x.LetterBlock).Contains(block))
            {
                RemoveLetterFromWritingBoardToPlayerBoard(block);
                CheckWordAndSetSubmitButtonState();
                return;
            }

            // When firstletter isn't placed yet, make sure second letter does nothing
            if (block == SecondLetterBlock && !PlacedLetters.Select(x => x.LetterBlock).Contains(FirstLetterBlock))
            {
                return;
            }

            // Wanneer er meer dan 12 zijn, niks doen
            if (PlacedLetters.Count(x => x.LetterBlock != null) >= 12)
            {
                return;
            }

            // Find the block in de playerletters
            LetterPosition letterBlock = PlayerLetters.FirstOrDefault(x => x.LetterBlock == block);
            // Find the first empty block in PlacedLetters
            LetterPosition EmptyLetterBlock = PlacedLetters.FirstOrDefault(x => x.LetterBlock == null);

            // De geklikte letter toevoegen aan EmptyLetterBlock en values overnemen
            EmptyLetterBlock.AddLetter(block, letterBlock.GetCurrentIndex(), letterBlock.GetRow());

            // Het lege object vinden om te kunnen destroyen
            Transform t = WritingBoard.transform.GetChild(EmptyLetterBlock.GetCurrentIndex());

            Destroy(t.gameObject);

            // Het geklikte blokje verplaatsen naar de plaats van het lege object
            //block.transform.localScale -= new Vector3(0.1f, 0, 0);
            block.transform.SetParent(WritingBoard.transform, false);
            block.transform.SetSiblingIndex(EmptyLetterBlock.GetCurrentIndex());

            // Een lege placeholder plaatsen waar de letter vandaan is gehaald
            GameObject ph        = Instantiate(PlaceHolderObject);
            GameObject parentRow = GetRightRow(letterBlock.GetRow());

            ph.transform.SetParent(parentRow.transform, false);
            ph.transform.SetSiblingIndex(letterBlock.GetCurrentIndex());
            CheckWordAndSetSubmitButtonState();
        }
        /// <summary>
        /// Gets the letters to play with
        /// </summary>
        /// <returns>List of LetterPosition</returns>
        public List <LetterPosition> GetPlayerLetters()
        {
            List <LetterPosition> playerLetters = new List <LetterPosition>();

            for (int row = 1; row <= 3; row++)
            {
                GameObject    r = GetRightRow(row);
                LetterBlock[] b = r.GetComponentsInChildren <LetterBlock>();
                foreach (LetterBlock block in b)
                {
                    LetterPosition pos = PlayerLetters.FirstOrDefault(p => p.LetterBlock == block);
                    playerLetters.Add(new LetterPosition(pos.GetRow(), pos.GetOldIndex(), block));
                }
            }
            return(playerLetters);
        }
        /// <summary>
        /// Currently not in use! To shuffle all the letters
        /// </summary>
        private void ShufflePlayerLetters()
        {
            Vector3 acceleration = Input.acceleration;

            _lowPassValue = Vector3.Lerp(_lowPassValue, acceleration, _lowPassFilterFactor);
            Vector3 deltaAcceleration = acceleration - _lowPassValue;

            _shuffleTimeRemaining -= Time.deltaTime;
            if (deltaAcceleration.sqrMagnitude >= _shakeDetectionThreshold && _shuffleTimeRemaining <= 0)
            {
                _shuffleTimeRemaining = 1;
                List <LetterBlock> letters = PlayerLetters.Select(x => x.LetterBlock).OrderBy(a => Random.Range(0, 100)).ToList();
                for (int i = 0; i < PlayerLetters.Count; i++)
                {
                    PlayerLetters[i].AddLetter(letters[i], PlayerLetters[i].GetOldIndex(), PlayerLetters[i].GetRow());
                }
            }
        }
 public MatchLabel(int div, int round, int matchNo, PlayerLetters letter) :
     this(div, round, matchNo)
 {
     Letter = letter;
 }
        /// <summary>
        /// Method that will be called when a word will be placed
        /// </summary>
        /// <param name="points"></param>
        private void PlaceWordInGameBoard(long points = 0)
        {
            if (GameInstance.instance.IsMultiplayer)
            {
                //bestWords = Player.BestWordsThisGame.Select(w => w.word).ToList();
                List <string> bestWords = Player.BestWordsThisGame.Select(w => w.word).ToList();
                string        w1        = bestWords.ElementAtOrDefault(0);
                string        w2        = bestWords.ElementAtOrDefault(1);
                string        w3        = bestWords.ElementAtOrDefault(2);

                long      playerPoints = (long)PhotonNetwork.LocalPlayer.CustomProperties["Points"];
                Hashtable hash         = new Hashtable {
                    { "Points", playerPoints + points }, { "BestWords1", w1 }, { "BestWords2", w2 }, { "BestWords3", w3 }
                };
                PhotonNetwork.LocalPlayer.SetCustomProperties(hash);
                _gameBoard.CallRPC(points, PlacedLetters, PhotonNetwork.LocalPlayer.UserId);
            }
            else
            {
                //Instantiate wordHolder
                GameObject wordHolder = Instantiate(GameBoardWordHolder);
                int        i          = 0;
                // Walk through all the letters placed
                foreach (LetterPosition letterPos in PlacedLetters)
                {
                    LetterBlock block = letterPos.LetterBlock;
                    if (block == null)
                    {
                        continue;
                    }
                    i++;
                    block.transform.SetParent(wordHolder.transform, false);
                    block.GetComponent <Button>().interactable = false;

                    // Replace placeholder with letter on playerBoard
                    int row          = letterPos.GetRow();
                    int index        = letterPos.GetOldIndex();
                    int currentIndex = letterPos.GetCurrentIndex();
                    PlayerLetters.Remove(letterPos);

                    if (!block.IsFirstLetter && !block.IsSecondLetter)
                    {
                        // Placeholders verwijderen
                        GameObject parentRow   = GetRightRow(row);
                        Transform  placeHolder = parentRow.transform.GetChild(index);
                        DestroyImmediate(placeHolder.gameObject);
                    }

                    // Lege gameobjecten toevoegen aan writeboard
                    GameObject emptyBlock = Instantiate(EmptyLetterBlockObject);
                    emptyBlock.transform.SetParent(WritingBoard.transform, false);
                    emptyBlock.transform.SetSiblingIndex(currentIndex);

                    // Nieuwe playerletters aanmaken
                    if (!block.IsFirstLetter && !block.IsSecondLetter)
                    {
                        AddLetter(row, index);
                    }
                }

                int nrOfLetters = i;

                for (; i < 12; i++)
                {
                    GameObject emptyPlaceHolder = Instantiate(PlaceHolderObject);
                    emptyPlaceHolder.transform.SetParent(wordHolder.transform, false);
                }
                wordHolder.transform.SetParent(GameBoardWordContainer.transform, false);
                Vector3 pos = new Vector3();
                pos.y = wordHolder.transform.position.y - 25;
                pos.x = wordHolder.transform.GetChild(nrOfLetters - 1).transform.position.x;
                ShowScoreGainedText(points, pos);
            }
        }