Пример #1
0
        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);
        }
Пример #2
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);
        }
Пример #3
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);
        }
Пример #4
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);
        }