public void setMineFields(PartidaForm form, bool opponentBoard)
        {
            mineFields = new MineField[rows, columns];
            int    startVerticalPosition   = startPositionY;
            int    startHorizontalPosition = startPositionX;
            int    number   = 1;
            string boardBtn = "board2_";

            if (opponentBoard)
            {
                boardBtn = "board1_";
            }

            for (int y = 0; y < rows; y++)
            {
                for (int x = 0; x < columns; x++)
                {
                    mineFields[y, x] = new MineField();

                    mineFields[y, x].createButton(boardBtn, number, form, opponentBoard,
                                                  startVerticalPosition, startHorizontalPosition);

                    startHorizontalPosition += addWidth;
                    number++;
                }

                startHorizontalPosition = startPositionX;
                startVerticalPosition  += addHeight;
            }
        }
        public void dragOverMineField(object sender, DragEventArgs e)
        {
            string data = e.Data.GetData(DataFormats.Text).ToString();

            string[] values        = data.Split(';');
            int[]    dragPositions = { int.Parse(values[1]), int.Parse(values[2]) };

            Button btn    = (Button)sender;
            int    number = int.Parse(btn.Name.Substring(btn.Name.IndexOf("_") + 1));

            int[] dropPositions = tabuleiro.getMineFieldPosition(number);

            dropPositions    = getStartShipPositions(dragPositions, dropPositions);
            int[,] positions = getShipFields(int.Parse(values[0]), ref dropPositions[0], ref dropPositions[1]);

            for (int cont = 0; cont < positions.GetLength(0); cont++)
            {
                MineField mine = tabuleiro.getMineFields()[positions[cont, 0], positions[cont, 1]];

                Button dropBtn = mine.btn;
                dropBtn.FlatAppearance.BorderSize = 3;

                if (allowDrop)
                {
                    //mine.btn.AllowDrop = true;
                    dropBtn.FlatAppearance.BorderColor = Color.Blue;
                }
                else
                {
                    //mine.btn.AllowDrop = false;
                    dropBtn.FlatAppearance.BorderColor = Color.Red;
                }
            }
        }
        public void btn_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                if (vertical)
                {
                    vertical = false;
                }
                else
                {
                    vertical = true;
                }
            }

            Button btn    = (Button)sender;
            int    number = int.Parse(btn.Name.Substring(btn.Name.IndexOf("_") + 1));

            int[]     Positions = tabuleiro.getMineFieldPosition(number);
            MineField mine      = tabuleiro.getMineFields()[Positions[0], Positions[1]];

            if (mine.isShip())
            {
                string data = mine.getShipName().ToString() + ";";
                data += Positions[0].ToString() + ";" + Positions[1].ToString();

                this.DoDragDrop(data, DragDropEffects.Copy);
            }
        }
        public void btn_Mina_Click(object sender, EventArgs e)
        {
            if (yourTurn)
            {
                Button    btn        = (Button)sender;
                int       Position   = int.Parse(btn.Name.Substring(btn.Name.IndexOf("n") + 1));
                int[]     cordenates = opponentBoard.getMineFieldPosition(Position);
                MineField mine       = opponentBoard.getMineFields()[cordenates[0], cordenates[1]];

                if (!mine.getJogada())
                {
                    mine.setJogada(opponentBoard);
                    if (opponentBoard.getQtdAcertos() == qtdAcertos)
                    {
                        youWin();
                    }

                    string message = cordenates[0].ToString() + ";" +
                                     cordenates[1].ToString() + ";";

                    protocol.sendMessage(clientIP, message);

                    // Se o tiro acertou a água, passa a vez para o adversário
                    if (!mine.isShip())
                    {
                        yourTurn      = false;
                        lbl_Turn.Text = "Espere a jogada do jogador adversário...";
                    }
                }
            }
        }
        private void setShips(int ship, int Y, int X)
        {
            int[,] positions = getShipFields(ship, ref Y, ref X);

            for (int cont = 0; cont < positions.GetLength(0); cont++)
            {
                string shipName = ship.ToString() + "_" + (cont + 1).ToString();

                int       y    = positions[cont, 0];
                int       x    = positions[cont, 1];
                MineField mine = tabuleiro.getMineFields()[y, x];

                mine.setShip(true, shipName, vertical);

                mine.btn.FlatAppearance.BorderSize  = 1;
                mine.btn.FlatAppearance.BorderColor = Color.Black;
            }
        }
        public void setMineFields(Insert_Ships form)
        {
            mineFields = new MineField[rows, columns];
            int startVerticalPosition   = startPositionY;
            int startHorizontalPosition = startPositionX;
            int number = 1;

            for (int y = 0; y < rows; y++)
            {
                for (int x = 0; x < columns; x++)
                {
                    mineFields[y, x] = new MineField();

                    mineFields[y, x].setPlayerField(form, number,
                                                    startVerticalPosition, startHorizontalPosition);

                    startHorizontalPosition += addWidth;
                    number++;
                }

                startHorizontalPosition = startPositionX;
                startVerticalPosition  += addHeight;
            }
        }
        private int[] getStartShipPositions(int[] dragPositions, int[] dropPositions)
        {
            MineField dragMine = tabuleiro.getMineFields()[dragPositions[0], dragPositions[1]];

            for (int x = dragMine.getShipPart(); x > 1; x--)
            {
                if (vertical)
                {
                    if (dropPositions[0] > 0)
                    {
                        dropPositions[0] -= 1;
                    }
                }
                else
                {
                    if (dropPositions[1] > 0)
                    {
                        dropPositions[1] -= 1;
                    }
                }
            }

            return(dropPositions);
        }
        public PartidaForm(TCPIP protocol, string ClientIP, Tabuleiro myBoard)
        {
            InitializeComponent();

            clientIP      = ClientIP;
            this.protocol = protocol;
            this.myBoard  = new Tabuleiro(10, 10);

            if (clientIP != null)   // first player is server side
            {
                yourTurn      = true;
                lbl_Turn.Text = "Sua vez";
            }

            try {
                protocol.setEventsForm2(this);

                this.myBoard.setMineFields(this, false);

                opponentBoard = new Tabuleiro(10, 10);
                opponentBoard.setMineFields(this, true);

                string message = ""; // loop para envio dos navios escolhidos
                for (int y = 0; y < myBoard.getNumberRows(); y++)
                {
                    for (int x = 0; x < myBoard.getNumberColumns(); x++)
                    {
                        MineField mine = myBoard.getMineFields()[y, x];

                        if (mine.isShip())
                        {
                            message += mine.getShipName().ToString();

                            this.myBoard.getMineFields()[y, x].setShip(true, mine.getShip(), mine.isVertical());

                            qtdAcertos++;
                        }
                        else
                        {
                            message += "0";
                        }
                    }
                }

                protocol.sendMessage(clientIP, message);

                if (clientIP == null)
                {
                    MessageBox.Show("Conexão feita com o host.", "Conexão",
                                    MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show("Conexão feita com sucesso. Você é o host", "Conexão",
                                    MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            } catch (Exception ex) {
                MessageBox.Show(ex.Message, ex.GetType().Name,
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }