Beispiel #1
0
        public List <Movimiento> VerificarAmenaza(Rey pieza, List <Movimiento> movimientos)
        {
            Celda celdaActual = this.getCelda(pieza);
            Celda celdaAMover = null;

            foreach (Movimiento mov in movimientos)
            {
                foreach (Pieza p in piezas)
                {
                    if (p.Color != pieza.Color && pieza.Activa == true)
                    {
                        celdaAMover = this.getCelda(celdaActual, mov);
                        foreach (Celda celdaDisp in p.getCeldasDestino(this, this.getCelda(p)))
                        {
                            if (celdaAMover.Equals(celdaDisp))
                            {
                                if (movimientos.Contains(mov))
                                {
                                    movimientos.Remove(mov);
                                }
                            }
                        }
                    }
                }
            }

            return(movimientos);
        }
Beispiel #2
0
        public List <Movimiento> VerificarEnroque(Rey pieza, List <Movimiento> movimientos)
        {
            Celda      celdaAMover   = null;
            Celda      celdaActual   = this.getCelda(pieza);
            Movimiento mov1          = movimientos.Where(m => m.Vertical == 0 && m.Horizontal == 2).FirstOrDefault();
            Movimiento mov2          = movimientos.Where(m => m.Vertical == 0 && m.Horizontal == -2).FirstOrDefault();
            Movimiento movimientoRey = (from Movimiento m in partida.Movimientos
                                        where m.Pieza == pieza
                                        select m).FirstOrDefault();

            Movimiento mov = new Movimiento();

            mov.Vertical   = 0;
            mov.Horizontal = -4;

            movimientos = this.VerificarMovimiento(celdaActual, mov, movimientoRey, movimientos, mov2);

            mov.Vertical   = 0;
            mov.Horizontal = 3;

            movimientos = this.VerificarMovimiento(celdaActual, mov, movimientoRey, movimientos, mov1);

            //Verifica que no haya piezas de por medio

            if (movimientos.Contains(mov1) || movimientos.Contains(mov2))
            {
                bool removerMov1 = false;
                bool removerMov2 = false;
                for (int i = 0; i < 2; i++)
                {
                    mov.Vertical   = 0;
                    mov.Horizontal = 1;

                    if (celdaAMover == null)
                    {
                        celdaAMover = this.getCelda(celdaActual, mov);
                    }
                    else
                    {
                        celdaAMover = this.getCelda(celdaAMover, mov);
                    }


                    if (!this.VerificarCeldaDisponible(celdaAMover))
                    {
                        removerMov1 = true;
                    }
                }

                for (int i = 0; i < 3; i++)
                {
                    mov.Vertical   = 0;
                    mov.Horizontal = -1;

                    if (celdaAMover == null)
                    {
                        celdaAMover = this.getCelda(celdaActual, mov);
                    }
                    else
                    {
                        celdaAMover = this.getCelda(celdaAMover, mov);
                    }


                    if (!this.VerificarCeldaDisponible(celdaAMover))
                    {
                        removerMov2 = true;
                    }
                }

                if (removerMov1)
                {
                    movimientos.Remove(mov1);
                }
                if (removerMov2)
                {
                    movimientos.Remove(mov2);
                }
            }

            //Verificar si ya realizo un movimiento


            if (movimientos.Contains(mov1) || movimientos.Contains(mov2))
            {
                foreach (Pieza p in piezas)
                {
                    if (p.Color != pieza.Color && pieza.Activa == true)
                    {
                        Celda celda = this.getCelda(p);

                        //Verifica si el rey esta en jaque actualmente
                        foreach (Celda celdaDisp in p.getCeldasDestino(this, celda))
                        {
                            if (celdaActual.Equals(celdaDisp))
                            {
                                movimientos.Remove(mov1);
                                movimientos.Remove(mov2);
                            }
                        }

                        //Verifica si el rey esta amenazado al moverse
                        for (int i = 0; i < 2; i++)
                        {
                            Movimiento movimientoARealizar = new Movimiento();
                            movimientoARealizar.Vertical   = 0;
                            movimientoARealizar.Horizontal = 1;
                            if (celdaAMover == null)
                            {
                                celdaAMover = this.getCelda(celdaActual, movimientoARealizar);
                            }
                            else
                            {
                                celdaAMover = this.getCelda(celdaAMover, movimientoARealizar);
                            }

                            foreach (Celda celdaDisp in p.getCeldasDestino(this, celda))
                            {
                                if (celdaAMover.Equals(celdaDisp))
                                {
                                    movimientos.Remove(mov1);
                                }
                            }
                        }

                        celdaAMover = null;
                        for (int i = 0; i < 2; i++)
                        {
                            Movimiento movimientoARealizar = new Movimiento();
                            movimientoARealizar.Vertical   = 0;
                            movimientoARealizar.Horizontal = -1;
                            if (celdaAMover == null)
                            {
                                celdaAMover = this.getCelda(celdaActual, movimientoARealizar);
                            }
                            else
                            {
                                celdaAMover = this.getCelda(celdaAMover, movimientoARealizar);
                            }
                            foreach (Celda celdaDisp in p.getCeldasDestino(this, celda))
                            {
                                if (celdaAMover.Equals(celdaDisp))
                                {
                                    movimientos.Remove(mov2);
                                }
                            }
                        }
                    }
                }
            }

            return(movimientos);
        }