示例#1
0
        private List <Movimiento> VerificarMovimiento(Celda celdaActual, Movimiento mov, Movimiento movimientoRey, List <Movimiento> movimientos, Movimiento movAEliminar)
        {
            Celda c = this.getCelda(celdaActual, mov);

            Movimiento movimientoTorre = (from Movimiento mt in partida.Movimientos
                                          where mt.Pieza == c.Pieza
                                          select mt).FirstOrDefault();

            if (movimientoRey != null || movimientoTorre != null)
            {
                movimientos.Remove(movAEliminar);
            }

            return(movimientos);
        }
示例#2
0
        public Celda getCelda(Celda celdaActual, Movimiento movimiento)
        {
            Pieza pieza = celdaActual.Pieza;

            if (pieza == null)
            {
                return(null);
            }

            int   horizontal = celdaActual.Columna + movimiento.Horizontal;
            int   vertical   = (pieza.PosicionInicial.Equals(ARRIBA) ? celdaActual.Fila - movimiento.Vertical : celdaActual.Fila + movimiento.Vertical);
            Celda celda      = (from Celda cel in celdas
                                where cel.Columna == horizontal && cel.Fila == vertical
                                select cel).FirstOrDefault();

            return(celda);
        }
示例#3
0
        public override List <Celda> getCeldasDestino(Tablero tablero, Celda celdaActual)
        {
            Celda celda = this.VerificarSiPuedeEnrocar(tablero);

            if (celda != null)
            {
                celdasDisponibles.Add(celda);
            }
            else
            {
                celdasDisponibles.AddRange(base.PosiblesDestinos(tablero, celdaActual, 0, -1));
                celdasDisponibles.AddRange(base.PosiblesDestinos(tablero, celdaActual, 0, 1));
                celdasDisponibles.AddRange(base.PosiblesDestinos(tablero, celdaActual, 1, 0));
                celdasDisponibles.AddRange(base.PosiblesDestinos(tablero, celdaActual, -1, 0));
            }

            return(celdasDisponibles);
        }
示例#4
0
        public void Mover(Pieza pieza, Tablero tablero, Celda celdaActual, Celda celdaDestino)
        {
            Pieza existePieza = (from Pieza p in piezas
                                 where p == pieza
                                 select p).FirstOrDefault();

            if (existePieza != null)
            {
                piezaJaque = null;
                if (pieza.Mover(tablero, celdaActual, celdaDestino, this))
                {
                    bool caballoElegido = false;
                    bool alfilElegido   = false;
                    bool torreElegida   = false;
                    bool damaElegida    = false;
                    //Saco los peones y el rey como piezas coronadoras
                    foreach (Pieza piezaCorona in piezas)
                    {
                        if (piezaCorona is Caballo && !caballoElegido)
                        {
                            caballoElegido = true;
                            piezasCoronacion.Add(piezaCorona);
                        }
                        if (piezaCorona is Alfil && !alfilElegido)
                        {
                            alfilElegido = true;
                            piezasCoronacion.Add(piezaCorona);
                        }
                        if (piezaCorona is Torre && !torreElegida)
                        {
                            torreElegida = true;
                            piezasCoronacion.Add(piezaCorona);
                        }
                        if (piezaCorona is Reina && !damaElegida)
                        {
                            damaElegida = true;
                            piezasCoronacion.Add(piezaCorona);
                        }
                    }
                }
            }
        }
示例#5
0
        public List <Celda> PosiblesDestinos(Tablero tablero, Celda celdaActual, List <Movimiento> movimientos)
        {
            List <Celda> cDisp = new List <Celda>();

            foreach (Movimiento movimiento in movimientos)
            {
                Celda celdaDestino = tablero.getCelda(celdaActual, movimiento);

                if (tablero.VerificarCeldaDisponible(celdaDestino, color))
                {
                    cDisp.Add(celdaDestino);
                    celdasDisponibles.Add(celdaDestino);
                }

                //Verifica solo las celdas disponibles que apuntan al Rey contrario
                if (celdaDestino.Pieza != null && celdaDestino.Pieza is Rey && celdaDestino.Pieza.Color != this.color)
                {
                    celdasDispJaqueRey.Add(celdaDestino);
                }
            }
            return(cDisp);
        }
示例#6
0
 public override List <Celda> getCeldasDestino(Tablero tablero, Celda celdaActual)
 {
     return(base.PosiblesDestinos(tablero, celdaActual, movimientos));
 }
示例#7
0
 public bool Mover(Tablero tablero, Celda celdaActual, Celda celdaDestino, Jugador jugador)
 {
     return(tablero.ModificarPosicionPieza(celdaActual, celdaDestino, jugador));
 }
示例#8
0
 public abstract List <Celda> getCeldasDestino(Tablero tablero, Celda celdaActual);
