private void TestMat1() { bord.Load(@" 8 . . . . . . . . ; 7 . . . . . .-p-K ; 6 . . . . . . . . ; 5 . .+D . . . . . ; 4 . . . . . . . . ; 3 . . . . . . . . ; 2 . . . . . . . . ; 1 . . . .+T . . . ; a b c d e f g h "); computer.maxPly = 5; //while(true) zet = computer.BedenkBesteZet(Kleur.WIT); string result = ShowZetHistory(zet); Debug.Assert(zet.ToString() == "Dh5", "zet "); //Debug.Assert(computer.bestEval == 1000, "bestEval "); //Debug.Assert(computer.bestEval == 91, "bestEval "); // V103 zet.mat //Debug.Assert(computer.count == 35643, "count <> "); // V102 //Debug.Assert(computer.bestEval == 86, "bestEval "); // V103 (ply >1 && eval > 50) zet.mat -ply //Debug.Assert(computer.count == 81852, "count <> "); // V103 (ply >1 && eval > 50) //Debug.Assert(result == "Zetten: Dh5 Kg8 Te8 Kf8 Te8*Kf6", "result <> "); (ply >1 && eval > 50) // // if (zet.mat) return -eval // Debug.Assert(computer.bestEval == 50, "bestEval "); //Debug.Assert(computer.count == 85803, "count <> "); //V103 Debug.Assert(computer.count == 85226, "count <> "); //V104 Debug.Assert(result == "Zetten: Dh5 Kg8 Te8 Kf8 Te8*Kf8", "result <> "); }
// // Check // Herstel: naarveld <> 0, vanveld = 0 // private bool Check(Zet zet, bool herstel) { int vanStuk = setStuk(zet.van.stuk); int naarStuk = setStuk(zet.naar.stuk); if (herstel) { if (veld[zet.van.x, zet.van.y] == 0 && veld[zet.naar.x, zet.naar.y] == vanStuk * ((zet.promotie)?(int)StukType.Dame:1) && vanStuk * naarStuk <= 0 ) { return(true); } } else { if (veld[zet.van.x, zet.van.y] == vanStuk && veld[zet.naar.x, zet.naar.y] == naarStuk && veld[zet.van.x, zet.van.y] > 0 == zet.van.stuk.kleur && vanStuk * naarStuk <= 0 ) { return(true); } } throw new ArgumentException(); }
// // Herstel zet op het bord. // public void Herstel(Zet zet) { //Check(zet, true); if (zet.naar == null) // stuk naar doos { veld[zet.van.x, zet.van.y] = (int)StukType.geen; return; } veld[zet.van.x, zet.van.y] = setStuk(zet.van.stuk);// ivm promotie veld[zet.naar.x, zet.naar.y]; veld[zet.naar.x, zet.naar.y] = setStuk(zet.naar.stuk); if (zet.promotie) { Stuk dame = new Stuk(zet.van.stuk.kleur, StukType.Dame); evaluatie -= Stuk.Waarde(dame); evaluatie += zet.van.stuk.waarde; } if (zet.castling) //V105 { bool longCastling = zet.naar.x < 4; if (longCastling) { veld[0, zet.van.y] = veld[3, zet.van.y]; veld[3, zet.van.y] = 0; } else { veld[7, zet.van.y] = veld[5, zet.van.y]; veld[5, zet.van.y] = 0; } evaluatie -= (zet.van.stuk.kleur) ? 1 : -1; } evaluatie += zet.naar.stuk.waarde; //Check(zet,false); }
private void TestDefaultBord() { bord = new Bord(); computer = new Computer(bord, 5); zet = computer.BedenkBesteZet(Kleur.WIT); Debug.Assert(zet.ToString() == "b3", "zet "); // V103 Elapsed time: 156 ms Debug.Assert(computer.bestEval == 1, "besteval "); //Debug.Assert(computer.count == 28329, "count "); // Elapsed time: 1078 ms //Debug.Assert(computer.count == 27979, "count "); // V104 Debug.Assert(computer.count == 27966, "count "); // V105++ computer.maxPly = 6; // V102 Elapsed time: 18734 ms // V103 Elapsed time: 1562 ms (Remove EvalueerAbsoluut) // V103 Beste zet: a3 eval: -1, count: 546771, Elapsed time: 1781 ms // V104 Beste zet: a3 eval: -1, count: 518719, Elapsed time: 1703 ms // V105 Beste zet: a3 eval: -1, count: 518719, Elapsed time: 1937 ms // V105 Beste zet: a3 eval: -1, count: 518719, Elapsed time: 1359 ms zonder Check() function //while(true) zet = computer.BedenkBesteZet(Kleur.WIT); Debug.Assert(zet.ToString() == "a3", "zet "); Debug.Assert(computer.bestEval == -1, "besteval <> -1"); //Debug.Assert(computer.count == 546780, "count <>"); //Debug.Assert(computer.count == 546771, "count <>"); // V103 //Debug.Assert(computer.count == 518719, "count <>"); // V104 Debug.Assert(computer.count == 483676, "count <>"); // V105++ }
private void TestMatInZes() { bord.Load(@" 8 .+L . . . .-P . ; 7 . . . . . . .+P ; 6+K .-p+P . . . . ; 5 . . . . .+p . . ; 4+T .-P . .-K . . ; 3 . .+p .+T . .+p ; 2 . . . .-L .+L . ; 1 . .+D . . . . . ; a b c d e f g h "); computer.maxPly = 6; //cross-check probleem. //http://74.125.77.132/search?q=cache:VUBf58WhRAwJ:www.dewilligedame.nl/SCHAAKBOEKEN/Probleemboeken.htm+Mat+In+5+zetten&hl=en&ct=clnk&cd=10 //V105 Beste zet: Le4 eval: 87, count: 27475336, Elapsed time: 76578 ms //V105 Beste zet: Le4 eval: 87, count: 27475336, Elapsed time: 50531 ms zonder Check() function. //V138 Beste zet: Le4 eval: 42, count: 27480455, Elapsed time: 117503 ms //V139 Beste zet: Le4 eval: 42, count: 27480455, Elapsed time: 119378 ms //while(true) zet = computer.BedenkBesteZet(Kleur.WIT); //string result = ShowZetHistory(zet); Debug.Assert(zet.ToString() == "Le4", "zet <> "); Debug.Assert(computer.bestEval == 42, "bestEval "); Debug.Assert(computer.count == 27480455, "count <> "); // V105 //Debug.Assert(result == "Zetten: Le4 Pc4*Pd6 Ld3 Kf4*Te3 Dc1*Ke3", "result <> "); }
private bool IsDiagonaal(Zet zet) { if (zet.van.x == zet.naar.x || zet.van.y == zet.naar.y) { return(false); // Horizontal } return(true); }
private bool IsEen(Zet zet) //V141 { if (Math.Abs(zet.van.x - zet.naar.x) == 1 || Math.Abs(zet.van.y - zet.naar.y) == 1) { return(true); // koning. } return(false); }
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 bool IsDiagonaal1(Zet zet) { if (Math.Abs(zet.van.x - zet.naar.x) == 1 && (zet.van.y - zet.naar.y) == ((zet.naar.stuk.kleur)?-1:1)) { return(true); // V143 } //Math.Abs(zet.van.y - zet.naar.y) == 1) return true; // Pion return(false); }
public void Noteer(Zet zet) { while (stack.Count > stackPointer) { stack.RemoveAt(stackPointer); } ++stackPointer; stack.Add(zet); RemoveFromListview(); add2ListView(zet); ShowZetCursor(); }
public Zet Forward() { Zet zet = null;; if (stackPointer < stack.Count) { stackPointer++; zet = stack[stackPointer - 1]; } ShowZetCursor(); return(zet); }
public Zet Back() { Zet zet = null;; if (stackPointer > 0) { stackPointer--; zet = stack[stackPointer]; } ShowZetCursor(); return(zet); }
static Point[][] DirectionTable = { PionZw, Pion, Paard, Loper, Toren, Dame, Koning }; // pas ook StukType aan! #endregion public bool IsZetAllowed(ref Zet zet) { foreach (Zet legalZet in DoeEenZet(zet.van)) { if (zet.IsEquals(legalZet)) { zet = legalZet; // Add promotion and castling. return(true); } } return(false); }
private void btnForward_Click(object sender, EventArgs e) //V111 { Zet zet = notation.Forward(); if (zet != null) { bord.VoerUit(zet); speler.animate = false; //V145 speler.VoerUit(zet); speler.animate = animationToolStripMenuItem.Checked; //V145 AanZet = !AanZet; } }
private void btnBack_Click(object sender, EventArgs e) { for (int i = 0; i < 1; i++) //V127 //V142+ { Zet zet = notation.Back(); if (zet != null) { bord.Herstel(zet); speler.Herstel(zet); AanZet = !AanZet; //V109 } } }
public string ShowZetHistory(Zet zet) { if (zet == null) { return("geen zet meer"); } int savPly = this.maxPly; int savCount = this.count; int savBestEval = this.bestEval; bool kleur = zet.van.stuk.kleur; Zet[] zetten = new Zet[this.maxPly]; string result = "Zetten: "; zetten[0] = zet.Clone(); debug = false; for (int i = 1; i <= savPly; i++) { bord.VoerUit(zet); if (zet.mat || i == savPly) { break; } this.maxPly = savPly - i; kleur = !kleur; zet = this.BedenkBesteZet(kleur); if (zet == null) { break; } zetten[i] = zet.Clone(); } for (int i = 0; i < savPly; i++) { result += String.Format("{0} ", zetten[i]); if (zetten[savPly - i - 1] != null) { bord.Herstel(zetten[savPly - i - 1]); } } //result += "eval: " + bestEval.ToString(); result += "eval: " + savBestEval.ToString(); //V125 this.maxPly = savPly; this.count = savCount; this.bestEval = savBestEval; this.debug = true; zet = zetten[0]; result = result.Trim(); Console.WriteLine(result); return(result); }
private void add2ListView(Zet zet) { ListViewItem lvi; if (zet.van.stuk.kleur == Kleur.WIT) { lvi = new ListViewItem(ZetNummer.ToString()); lv.Items.Add(lvi); } else { lvi = lv.Items[ZetNummer - 1]; } lvi.SubItems.Add(zet.ToString()); lv.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); //V113 }
private void ShowDot(Zet zet) { Point van = getBordLocation(zet.van.x, zet.van.y); Point naar = getBordLocation(zet.naar.x, zet.naar.y); OvalShape circle = new OvalShape(shapeContainer); bool isPiece = zet.naar.stuk.type != StukType.geen; //V138 int offset = isPiece ? 0 : 12; int r = isPiece ? 26 : 2; circle.Location = new Point(naar.X + offset, naar.Y + offset); circle.Name = "DOT"; circle.BorderColor = Color.Red; circle.Size = new Size(r, r); circle.BringToFront(); circle.Show(); }
public int VoerUit(Zet zet) { //Check(zet,false); // // Check for Mat. // zet.mat = zet.naar.stuk.type == StukType.Koning; // // Voer zet uit op het bord. // if (zet.van == null) //Vanuit doos { veld[zet.naar.x, zet.naar.y] = setStuk(zet.naar.stuk); } else { veld[zet.naar.x, zet.naar.y] = veld[zet.van.x, zet.van.y]; veld[zet.van.x, zet.van.y] = (int)StukType.geen; } if (zet.promotie) { Stuk dame = new Stuk(zet.van.stuk.kleur, StukType.Dame); veld[zet.naar.x, zet.naar.y] = setStuk(dame); evaluatie += Stuk.Waarde(dame); evaluatie -= zet.van.stuk.waarde; } if (zet.castling) //V105 { bool longCastling = zet.naar.x < 4; if (longCastling) { veld[3, zet.van.y] = veld[0, zet.van.y]; veld[0, zet.van.y] = 0; } else { veld[5, zet.van.y] = veld[7, zet.van.y]; veld[7, zet.van.y] = 0; } evaluatie += (zet.van.stuk.kleur) ? 1 : -1; } // // Bepaal evaluatie. // evaluatie -= zet.naar.stuk.waarde; return(evaluatie); // absolute bordwaarde; }
private void TestPromotion() { bord.Load(@" 8 . . . . . . . . ; 7 . . .+p . . . . ; 6 . . . . . . . . ; 5 . . . . . . . . ; 4 . . . . . . . . ; 3 . . . . . . . . ; 2 . . . . . . . . ; 1 . . . . . . . . ; a b c d e f g h "); computer.maxPly = 1; zet = computer.BedenkBesteZet(Kleur.WIT); Console.WriteLine("Zet: {0} eval: {1}", zet, computer.bestEval); Debug.Assert(computer.bestEval == 8, "evaluation <> 8"); computer.maxPly = 2; zet = computer.BedenkBesteZet(Kleur.WIT); Debug.Assert(computer.bestEval == 1000, "evaluation <> 1000"); }
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 string ShowZetHistory(Zet zet) { int savPly = computer.maxPly; int savCount = computer.count; int savBestEval = computer.bestEval; bool kleur = zet.van.stuk.kleur; Zet[] zetten = new Zet[computer.maxPly]; string result = "Zetten: "; zetten[0] = zet.Clone(); for (int i = 1; i <= savPly; i++) { bord.VoerUit(zet); //bord.Show(); if (zet.mat || i == savPly) { break; } computer.maxPly = savPly - i; kleur = !kleur; zet = computer.BedenkBesteZet(kleur); zetten[i] = zet.Clone(); } for (int i = 0; i < savPly; i++) { result += String.Format("{0} ", zetten[i]); if (zetten[savPly - i - 1] != null) { bord.Herstel(zetten[savPly - i - 1]); } } computer.maxPly = savPly; computer.count = savCount; computer.bestEval = savBestEval; zet = zetten[0]; result = result.Trim(); Console.WriteLine(result); return(result); }
private void TestCastling() { bord.Load(@" 8-T . . .-K . .-T ; 7-p . . . . . .-p ; 6 . . . . . . . . ; 5 . . . . . . . . ; 4 . . . . . . . . ; 3 . . . . . . . . ; 2+p . . . . . .+p ; 1+T . . .+K . .+T ; a b c d e f g h "); computer.maxPly = 1; //while(true) zet = computer.BedenkBesteZet(Kleur.WIT); Debug.Assert(computer.count == 16, "count <> "); Debug.Assert(computer.bestEval == 1, "bestEval <> "); //bord.PlaatsStuk(StukType.pion, Kleur.WIT, 2, 7); //zet = computer.BedenkBesteZet(Kleur.WIT); //Debug.Assert(computer.count == 6, "count <> "); }
private void TestAlphaBeta() { bord.Load(@" 8 . . . . . . . . ; 7 . . . . . . . . ; 6-p . . . . . . . ; 5 . . . . . . . . ; 4 . .+D . . . . . ; 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); Console.WriteLine("Zet: {0} eval: {1}", zet, computer.bestEval); Debug.Assert(computer.count == 5, "count <> 5"); //Debug.Assert(computer.count == 51, "count <> 51"); //AlphaBeta = 1001 }
private void TestPionzet() { bord.Load(@" 8 . . . . . . . . ; 7 . . . . .-p . . ; 6 . . . . . . . . ; 5 . . . . . . . . ; 4 . . . . . . . . ; 3+p-p .-p+p+p . . ; 2 . .+p .-p+p . . ; 1 . . . . . . . . ; a b c d e f g h "); computer.maxPly = 1; zet = computer.BedenkBesteZet(Kleur.WIT); Console.WriteLine("Zet: {0} eval: {1}", zet, computer.bestEval); //Debug.Assert(computer.count == 4, "count <>"); Debug.Assert(computer.count == 7, "count <>"); // V104 Debug.Assert(zet.ToString() == "c2*b3", "zet <>"); zet = computer.BedenkBesteZet(Kleur.ZWART); Debug.Assert(computer.count == 7, "zwart count <>"); Debug.Assert(zet.ToString() == "e1", "zet <>"); }
private void TestMatToren() { bord.Load(@" 8 . . . . . . . . ; 7 . . . . . . .-K ; 6 . . . . . . . . ; 5 . . . . .+K . . ; 4 . . . . . . . . ; 3 . . . . . . . . ; 2 . . . . . . . . ; 1 . . . . . .+T . ; a b c d e f g h "); computer.maxPly = 7; //while (true) zet = computer.BedenkBesteZet(Kleur.WIT); string result = ShowZetHistory(zet); Debug.Assert(zet.ToString() == "Kf6", "zet "); Debug.Assert(computer.bestEval == 45, "bestEval "); Debug.Assert(computer.count == 434360, "count <> "); Debug.Assert(result == "Zetten: Kf6 Kh8 Tg7 Kh8*Tg7 Kf6*Kg7", "result <> "); }
public Zet BedenkBesteZet(bool kleur) { if (debug) { Console.WriteLine("Bedenk beste zet voor {0} maxply: {1}", (kleur)?"Wit":"Zwart", maxPly); } count = 0; stack = new Zet[maxPly + 1]; // For test only besteZet = null; bestEval = 0; bord.ResetEvaluatie(); //V114 long start = DateTime.Now.Ticks; BedenkBesteZet(kleur, 1000, 1); // 1001 = Doorzoek alle zetten op ply 1. long eind = DateTime.Now.Ticks; if (debug) { Console.WriteLine("Beste zet: {0} eval: {1}, count: {2}, Elapsed time: {3} ms", besteZet, bestEval, count, (eind - start) / 10000); } return(besteZet); }
public void Herstel(Zet zet) { VerwijderShapeOpVanVeld(zet.van); //V135 OvalShape shape = getShape(zet.naar); if (shape == null) { return; } // Herstel promotie. if (zet.promotie) { doos.BergOp(shape); // berg dame op shape = doos.HaalOp(zet.van.stuk); } shape.Location = getBordLocation(zet.van.x, zet.van.y); //npe bij terug in doos // Zet geslagen stuk terug. if (zet.naar.stuk.type != StukType.geen) { shape = doos.HaalOp(zet.naar.stuk); if (shape == null) //stuk staat al ergens op het bord. { } else { shape.Location = getBordLocation(zet.naar.x, zet.naar.y); } } //Herstel castling. if (zet.castling) { Zet toren = new Zet(); bool longCastling = zet.naar.x < 4; toren.van = new Veld((longCastling) ? 0 : 7, zet.van.y); toren.naar = new Veld((longCastling) ? 3 : 5, zet.van.y);//V105++ Herstel(toren); } }
void shape_MouseDown(object sender, MouseEventArgs e) { selectedShape = null; if (!enabled) { return; } selectedShape = sender as OvalShape; Console.WriteLine("{2} shape_MouseDown {0} selectedShape {1}", selectedShape.Location, selectedShape.Name, spelerNummer); Point coor = getBordCoor(selectedShape.Location); zet = new Zet(); if (coor == BUITENBORD) { zet.van = null; } else { zet.van = new Veld(coor); ShowDots(true); } dragMode = true; }
private void TestMat() { bord.Load(@" 8 . . . . . .-p . ; 7 . . . . . .-p-K ; 6 . . . . . . . . ; 5 . .+D . . . . . ; 4 . . . . . . . . ; 3 . . . . . . . . ; 2 . . . . . . . . ; 1 . . . .+T . . . ; a b c d e f g h "); computer.maxPly = 3; //while(true) zet = computer.BedenkBesteZet(Kleur.WIT); string result = ShowZetHistory(zet); Debug.Assert(zet.ToString() == "Dh5", "zet "); //Debug.Assert(computer.bestEval == 1000, "bestEval "); Debug.Assert(computer.bestEval == 70, "bestEval "); //Debug.Assert(computer.count == 1830, "count <> "); // V102 Debug.Assert(computer.count == 1658, "count <> "); // V103 zet.mat //Debug.Assert(computer.count == 753, "count <> "); // V103 return mat }