예제 #1
0
        private string distinguirFicha(Ficha previa, Casilla destino)
        {
            ArrayList j;

            if (previa.color == Ficha.BLANCA)
            {
                j = fichasBlancas;
            }
            else
            {
                j = fichasNegras;
            }

            foreach (Ficha f in j)
            {
                if (f != previa && f.valor == previa.valor)
                {
                    if (f.movimientosPermitidos.Contains(destino))
                    {
                        if (f.miCasilla.posX != previa.miCasilla.posX)
                        {
                            return(NotAlg.fila[previa.miCasilla.posX]);
                        }
                        else
                        {
                            return(NotAlg.columna[previa.miCasilla.posY]);
                        }
                    }
                }
            }

            return("");
        }
예제 #2
0
        private void button1_Click(object sender, EventArgs e)
        {
            switch (comboBox1.SelectedIndex)
            {
            case 0:     // Reina
                seleccionada = new Reina(color, peon.miCasilla);
                break;

            case 1:     // Caballo
                seleccionada = new Caballo(color, peon.miCasilla);
                break;

            case 2:     // Torre
                seleccionada = new Torre(color, peon.miCasilla);
                break;

            case 3:     // Alfil
                seleccionada = new Alfil(color, peon.miCasilla);
                break;

            default:
                break;
            }

            seleccionada.miCasilla.ficha = seleccionada;

            seleccionada.actualizarAmenazas(seleccionada.miCasilla);
            seleccionada.actualizarMovimientos(seleccionada.miCasilla);

            this.Close();
        }
예제 #3
0
파일: Game1.cs 프로젝트: LuisGP/ChessLG
        void mouseFunction()
        {
            mouseState = Mouse.GetState();

            Vector2 pos = new Vector2(mouseState.X, mouseState.Y);

            posRaton = pos;

            if (!finJuego)
            {
                if (mouseState.LeftButton
                    == Microsoft.Xna.Framework.Input.ButtonState.Pressed && selBlock.Count == 0)
                {
                    ficha = tablero.click(pos.X, pos.Y);

                    selBlock.Add(ficha);
                }

                if (mouseState.LeftButton
                    == Microsoft.Xna.Framework.Input.ButtonState.Released && selBlock.Count > 0)
                {
                    selBlock.Clear();
                }
            }
        }
예제 #4
0
        public void actualizarAmenazas()
        {
            Ficha f = null;

            for (int i = 0; i < tablero.Length; i++)
            {
                for (int j = 0; j < tablero[i].Length; j++)
                {
                    f = tablero[i][j].ficha;
                    if (f != null && !tablero[i][j].alPaso)
                    {
                        f.actualizarAmenazas(tablero[i][j]);
                    }
                }
            }
        }
예제 #5
0
        public Ficha click(double x, double y)
        {
            int i = (int)(y / Casilla.LADO);
            int j = (int)(x / Casilla.LADO);

            if (i >= 0 && i < 8 && j >= 0 && j < 8)
            {
                if (selected == tablero[i][j])
                {
                    return(selected.ficha);
                }

                Ficha   previa = null;
                Casilla origen = null;

                if (selected != null)
                {
                    previa = selected.ficha;
                    origen = selected;
                }

                selected = tablero[i][j];

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

                if (moverFicha(previa, origen, selected))
                {
                    // Proximo turno
                    turno = !turno;
                    nTurno++;
                    selected = null;
                    return(null);
                }

                if (selected != null)
                {
                    return(selected.ficha);
                }
            }

            return(null);
        }
예제 #6
0
        public void actualizarMovimientos()
        {
            Ficha f = null;

            // Asegurarse siempre actualizando amenazas
            actualizarAmenazas();

            for (int i = 0; i < tablero.Length; i++)
            {
                for (int j = 0; j < tablero[i].Length; j++)
                {
                    f = tablero[i][j].ficha;
                    if (f != null && !tablero[i][j].alPaso)
                    {
                        f.actualizarMovimientos(tablero[i][j]);
                    }
                }
            }
        }
