示例#1
0
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            larguraF = (sender as PictureBox).Width / 10F;
            alturaF  = (sender as PictureBox).Height / 10F;

            if (navio != default(TipoDeNavio))
            {
                Image img = Image.FromFile(navio.ToString() + ".png");

                if (frmNavios.Direcao == 0)
                {
                    if (10 - navio.Tamanho() < y1)
                    {
                        y1 = 10 - navio.Tamanho();
                    }

                    e.Graphics.DrawImage(img, new RectangleF(larguraF * x1, alturaF * y1, larguraF, alturaF * navio.Tamanho()));
                }
                else
                {
                    if (10 - navio.Tamanho() < x1)
                    {
                        x1 = 10 - navio.Tamanho();
                    }

                    img.RotateFlip(RotateFlipType.Rotate270FlipNone);
                    e.Graphics.DrawImage(img, new RectangleF(larguraF * x1, alturaF * y1, larguraF * navio.Tamanho(), alturaF));
                }
            }

            foreach (KeyValuePair <int[], TipoDeNavio> barco in tabuleiro.Navios)
            {
                if (barco.Key[2] == 0)
                {
                    e.Graphics.DrawImage(Image.FromFile(barco.Value.ToString() + ".png"), new RectangleF(larguraF * barco.Key[0], alturaF * barco.Key[1], larguraF, alturaF * barco.Value.Tamanho()));
                }
                else
                {
                    Image img = Image.FromFile(barco.Value.ToString() + ".png");
                    img.RotateFlip(RotateFlipType.Rotate270FlipNone);
                    e.Graphics.DrawImage(img, new RectangleF(larguraF * barco.Key[0], alturaF * barco.Key[1], larguraF * barco.Value.Tamanho(), alturaF));
                }
            }

            foreach (Tiro tiroRecebido in tirosRecebidos)
            {
                ResultadoDeTiro tiroRes = tabuleiro.Atirar(tiroRecebido.X, tiroRecebido.Y);
                Image           tiro    = tiroPreto;
                switch (tiroRes)
                {
                case ResultadoDeTiro.Errou:
                    tiro = tiroVerde;
                    break;

                case ResultadoDeTiro.Acertou:
                    tiro = tiroVermelho;
                    break;

                case ResultadoDeTiro.Afundou:
                    tiro = tiroPreto;
                    break;
                }
                e.Graphics.DrawImage(tiro, tiroRecebido.X * larguraF, tiroRecebido.Y * alturaF, larguraF, alturaF);
            }

            for (int i = 1; i < 10; i++)
            {
                e.Graphics.DrawLine(new Pen(Color.Black, 2F), larguraF * i, 0, larguraF * i, (sender as PictureBox).Height - 1);
                e.Graphics.DrawLine(new Pen(Color.Black, 2F), 0, alturaF * i, (sender as PictureBox).Width - 1, alturaF * i);
            }

            if (x1 != -1)
            {
                e.Graphics.DrawImage(miraVerde, x1 * larguraF, y1 * alturaF, larguraF, alturaF);
            }
        }
示例#2
0
        /// <summary>
        /// Posiciona um navio no mapa com a primeira posição dada por X e Y e
        /// a direção por d.
        ///
        /// A direção
        /// </summary>
        /// <param name="tipo">Tipo de navio a ser posicionado</param>
        /// <param name="x">Posição X do navio</param>
        /// <param name="y">Posição Y do navio</param>
        /// <param name="d">Direção do navio.</param>
        /// <exception cref="IndexOutOfRangeException">Se o navio sair dos limites do mapa</exception>
        /// <exception cref="ArgumentException">Se a direção for inválida</exception>
        /// <exception cref="Exception">Se o navio interseccionar com outro ou o tabuleiro já tiver navios demais do tipo passado</exception>
        public void PosicionarNavio(TipoDeNavio tipo, int x, int y, Direcao d)
        {
            if (Contar(tipo) == tipo.Limite())
            {
                throw new Exception("O tabuleiro já tem navios demais desse tipo");
            }

            // Determina o incremento na posição X e Y para a direção dada
            int ix = 0, iy = 0;

            switch ((int)d)
            {
            case 0:
                iy = 1;
                break;

            case 1:
                ix = -1;
                break;

            case 2:
                iy = -1;
                break;

            case 3:
                ix = 1;
                break;

            default:
                throw new ArgumentException("Direção inválida");
            }

            // Gera as células para o navio
            int len = tipo.Tamanho();

            Celula[] celulas = new Celula[len];

            for (int i = celulas.Length - 1; i >= 0; i--)
            {
                int nx = x + ix * i, ny = y + iy * i;
                if (nx < 0 || nx >= NumeroDeColunas || ny < 0 || ny >= NumeroDeLinhas)
                {
                    throw new Exception("Navio fora do tabuleiro");
                }
                celulas[i] = new Celula(nx, ny, tipo, null, i == celulas.Length - 1 ? null : celulas[i + 1]);
            }

            // Define a primeiro célula do navio para cada célula do navio e verifica intersecção
            foreach (Celula celula in celulas)
            {
                celula.PrimeiraDoNavio = celulas[0];   // Define o ponteiro para a primeira célula do navio posicionado

                if (this[celula.Linha, celula.Coluna] != null)
                {
                    throw new Exception("Intersecção de navios");
                }
            }

            // Posiciona as células na matriz
            foreach (Celula celula in celulas)
            {
                this[celula.Linha, celula.Coluna] = celula;
            }

            Navios.Add(new int[] { x, y, (int)d }, tipo);
        }