示例#9
0
文件: Peon.cs 项目: eceluci09/ajedrez
        public override List <Celda> getCeldasDestino(Tablero tablero, Celda celdaActual)
        {
            Movimiento movimiento = new Movimiento();

            movimiento.Horizontal = 0;
            movimiento.Vertical   = -2;
            bool startPosition = false;

            if (tablero.getCelda(celdaActual, movimiento) == null)
            {
                startPosition = true;
            }

            movimiento.Horizontal = 0;
            movimiento.Vertical   = 1;

            Celda celdaDestino = tablero.getCelda(celdaActual, movimiento);

            if (celdaDestino != null && celdaDestino.Pieza == null)
            {
                celdasDisponibles.Add(celdaDestino);

                if (startPosition)
                {
                    movimiento.Horizontal = 0;
                    movimiento.Vertical   = 2;

                    celdaDestino = tablero.getCelda(celdaActual, movimiento);
                    if (celdaDestino != null && celdaDestino.Pieza == null)
                    {
                        celdasDisponibles.Add(celdaDestino);
                    }
                }
            }

            movimiento.Horizontal = -1;
            movimiento.Vertical   = 1;

            celdaDestino = tablero.getCelda(celdaActual, movimiento);
            if (celdaDestino != null && celdaDestino.Pieza != null && celdaDestino.Pieza.Color != color)
            {
                celdasDisponibles.Add(celdaDestino);
            }
            Celda celdaHayPeonContrario = null;

            //Peon al paso
            if ((this.PosicionInicial.Equals("ARRIBA") && celdaActual.Fila == 4) || (this.PosicionInicial.Equals("ABAJO") && celdaActual.Fila == 5))
            {
                movimiento.Horizontal = -1;
                movimiento.Vertical   = 0;
                celdaHayPeonContrario = tablero.getCelda(celdaActual, movimiento);
            }
            if (celdaHayPeonContrario != null && celdaHayPeonContrario.Pieza != null && celdaHayPeonContrario.Pieza is Peon && celdaHayPeonContrario.Pieza.Color != this.color)
            {
                celdasDisponibles.Add(celdaDestino);
            }

            movimiento.Horizontal = 1;
            movimiento.Vertical   = 1;

            celdaDestino = tablero.getCelda(celdaActual, movimiento);
            if (celdaDestino != null && celdaDestino.Pieza != null && celdaDestino.Pieza.Color != color)
            {
                celdasDisponibles.Add(celdaDestino);
            }
            if ((this.PosicionInicial.Equals("ARRIBA") && celdaActual.Fila == 4) || (this.PosicionInicial.Equals("ABAJO") && celdaActual.Fila == 5))
            {
                movimiento.Horizontal = 1;
                movimiento.Vertical   = 0;
                celdaHayPeonContrario = tablero.getCelda(celdaActual, movimiento);
            }
            if (celdaHayPeonContrario != null && celdaHayPeonContrario.Pieza != null && celdaHayPeonContrario.Pieza is Peon && celdaHayPeonContrario.Pieza.Color != this.color)
            {
                celdasDisponibles.Add(celdaDestino);
            }

            return(celdasDisponibles);
        }
示例#10
0
        public bool ModificarPosicionPieza(Celda actual, Celda destino, Jugador jug)
        {
            bool  coronacion = false;
            Pieza pieza      = actual.Pieza;

            actual.Pieza = null;
            Jugador jugadorRival = null;
            Pieza   piezaComida  = null;

            if (destino.Pieza != null)
            {
                if (jug.Equals(partida.Jugador1))
                {
                    piezaComida = (from Pieza p in partida.Jugador2.Piezas
                                   where p.Equals(destino.Pieza)
                                   select p).FirstOrDefault();

                    jugadorRival = partida.Jugador2;
                }
                else
                {
                    piezaComida = (from Pieza p in partida.Jugador1.Piezas
                                   where p.Equals(destino.Pieza)
                                   select p).FirstOrDefault();

                    jugadorRival = partida.Jugador1;
                }

                piezaComida.Activa = false;

                piezaComida = (from Pieza p in piezas
                               where p.Equals(piezaComida)
                               select p).FirstOrDefault();

                piezaComida.Activa = false;
            }
            //Verifica si el peon comio con el peon al paso
            if (pieza is Peon)
            {
                Movimiento mov = new Movimiento();
                mov.Horizontal = 0;
                mov.Vertical   = -1;

                Celda celdaAnterior = this.getCelda(actual, mov);

                if (celdaAnterior.Pieza != null && celdaAnterior.Pieza is Peon && celdaAnterior.Pieza.Color != pieza.Color)
                {
                    piezaComida = (from Pieza p in piezas
                                   where p.Equals(celdaAnterior.Pieza)
                                   select p).FirstOrDefault();

                    piezaComida.Activa = false;
                }

                coronacion = this.VerificarCoronacion((Peon)pieza, destino);
            }

            destino.Pieza = pieza;
            partida.RegistrarMovimiento(actual, destino);
            this.VerificarMovimiento(actual, destino, pieza, jug);
            string tipo = (!coronacion) ? this.verificarJaqueOJaqueMate(jug, pieza) : string.Empty;

            if (tipo.Equals("JAQUE"))
            {
                jugadorRival.PiezaJaque = pieza;
            }

            partida.ChequearGanador(tipo, jug);

            return(coronacion);
        }
示例#11
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);
        }
示例#12
0
 public void SeleccionarPiezaCorona(Tablero tablero, Pieza pieza, Celda destino)
 {
     tablero.IntercambiarPieza(pieza, destino, this);
 }