Exemple #1
0
        public bool IsSchaak(bool kleur)
        {
            //
            // bepaal veld coordinate van koning..
            //
            //int x = 4;
            //int y = kleur ? 7 : 0;

            Point k = GetCoorKoning(kleur);
            int   x = k.X;
            int   y = k.Y;
            //
            // Vervang koning door Paard en Dame en test of geslagen stuk van eenzelfde soort is.
            //
            Veld paardVeld = new Veld(x, y, kleur, StukType.Paard);
            Veld dameVeld  = new Veld(x, y, kleur, StukType.Dame);

            //
            // Herhaal voor Paard en Dame
            //
            foreach (Zet zet in DoeEenZet(paardVeld))
            {
                if (zet.naar.stuk.type == StukType.Paard)
                {
                    return(true);
                }
            }
            foreach (Zet zet in DoeEenZet(dameVeld))
            {
                if (zet.naar.stuk.type == StukType.Dame)
                {
                    return(true);
                }
                if (zet.naar.stuk.type == StukType.Loper && IsDiagonaal(zet))
                {
                    return(true);
                }
                if (zet.naar.stuk.type == StukType.Toren && !IsDiagonaal(zet))
                {
                    return(true);
                }
                if (zet.naar.stuk.type == StukType.Koning && IsEen(zet))
                {
                    return(true);                                                     //V141
                }
                if (zet.naar.stuk.type == StukType.pion && IsDiagonaal1(zet))
                {
                    return(true);
                }
            }
            return(false);
        }
Exemple #2
0
        private void VerwijderShapeOpVanVeld(Veld vanveld) //V135
        {
            OvalShape shape = getShape(vanveld);

            if (shape != null)
            {
                shape.Left -= 10;
                shape.Top  -= 10;
                shape.Select();
                MessageBox.Show("Mag dit stuk weer in de doos?");
                doos.BergOp(shape);
            }
        }
Exemple #3
0
        /// <summary>
        /// Return shape at veld location
        /// </summary>
        public OvalShape getShape(Veld veld)
        {
            Point location = getBordLocation(veld.x, veld.y);

            //Console.Write();
            foreach (SimpleShape shape in shapeContainer.Shapes)
            {
                //Console.WriteLine("shapecontainer: {0} loc={1}",shape.Name,shape.Location );
                if (shape.Location == location)
                {
                    //Console.WriteLine("getshape {0} at {1} found",shape.Name, location);
                    return(shape as OvalShape);
                }
            }
            //Console.WriteLine("not found");
            return(null);
        }
Exemple #4
0
        //
        //  zetten:d2.d4;-Pb8.c6;Pb1.d2;-Ta8.b8;e2.e4;-pa7.a6;f2.f4;-pa6.a5;e4.e5;-Pc6*d4;
        //
        public Zet(string zetLong) //V120
        {
            string[] velden;
            bool     kleur = !zetLong.StartsWith("-");
            bool     slag  = zetLong.Contains("*");

            if (slag)
            {
                velden = zetLong.Split('*');
            }
            else
            {
                velden = zetLong.Split('.');
            }
            van      = new Veld(velden[0], new Stuk(kleur, zetLong[kleur?0:1]));
            naar     = new Veld(velden[1], new Stuk(!kleur, zetLong[zetLong.Length - 3]));
            castling = van.stuk.type == StukType.Koning && Math.Abs(van.x - naar.x) == 2;
            promotie = van.stuk.type == StukType.pion && (naar.y == 0 || naar.y == 7);
        }
Exemple #5
0
        private int BedenkBesteZet(bool kleur, int AlphaBetaEval, int ply)
        {
            int eval, bestEval = -1000; // Initieel nog geen beste zet gevonden.

            //
            // Herhaal voor ieder veld op het bord. Origin links boven x,y = (0,0).
            //
            for (int x = 0; x < 8; x++)
            {
                for (int y = 0; y < 8; y++)
                {
                    if (Bord.veld[x, y] != 0)
                    {
                        if (Bord.veld[x, y] > 0 == kleur)
                        {
                            //
                            // Doe een willekeurige zet vanuit huidig veld en bepaal evaluatie.
                            //
                            Veld huidigveld = new Veld(x, y);
                            foreach (Zet zet in DoeEenZet(huidigveld))
                            {
                                count++;                                                     //if (count == -107772) Console.WriteLine(zet);//For test only.
                                bord.VoerUit(zet);                                           //stack[ply] = zet; //For test only.
                                //bord.Show();
                                if ((ply >= maxPly || zet.mat))
                                {
                                    eval = bord.Evalueer(kleur); if (zet.mat)
                                    {
                                        eval -= ply * 10;                           //V119     //if (eval >0) { bord.Show(); }
                                    }
                                }
                                else
                                {
                                    eval = BedenkBesteZet(!kleur, -bestEval, ply + 1);
                                }
                                //stack[ply] = null;//For test only.
                                bord.Herstel(zet);
                                if (ply == 1 && debug)
                                {
                                    zet.Show(count, ply, eval);
                                }
                                //if (ply == 1 || count == -107772)				//|| (ply == 2 && count >= 96733 && count <= 119692)//|| (ply == 3 && count >= 100380 && count <= 107772)//|| (ply == 4 && count >= 106553 && count <= 107772))//{zet.Show(count, ply, eval); if (ply != 1) Console.Write(""); ;}
                                if (eval > bestEval)
                                {
                                    if (ply == 1)
                                    {
                                        this.besteZet = zet.Clone();
                                        this.bestEval = eval;
                                    }
                                    //
                                    // Alpha-Beta algoritme.
                                    // Als Zwart een zet kan doen waardoor Wit zijn vorige zet niet gedaan zou hebben
                                    // stop dan met zoeken in rest van deze boom (prune tree).
                                    //
                                    if (eval >= AlphaBetaEval || zet.mat) // breek ook af als geen zet mogelijkheid voor tegenpartij ( eval is 1000 ) dus AlphaBetaEval = 1000 // || (ply >1 && eval > 50))
                                    {
                                        return(-eval);
                                    }
                                    bestEval = eval;
                                }
                            }
                        }
                    }
                }
            }
            //
            // Min-Max algoritme.
            // Een positieve evaluatie voor WIT is negatief voor ZWART.
            //
            return(-bestEval);
        }
