Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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
        }