Exemple #1
0
        private void Speler_Zet(object sender, Zet zet)
        {
            if (sender is string)
            {
                if (zet.van == null)
                {
                    bord.VoerUit(zet);                                  // vanuit doos.
                }
                else
                {
                    bord.Herstel(zet);                                  // Berg op in doos verwijder stuk van bord.
                }
            }
            else
            {
                //V140 if (zet.van.stuk.kleur == AanZet && !Mat) // Als speler aanzet is en niet mat staat.
                if (zet.van.stuk.kleur == AanZet) // Als speler aanzet is .
                {
                    bord.VoerUit(zet);
                    if (Schaak) //V136
                    {
                        if (zet.van.stuk.type == StukType.Koning)
                        {
                            MessageBox.Show("Je mag jezelf niet schaak zetten!");
                        }
                        else if (Mat)
                        {
                            MessageBox.Show("Einde oefening. Nog een keer?", "Het is MAT.");
                        }
                        else
                        {
                            MessageBox.Show(@"1) Probeer het stuk te slaan. 
2) Probeer er een stuk tussen te zetten. 
3) Of zet koning een stapje opzij.", "Je staat schaak!");
                        }
                        //MessageBox.Show("Je mag jezelf niet schaak zetten!");
                        bord.Herstel(zet);
                        speler.Herstel(zet);
                        clock.Toon(AanZet);
                    }
                    else
                    {
                        notation.Noteer(zet);                           //V111
                        AanZet = !AanZet;
                        if (mensTegenComputerToolStripMenuItem.Checked) //V142
                        {
                            ComputerZet();
                        }
                    }
                }
                else
                {
                    My.Status("{0} is aan zet.", AanZet?"Wit":"Zwart");
                    speler.Herstel(zet);
                }
            }
        }
Exemple #2
0
 private void TestDameZet()
 {
     bord.Load(@"
     8 . . . . . . . . ;
     7 . . . . . . . . ;
     6 . . .-p . . . . ;
     5 . . . .+D . . . ;
     4 . . . . . . . . ;
     3 .+p . . . . . . ;
     2 . . . . . . . . ;
     1 . . . . . . . . ;
       a b c d e f g h ");
     computer.maxPly = 2;
     zet             = computer.BedenkBesteZet(Kleur.WIT);
     bord.VoerUit(zet);
     //bord.Show();
     bord.Herstel(zet);
     zet.Show(0, 0, computer.bestEval);
     Debug.Assert(computer.count == 4, "count <> 5.");
 }
Exemple #3
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);
        }