Exemple #6
0
        public IEnumerable <Zet> DoeEenZet(Veld huidigveld)
        {
            Zet zet = new Zet();

            zet.van = huidigveld;
            Stuk stuk = huidigveld.stuk;

            Point[] direction = DirectionTable[(stuk.type == StukType.pion && stuk.kleur == Kleur.ZWART)?0:(int)stuk.type];
            int     steps     = (stuk.type == StukType.Dame ||
                                 stuk.type == StukType.Toren ||
                                 stuk.type == StukType.Loper)? 8 : 1; // 7 is voldoende.

            //
            // Herhaal voor iedere zetrichting tot bezet veld of buiten bord.
            //
            for (int richting = 0; richting < direction.Length; richting++)
            {
                for (int step = 1; step <= steps; step++)
                {
                    int x = zet.van.x + step * direction[richting].X;
                    int y = zet.van.y + step * direction[richting].Y;
                    if (BuitenBord(x, y))
                    {
                        break;
                    }
                    #region Pion en Koning
                    if (stuk.type == StukType.pion)
                    {
                        zet.promotie = (y == 0 || y == 7);
                        if (zet.van.y != 1 && zet.van.y != 6 && richting == 3)
                        {
                            yield break;                                                    // Pion alleen 2 vooruit vanaf rij 1 of 6
                        }
                    }
                    if (stuk.type == StukType.Koning && richting < 2)                     //V105 Castling.
                    {
                        if (zet.van.x != 4 || (zet.van.y != ((stuk.kleur)?7:0)))
                        {
                            break;
                        }
                        bool longCastling = x < 4;
                        if (longCastling)
                        {
                            if (Bord.veld[0, y] != ((int)StukType.Toren) * ((stuk.kleur) ? 1 : -1))
                            {
                                break;
                            }
                            if (Bord.veld[1, y] != 0)
                            {
                                break;
                            }
                            if (Bord.veld[2, y] != 0)
                            {
                                break;
                            }
                            if (Bord.veld[3, y] != 0)
                            {
                                break;
                            }
                        }
                        else
                        {
                            if (Bord.veld[5, y] != 0)
                            {
                                break;
                            }
                            if (Bord.veld[6, y] != 0)
                            {
                                break;
                            }
                            if (Bord.veld[7, y] != ((int)StukType.Toren) * ((stuk.kleur) ? 1 : -1))
                            {
                                break;
                            }
                        }
                        //
                        // Staat koning schaak? --> Dan geen roccade.
                        //
                        if (IsSchaak(stuk.kleur))
                        {
                            break;                       //V139
                        }
                        zet.naar     = new Veld(x, y);
                        zet.castling = true;
                        yield return(zet);

                        zet.castling = false;
                        break;
                    }
                    #endregion
                    if (Bord.veld[x, y] == 0)
                    {
                        if (stuk.type == StukType.pion && richting < 2)
                        {
                            break;
                        }
                        zet.naar = new Veld(x, y);
                        yield return(zet);
                    }
                    else // Naar veld bevat een stuk.
                    {
                        if (stuk.type == StukType.pion && richting >= 2)
                        {
                            yield break;                                  // V104 Zoek niet verder in andere richtingen.
                        }
                        if (huidigveld.stuk.kleur == Bord.veld[x, y] < 0) //SLAG
                        {
                            zet.naar = new Veld(x, y);
                            yield return(zet);
                        }
                        break;
                    }
                }
            }
        }
Exemple #7
0
 public Zet(string s, bool kleur)
 {
     van  = new Veld(s, new Stuk(kleur, s[0]));
     naar = new Veld(s.Substring(2), new Stuk(kleur, '.'));
 }
Exemple #8
0
 public bool IsEquals(Veld veld)
 {
     return(x == veld.x && y == veld.y && stuk.IsEqual(veld.stuk));
 }