private void UpdateScore(TileControl tile)
        {
            m_multiLayerScore += tile.Layer + 1;

            if (tile.Layer == 0)
            {
                m_singleLayerScore += 2;
            }
            else
            {
                m_allTilesOneHigh = false;
            }

            Score = m_allTilesOneHigh ? m_singleLayerScore : m_multiLayerScore;
        }
		private void ExchangeTile(TileControl tileToExchange)
		{
			m_tileBeingExchanged = tileToExchange;

			// Request tile exchange.
			m_localNetwork.ExchangeLetter(tileToExchange.TileData);
		}
		private void PlaceTileOnBoard(TileControl draggedItem, int gridX, int gridY, ePlacementMode placement)
		{
			TranslateTransform tileRenderTransform = draggedItem.RenderTransform as TranslateTransform;

			GeneralTransform boardTransform = m_gameBoard.TransformToVisual(m_tileCanvas);
			Rect boardRect = boardTransform.TransformBounds(new Rect(0, 0, m_gameBoard.ActualWidth, m_gameBoard.ActualHeight));
			Point positionOfBoard = boardTransform.TransformPoint(new Point(0, 0));

			if (placement == ePlacementMode.UserPlacement)
			{
				// If the tile is being moved around the board then decrement the tile count in the square it left.
				if (draggedItem.GridY != ON_PANEL && draggedItem.GridX >= 0 && draggedItem.GridY >= 0)
				{
					m_boardSpaceFilled[draggedItem.GridX, draggedItem.GridY]--;
				}
				m_boardSpaceFilled[gridX, gridY] = Math.Max(1, Math.Min(5, m_boardSpaceFilled[gridX, gridY] + 1));
				draggedItem.Layer = m_boardSpaceFilled[gridX, gridY];
			}
			else if(placement == ePlacementMode.PlacingOpponentTile)
			{
				m_boardSpaceFilled[gridX, gridY] = draggedItem.Layer;
			}

			draggedItem.Width = m_tileSize;
			draggedItem.Height = m_tileSize;
			draggedItem.GridX = gridX;
			draggedItem.GridY = gridY;
			draggedItem.Visibility = Windows.UI.Xaml.Visibility.Visible;

			tileRenderTransform.X = positionOfBoard.X + (m_tileSize * gridX) - (boardRect.Width * 0.005 * draggedItem.Layer);// +boardRect.Width * 0.01 - (boardRect.Width * 0.005 * draggedItem.Layer);
			tileRenderTransform.Y = positionOfBoard.Y + (m_tileSize * gridY) - (boardRect.Height * 0.005 * draggedItem.Layer);// +boardRect.Height * 0.01 - (boardRect.Height * 0.005 * draggedItem.Layer);
			Canvas.SetZIndex(draggedItem, draggedItem.Layer);

			if (draggedItem.TileStatus == eTileState.OnPlayerPanel)
			{
				draggedItem.TileStatus = eTileState.ComposingNewWord;
				m_panelTiles.Remove(draggedItem);
				m_currentWordTiles.Add(draggedItem);
			}

			PlaySound(draggedItem.Layer);
		}
		private void PlaceTileOnPanel(TileControl draggedItem, int gridX)
		{
			TranslateTransform tileRenderTransform = draggedItem.RenderTransform as TranslateTransform;

			draggedItem.Layer = -1;
			Canvas.SetZIndex(draggedItem, 1);

			foreach (TileControl tile in m_panelTiles)
			{
				// If a tile is dropped on an existing tile...
				if (tile != draggedItem && tile.GridX == gridX)
				{
					// If moving tiles that are already on the panel then shuffle up or down as appropriate
					if (draggedItem.GridY == ON_PANEL)
					{
						// If the tile is being moved right then shuffle all preceding tiles right
						if (draggedItem.GridX < tile.GridX)
						{
							foreach (TileControl tileToMove in m_panelTiles)
							{
								if (tileToMove.GridX > draggedItem.GridX && tileToMove.GridX <= tile.GridX)
								{
									tileToMove.GridX--;
									TranslateTransform movingTileRenderTransform = tileToMove.RenderTransform as TranslateTransform;
									movingTileRenderTransform.X -= m_tileSize;
								}
							}
						}
						// If the tile is being moved left then shuffle all preceding tiles right
						else if (draggedItem.GridX > tile.GridX)
						{
							foreach (TileControl tileToMove in m_panelTiles)
							{
								if (tileToMove.GridX < draggedItem.GridX && tileToMove.GridX >= tile.GridX)
								{
									tileToMove.GridX++;
									TranslateTransform movingTileRenderTransform = tileToMove.RenderTransform as TranslateTransform;
									movingTileRenderTransform.X += m_tileSize;
								}
							}
						}
					}
					else
					{
						int spacesToTheLeft = gridX;
						int spacesToTheRight = 6 - gridX;
						int gapToLeftAt = 0;
						int gapToRightAt = 6;
						bool[] existingTiles = new bool[7];

						foreach (TileControl tileToMove in m_panelTiles)
						{
							existingTiles[tileToMove.GridX] = true;
							if (tileToMove.GridX < gridX)
							{
								spacesToTheLeft--;
							}
							else if (tileToMove.GridX > gridX)
							{
								spacesToTheRight--;
							}
						}
						for (int i = gridX; i >= 0; i--)
						{
							if (!existingTiles[i])
							{
								gapToLeftAt = i;
								break;
							}
						}
						for (int i = gridX; i < 7; i++)
						{
							if (!existingTiles[i])
							{
								gapToRightAt = i;
								break;
							}
						}
						// If there is no space on the left or simple more space on the right then shuffle right.
						if (spacesToTheLeft == 0 || spacesToTheRight >= spacesToTheLeft)
						{
							foreach (TileControl tileToMove in m_panelTiles)
							{
								if (tileToMove.GridX >= gridX && tileToMove.GridX < gapToRightAt)
								{
									tileToMove.GridX++;
									TranslateTransform movingTileRenderTransform = tileToMove.RenderTransform as TranslateTransform;
									movingTileRenderTransform.X += m_tileSize;
								}
							}
						}
						// Otherwise shuffle left.
						else if (spacesToTheRight == 0 || spacesToTheRight < spacesToTheLeft)
						{
							foreach (TileControl tileToMove in m_panelTiles)
							{
								if (tileToMove.GridX <= gridX && tileToMove.GridX > gapToLeftAt)
								{
									tileToMove.GridX--;
									TranslateTransform movingTileRenderTransform = tileToMove.RenderTransform as TranslateTransform;
									movingTileRenderTransform.X -= m_tileSize;
								}
							}
						}
					}
					break;
				}
			}

			GeneralTransform tilePanelTransform = m_tilePanel.TransformToVisual(m_tileCanvas);
			Point positionOfBoard = tilePanelTransform.TransformPoint(new Point(0, 0));

			tileRenderTransform.X = positionOfBoard.X + m_tilePanel.ActualWidth / 2 - (m_tileSize * (3.5 - gridX));
			tileRenderTransform.Y = positionOfBoard.Y + 1;

			if (draggedItem.GridY != ON_PANEL && draggedItem.GridX >= 0 && draggedItem.GridY >= 0)
			{
				m_boardSpaceFilled[draggedItem.GridX, draggedItem.GridY]--;
			}

			draggedItem.Width = m_tileSize;
			draggedItem.Height = m_tileSize;
			draggedItem.GridX = gridX;
			draggedItem.GridY = ON_PANEL;
			draggedItem.Visibility = Windows.UI.Xaml.Visibility.Visible;

			if (draggedItem.TileStatus == eTileState.ComposingNewWord)
			{
				draggedItem.TileStatus = eTileState.OnPlayerPanel;
				m_currentWordTiles.Remove(draggedItem);
				m_panelTiles.Add(draggedItem);
			}
		}
		private void AddTileToPanel(string letter, int position)
		{
			TileControl tile = new TileControl(letter);
			tile.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
			tile.RenderTransform = new TranslateTransform();
			tile.HorizontalAlignment = Windows.UI.Xaml.HorizontalAlignment.Left;
			tile.VerticalAlignment = Windows.UI.Xaml.VerticalAlignment.Top;
			m_tileCanvas.Children.Add(tile);

			tile.TileStatus = eTileState.OnPlayerPanel;
			tile.ManipulationMode = ManipulationModes.TranslateX | ManipulationModes.TranslateY;
			tile.ManipulationStarting += DragLetter_ManipulationStarting;
			tile.ManipulationDelta += DragLetter_ManipulationDelta;
			tile.ManipulationCompleted += DragLetter_ManipulationCompleted;

			PlaceTileOnPanel(tile, position);

			m_panelTiles.Add(tile);
		}
		private void AddTileToBoard(TileDetails tileData)
		{
			TileControl tile = new TileControl(tileData);
			tile.Visibility = Windows.UI.Xaml.Visibility.Visible;
			tile.RenderTransform = new TranslateTransform();
			tile.HorizontalAlignment = Windows.UI.Xaml.HorizontalAlignment.Left;
			tile.VerticalAlignment = Windows.UI.Xaml.VerticalAlignment.Top;
			m_tileCanvas.Children.Add(tile);

			tile.TileStatus = eTileState.JustPlayed;
			tile.ManipulationMode = ManipulationModes.None;

			m_justPlayedTiles.Add(tile);
			m_playedTiles.Add(tile);
			m_boardTiles[tile.GridX, tile.GridY] = tile;

			PlaceTileOnBoard(tile, tileData.GridX, tileData.GridY, ePlacementMode.PlacingOpponentTile);
		}
		void LocalNetwork_OnLettersReceived(string serverIP, GameLetters letters)
		{
			if (m_tileBeingExchanged != null)
			{
				m_panelTiles.Remove(m_tileBeingExchanged);
				m_tileBeingExchanged = null;

				if(OnChangingALetter != null)
				{
					OnChangingALetter(true);
				}
			}

			AddLettersToPanel(letters);
		}
 public void PrependLetter(TileControl tile)
 {
     Word = tile.Letter + Word;
     UpdateScore(tile);
 }
 public void AppendLetter(TileControl tile)
 {
     Word += tile.Letter;
     UpdateScore(tile);
 }