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); }
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); } }
/// <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); }
// // 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); }
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); }
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; } } } }
public Zet(string s, bool kleur) { van = new Veld(s, new Stuk(kleur, s[0])); naar = new Veld(s.Substring(2), new Stuk(kleur, '.')); }
public bool IsEquals(Veld veld) { return(x == veld.x && y == veld.y && stuk.IsEqual(veld.stuk)); }