// spustenie hry, nastavia sa vsetky potrebne nastavenia a zobrazi sa hracia
        // plocha s puzzle kuskami a oknom s instrukciami(len pri prvom spusteni programu)
        private void button2_Click(object sender, EventArgs e)
        {
            if (gameData.SourcePicture != null)
            {
                textBox1.Visible    = false;
                pictureBox1.Visible = false;
                button1.Visible     = false;
                button2.Visible     = false;
                panel5.Visible      = true; //obsahuje button3==Restart, button4==NewGame

                //
                //nastavime pociatocne data pre hru
                //
                gameData.SourcePicture          = PictureEditor.CropImage(gameData.SourcePicture, gridLayer.StartCutLocation, gridLayer.EndCutLocation);
                gameData.PiecesGridDimensions   = gridLayer.GridDimensions;
                gameData.PiecesCount            = gameData.PiecesGridDimensions.Width * gameData.PiecesGridDimensions.Height;
                gameData.PieceDimensions        = gridLayer.PieceDimensions;
                gameData.PieceSurroundingSize   = (int)Math.Ceiling(gameData.PieceDimensions.Width * 0.163);
                gameData.GameBoard              = this.panel4;
                gameData.GameBoardStartPosition = new Point(50, 50);

                PuzzleGameUtilities.CreatePieces(gameData);
                PuzzleGameUtilities.SetOriginalPiecesLocations(gameData);
                PuzzleGameUtilities.SetPiecesArrangement(gameData);
                PuzzleGameUtilities.SetPiecesImages(gameData);
                PuzzleGameUtilities.SetPiecesOriginalNeighbours(gameData);
                PuzzleGameUtilities.RandomizePiecesLocations(gameData);


                //
                //Pociatocne nastavenia gameboard-u
                //
                gameboard = new Gameboard(this, gameData, panel4.Size);
                //gameboard ako instancia Form nesmie byt nastavena na top level control !!
                gameboard.TopLevel = false;
                panel4.Controls.Add(gameboard);
                gameboard.Visible  = false;
                gameboard.Anchor   = AnchorStyles.None;
                gameboard.Anchor   = (AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Right);
                gameboard.Location = new Point(0, 0); //pozicia vo vnutri panel4
                gameboard.Visible  = true;

                if (showGameInstructions)
                {
                    this.panel6.BringToFront();
                    this.panel6.Visible = true;
                    // zabezpecime aby sa to ukazalo iba pri prvom spusteni
                    showGameInstructions = false;
                }
            }
            else
            {
                noPictureLabel.Visible = true;
                // MessageBox.Show("Nebol vybraný obrazok!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
 // Button = restart hry, vygeneruju sa nove nahodne pozicie pre puzzle kusky
 private void button3_Click(object sender, EventArgs e)
 {
     gameData.bucketOfPieces.Clear();
     // zrusime susedov
     foreach (var piece in gameData.Pieces)
     {
         piece.LeftNeighbor   = null;
         piece.TopNeighbor    = null;
         piece.RightNeighbor  = null;
         piece.BottomNeighbor = null;
     }
     PuzzleGameUtilities.RandomizePiecesLocations(gameData);
     gameboard.ResetBackgroundCapture();
 }
        // Button = nova hra, zahodia sa objekty reprezentujuce staru hru, prednastavenia pred dalsou hrou
        private void button4_Click(object sender, EventArgs e)
        {
            // zoomLabel odstranime z panelu3 (tenky pasik)
            this.panel3.Controls.Clear();

            // gameboard sa prestane zobrazovat v panel-y
            this.gameboard.Visible = false;

            // odoberieme gameboard z panela, pred tym nez ho zahodime
            this.panel4.Controls.Remove(PuzzleGameUtilities.ControlByName(panel4, "gameboard"));

            // zahodime staru hraciu plochu
            gameboard = null;

            // zahodime stare data pre hru
            gameData = null;

            // vytvorime nove data pre hru
            gameData = new PuzzleGameData();

            // naspat zobrazime controls pre vyber obrazka
            textBox1.Visible           = true;
            textBox1.Text              = "";
            pictureBox1.Image          = null;
            pictureBox1.Visible        = false;
            choosePictureLabel.Visible = true;
            choosePictureLabel.BringToFront();
            autorLabel.BringToFront();
            autorLabel.Visible = true;

            button1.Visible = true;
            button2.Visible = true;

            panel5.Visible = false;  //obsahuje button3==Restart, button4==NewGame

            if (showGameInstructions)
            {
                showGameInstructions = false;
                this.panel6.Visible  = false;
            }
        }
        // vraci nadobu pod mysou, pouziva funkciu BucketCoordinates
        public static List <PuzzlePiece> BucketUnderMouse(PuzzleGameData data, Point currMouseCoords) //Skupina puzzle kuskov nachadzajuca sa pod suradnicami mysi
        {
            //
            //Vyberame skupinku kuskov najblizsiu k ukazovatelovi mysi (ak skupinka neexistuje, return null).
            //
            List <PuzzlePiece> value;
            Size realPieceSize = data.PieceDimensions;

            realPieceSize.Width  += 2 * data.PieceSurroundingSize;
            realPieceSize.Height += 2 * data.PieceSurroundingSize;

            Point bucketCoords = PuzzleGameUtilities.BucketCoordinates(realPieceSize, currMouseCoords);

            if (data.bucketOfPieces.TryGetValue(bucketCoords, out value))
            {
                return(value);
            }
            else
            {
                return(null);
            }
        }