public override Veld VerkiestVeld(Spel spel) { //1) Probeer een reeks van de tegenstander te blokkeren: Veld blokkerendVeld = BlokkerendVeld(spel); if (blokkerendVeld != null) { return(blokkerendVeld); } //2) Indien het middelste veld nog vrij is lever deze op: Veld middelsteVeld = spel.Bord[1, 1]; if (middelsteVeld.IsVrij()) { return(middelsteVeld); } //3) Willekeurig vrij veld opleveren: return(base.VerkiestVeld(spel)); }
public override Veld VerkiestVeld(Spel spel) { #region checks en variabelen int aantalIngenomen = AantalIngenomen(spel.Bord); List <Lijn> randLijnen = GetRandLijnen(spel.Bord); Veld doel = null; doel = WinnendVeld(spel); if (doel != null) { return(doel); } doel = BlokkerendVeld(spel); if (doel != null) { return(doel); } #endregion //SPELER 1 if (Speler == Speler.O) { #region Eerste beurt speler 1 //neemt een hoek (hoogste kans), center of rand if (aantalIngenomen == 0) { int rnd = RandomInt(); if (rnd <= 15) { doel = spel.Bord[4]; return(doel); } else if (rnd >= 85) { doel = RandomRand(spel.Bord); return(doel); } doel = RandomHoek(spel.Bord); return(doel); } #endregion #region Tweede beurt speler 1 else if (aantalIngenomen == 2) { Veld eigenMove = VeldenSpeler(spel.Bord, Speler)[0]; Veld tegenstanderMove = VeldenSpeler(spel.Bord, Tegenstander)[0]; #region Speler 1 speelde hoek if (IsHoek(eigenMove, spel.Bord)) { Veld gespiegeldeEersteMove = GespiegeldeHoek(spel.Bord, eigenMove); #region Tegenstander speelde hoek of rand //x speelt geen center if (tegenstanderMove != spel.Bord[1, 1]) { Veld excludeHoek = null; foreach (Lijn lijn in randLijnen) { if (lijn.AantalVrijeVelden() == 1) { if (lijn.Velden[0].Speler == Speler) { excludeHoek = lijn.Velden[2]; } else { excludeHoek = lijn.Velden[0]; } } } do { doel = RandomHoek(spel.Bord); } while (doel == excludeHoek || doel == gespiegeldeEersteMove || !doel.IsVrij()); return(doel); } #endregion #region Tegenstander speelde center //x speelt center else { int rnd = RandomInt(); if (rnd <= 10) { foreach (Lijn lijn in randLijnen) { if (lijn.AantalVrijeVelden() == 3) { doel = lijn.Velden[1]; if (doel.IsVrij()) { return(doel); } } } } return(gespiegeldeEersteMove); } #endregion } #endregion #region Speler 1 speelde center else if (IsCenter(eigenMove)) { #region Tegenstander speelde hoek //gespiegelde hoek nemen, daarna nog vorkpoging if (IsHoek(tegenstanderMove, spel.Bord)) { Veld gespiegeldeHoek = GespiegeldeHoek(spel.Bord, tegenstanderMove); return(gespiegeldeHoek); } #endregion #region Tegenstander speelde rand else { do { doel = RandomHoek(spel.Bord); } while (!doel.IsVrij()); return(doel); } #endregion } #endregion #region Speler 1 speelde rand else if (IsRand(eigenMove, spel.Bord)) { #region Tegenstander speelde rand if (IsRand(tegenstanderMove, spel.Bord)) { //tegenstander speelt near rand if (!ZijnOpposRanden(tegenstanderMove, eigenMove, spel.Bord)) { doel = Vork(tegenstanderMove, eigenMove, spel.Bord); if (doel.IsVrij()) { return(doel); } } //tegenstander speelt opposite rand else { foreach (Lijn lijn in randLijnen) { foreach (Veld v in lijn.Velden) { if (v.Speler == Tegenstander) { //2 mogelijke hoeken, neem ééntje at random int rnd = RandomInt(); if (rnd >= 50) { doel = lijn.Velden[0]; if (doel.IsVrij()) { return(doel); } } else { doel = lijn.Velden[2]; if (doel.IsVrij()) { return(doel); } } } } } } } #endregion #region Tegenstander speelde hoek else if (IsHoek(tegenstanderMove, spel.Bord)) //zoek eerst naar near corner { foreach (Lijn lijn in randLijnen) { if (lijn.AantalVrijeVelden() == 1)//if true=> near corner { foreach (Veld v in lijn.Velden) { if (v.IsVrij()) { doel = GespiegeldeHoek(spel.Bord, v); if (doel.IsVrij()) { return(doel); } } } } } //niets gevonden? tegenstander speelt far corner doel = GespiegeldeHoek(spel.Bord, Vork(eigenMove, tegenstanderMove, spel.Bord)); if (doel.IsVrij()) { return(doel); } } #endregion #region Tegenstander speelde center int rnd2 = RandomInt(); //random hoek if (rnd2 <= 10) { foreach (Lijn lijn in randLijnen) { if (lijn.Velden[1].Speler == Speler) { Veld excludeHoek1 = lijn.Velden[0]; Veld excludeHoek2 = lijn.Velden[2]; do { doel = RandomHoek(spel.Bord); } while (doel == excludeHoek1 || doel == excludeHoek2); return(doel); } } } //random rand die niet opposite is van eigen move else { do { doel = RandomRand(spel.Bord); } while (!doel.IsVrij() || ZijnOpposRanden(doel, eigenMove, spel.Bord)); return(doel); } #endregion } #endregion } #endregion } //SPELER 2 else { #region Eerste beurt speler 2 if (aantalIngenomen == 1) { Veld move1 = VeldenSpeler(spel.Bord, Tegenstander)[0]; if (IsCenter(move1)) { doel = RandomHoek(spel.Bord); return(doel); } else { doel = spel.Bord[4]; return(doel); } } #endregion #region Tweede beurt speler 2 else if (aantalIngenomen == 3) { Veld move1 = VeldenSpeler(spel.Bord, Tegenstander)[0]; Veld move2 = VeldenSpeler(spel.Bord, Tegenstander)[1]; //al op vrij checken in method //o neemt 2 hoeken if (IsHoek(move1, spel.Bord) && IsHoek(move2, spel.Bord)) { do { doel = RandomRand(spel.Bord); } while (!doel.IsVrij()); return(doel); } //o neemt center en hoek else if (IsCenter(move1) && IsHoek(move2, spel.Bord) || IsCenter(move2) && IsHoek(move1, spel.Bord)) { do { doel = RandomHoek(spel.Bord); } while (!doel.IsVrij()); return(doel); } //o neemt 2 randen else if (IsRand(move1, spel.Bord) && IsRand(move2, spel.Bord)) { if (ZijnOpposRanden(move1, move2, spel.Bord)) { do { doel = RandomHoek(spel.Bord); } while (!doel.IsVrij());//checks op is vrij en while lus in method, return(doel); } else { doel = Vork(move1, move2, spel.Bord); if (doel.IsVrij()) { return(doel); } } } //o neemt rand en hoek else if (IsRand(move1, spel.Bord) && IsHoek(move2, spel.Bord) || IsHoek(move1, spel.Bord) && IsRand(move2, spel.Bord)) { Veld hoek; Veld rand; hoek = IsHoek(move1, spel.Bord) ? move1 : move2; rand = IsRand(move1, spel.Bord) ? move1 : move2; doel = Vork(rand, hoek, spel.Bord); if (doel.IsVrij()) { return(doel); } } } #endregion } #region "Overige beurten of geen returns" doel = MinimaxVeld(spel.Bord); if (doel == null || (!doel.IsVrij())) { return(base.VerkiestVeld(spel)); } return(doel); #endregion }