private void MainForm_Load(object sender, EventArgs e)
 {
     _rendering = new MapRendering(boardPic);
     _rnd       = new Random();
     ResetGame();
     _rendering.Render(_map);
 }
        private void gameTimer_Tick(object sender, EventArgs e)
        {
            // Move ghosts
            if (ghostRandomRadio.Checked)
            {
                randomGhosts();
            }
            else if (ghostProxyRadio.Checked)
            {
                proxyGhosts();
            }
            else if (ghostShortRadio.Checked)
            {
                shortGhosts();
            }
            else
            {
                randomGhosts();
            }

            _game.Trail = _map.Ghost;
            _map.Ghost  = _game.Ghost.ToArray();

            // Move pacman
            if (pacmanAutoChk.Checked)
            {
                // Find nearest osbtacle in a line of sight in all directions
                List <GameSight> rays = new List <GameSight>();
                lookRay(rays, -1, 0);
                lookRay(rays, 1, 0);
                lookRay(rays, 0, -1);
                lookRay(rays, 0, 1);
                rays.Sort((a, b) =>
                {
                    int diff = weighType(a) - weighType(b);
                    if (diff != 0)
                    {
                        return(diff);
                    }
                    if (a.Obstacle == MapTileType.GHOST1)
                    {
                        return(b.Distance - a.Distance);
                    }
                    else
                    {
                        return(a.Distance - b.Distance);
                    }
                });
                if (rays.Count > 0)
                {
                    if (rays[0].Obstacle == MapTileType.WALL && rays.Count(t => t.Obstacle == MapTileType.WALL) >= 2)
                    {
                        rays.RemoveAll(t => t.Obstacle != MapTileType.WALL || t.Position.Equals(_game.CameFrom));
                        _game.CameFrom = _map.Pacman;
                        if (rays.Count == 1)
                        {
                            _map.Pacman = rays[0].Position;
                        }
                        else
                        {
                            _map.Pacman = rays[_rnd.Next(rays.Count)].Position;
                        }
                    }
                    else
                    {
                        _game.CameFrom = _map.Pacman;
                        _map.Pacman    = rays[0].Position;
                    }
                }
            }
            else
            {
                _game.CameFrom = _map.Pacman;
                _map.Pacman    = _game.Pacman;
            }



            bool gameLost = false;

            // if ghost hits pacman, lose the game
            if (_map.Ghost.Any(g => g.Equals(_map.Pacman)))
            {
                // LOSE
                Text = "Codeman LOST";
                gameTimer.Enabled = false;
                gameLost          = true;
            }

            if (!gameLost)
            {
                // if pacman is on point, eat it
                if (_map[_map.Pacman] == MapTileType.POINT)
                {
                    _map[_map.Pacman] = MapTileType.EMPTY;
                    _game.PointCount--;
                }

                if (_game.PointCount == 0)
                {
                    // WIN
                    Text = "Codeman WON";
                    gameTimer.Enabled = false;
                }
            }

            _rendering.Render(_map);
        }