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); } } }
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."); }
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); }