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); } }
/// <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); }