예제 #7
0
        public bool moverFicha(Ficha previa, Casilla origen, Casilla destino)
        {
            bool enroque = false;

            if (turno == Ficha.BLANCA)
            {
                movimiento = ((nTurno / 2) + 1).ToString() + ". ";
            }
            else
            {
                movimiento += " ";
            }

            if (previa != null)
            {
                if (previa.movimientosPermitidos.Contains(destino))
                {
                    Ficha     comida  = null;
                    ArrayList jugador = null;
                    bool      mov     = previa.movida;
                    bool      paso    = destino.alPaso;

                    movimiento += previa.ToString();

                    // Pueden ir alli varias piezas mias???
                    movimiento += distinguirFicha(previa, destino);

                    if (destino.ficha != null)
                    {
                        destino.ficha.capturada = true;
                        comida = destino.ficha;
                        if (fichasBlancas.Contains(destino.ficha))
                        {
                            fichasBlancas.Remove(destino.ficha);
                            jugador     = fichasBlancas;
                            movimiento += "x";
                        }
                        else if (fichasNegras.Contains(destino.ficha))
                        {
                            fichasNegras.Remove(destino.ficha);
                            jugador     = fichasNegras;
                            movimiento += "x";
                        }

                        // ¿Me comen al paso? Solo peones...
                        try
                        {
                            Peon peon = (Peon)previa;

                            if (destino.ficha.miCasilla != destino)
                            {
                                destino.ficha.miCasilla.ficha = null;
                                destino.alPaso = false;
                            }
                        }
                        catch (Exception)
                        {
                            destino.alPaso = false;
                        }

                        // Me comen habiendo dado doble salto?
                        try
                        {
                            Peon peon = (Peon)destino.ficha;

                            if (peon.alPaso == destino)
                            {
                                peon.posNormal.alPaso = false;
                                peon.posNormal.ficha  = null;
                            }
                        }
                        catch (Exception)
                        {
                        }
                    }

                    movimiento += destino.ToString();

                    destino.ficha = previa;
                    origen.ficha  = null;

                    //selected.ficha.actualizarMovimientos(selected);
                    previa.movida = true;

                    // Fue un enroque?
                    Torre   torre = null;
                    Casilla casT  = null;
                    if (previa.enroque == destino)
                    {
                        try
                        {
                            // Si no es Rey, no fue enroque y saltara la excepcion :)
                            Rey r = (Rey)previa;

                            if (destino.derecha == r.torreC.miCasilla)
                            {
                                casT = r.torreC.miCasilla;
                                moverFicha(r.torreC, r.torreC.miCasilla, r.torreC.enroque);
                                torre      = r.torreC;
                                movimiento = ((nTurno / 2) + 1).ToString() + ". " + NotAlg.ENROQUEC;
                            }
                            else
                            {
                                casT = r.torreL.miCasilla;
                                moverFicha(r.torreL, r.torreL.miCasilla, r.torreL.enroque);
                                torre      = r.torreL;
                                movimiento = ((nTurno / 2) + 1).ToString() + ". " + NotAlg.ENROQUEL;
                            }

                            enroque = true;
                        }
                        catch (Exception)
                        {
                        }
                    }

                    // Fue salto doble de peon?
                    try
                    {
                        Peon peon = (Peon)previa;

                        if (peon.alPaso == destino)
                        {
                            peon.posNormal.ficha  = peon;
                            peon.posNormal.alPaso = true;
                        }
                        else
                        {
                            if (peon.posNormal != null)
                            {
                                peon.posNormal.alPaso = false;
                            }
                            peon.alPaso    = null;
                            peon.posNormal = null;
                        }
                    }
                    catch (Exception)
                    {
                    }

                    actualizarMovimientos();

                    // Evitar autojaque
                    if (esJaque(turno, false))
                    {
                        // Por si acaso
                        destino.ficha  = null;
                        destino.alPaso = paso;

                        // Deshacemos y nos sigue tocando
                        if (comida != null && jugador != null)
                        {
                            comida.capturada = false;
                            jugador.Add(comida);
                            destino.ficha = comida;
                        }

                        origen.ficha  = previa;
                        previa.movida = mov;

                        // Volver a poner variables de "al paso"
                        try
                        {
                            Peon peon = (Peon)previa;
                            if (peon.alPaso == destino)
                            {
                                peon.posNormal.ficha  = null;
                                peon.posNormal.alPaso = false;
                                peon.mov = -1;
                            }
                        }
                        catch (Exception)
                        {
                        }

                        // Si fue enroque, deshacer tambien a la torre
                        // Aunque nunca deberia darse, pues se comprueba
                        // antes que el "camino" no estuviese amenazado
                        if (enroque && casT != null && torre != null)
                        {
                            torre.miCasilla = null;
                            casT.ficha      = torre;
                            torre.miCasilla = casT;
                        }

                        actualizarMovimientos();

                        // Si movemos, deseleccionamos
                        destino.selected = false;
                        return(false);
                    }

                    // Finalmente, promocionamos un peon?
                    try
                    {
                        Peon peon = (Peon)previa;
                        if ((peon.color && peon.miCasilla.posX == 0) ||
                            (!peon.color && peon.miCasilla.posX == 7))
                        {
                            Promocion prom = new Promocion(peon);
                            prom.ShowDialog();

                            if (peon.color)
                            {
                                fichasBlancas.Remove(peon);
                                fichasBlancas.Add(prom.seleccionada);
                            }
                            else
                            {
                                fichasNegras.Remove(peon);
                                fichasNegras.Add(prom.seleccionada);
                            }

                            movimiento += prom.seleccionada.ToString();
                        }
                    }
                    catch (Exception)
                    {
                    }

                    // Si movemos, deseleccionamos
                    destino.selected = false;

                    return(true);
                }
                return(false);
            }
            return(false);
        }