Пример #1
0
 //Strategy pattern
 public Bant(IGioco gioco, IPlayer playerA, IPlayer playerB)
 {
     _gioco = gioco;
     _playerA = playerA;
     _playerB = playerB;
     playerA.LatoPlayer = Lato.A;
     playerB.LatoPlayer = Lato.B;
     Start(gioco.ProssimoTurno);
 }
Пример #2
0
 //Strategy pattern
 public Bant(IGioco gioco, IPlayer playerA, IPlayer playerB)
 {
     _gioco             = gioco;
     _playerA           = playerA;
     _playerB           = playerB;
     playerA.LatoPlayer = Lato.A;
     playerB.LatoPlayer = Lato.B;
     Start(gioco.ProssimoTurno);
 }
Пример #3
0
 protected override ValoreMossa GetValoreMossa(IGioco gioco, int depth)
 {
     ValoreMossa  mossa = PatternMatching(gioco);
     if (mossa != null)
         return mossa;
     else
     {
         return base.GetValoreMossa(gioco, depth);
     }
 }
Пример #4
0
 protected override ValoreMossa MaxValue(IGioco gioco, int depth, int alfa, int beta)
 {
     ValoreMossa mossa = PatternMatching(gioco);
     if (mossa != null)
         return mossa;
     else
     {
         return base.MaxValue(gioco, depth, alfa, beta);
     }
 }
Пример #5
0
        protected override ValoreMossa GetValoreMossa(IGioco gioco, int depth)
        {
            ValoreMossa resultMove = null;

            if (depth <= _max)
            {
                ITavola tavola   = gioco.Tavola;
                Lato    latoStep = gioco.ProssimoTurno;
                int?    beta     = null;
                for (int i = tavola.Buche.Count - 2; i >= 0; --i)
                {
                    IBuca p = tavola.Buche[i];
                    if (p.Lato == latoStep && i != 6 && i != 13 && p.Semi > 0 && !gioco.Finito)
                    {
                        IGioco giocoClone = gioco.Clone();
                        giocoClone.Muovi(i);
                        int valoreAttuale = ValoreAttuale(giocoClone);

                        if (depth == _max - 1 && beta.HasValue && latoStep == LatoPlayer && valoreAttuale < beta.Value)
                        {
                            continue;
                        }
                        else
                        {
                            bool        cambioTurno = gioco.ProssimoTurno != giocoClone.ProssimoTurno;
                            ValoreMossa valoreProssimaMossa;
                            if (!giocoClone.Finito)
                            {
                                valoreProssimaMossa = ValoreProssimaMossa(depth, giocoClone, cambioTurno);
                            }
                            else
                            {
                                valoreProssimaMossa = null;
                            }
                            ValoreMossa valore = new ValoreMossa(valoreProssimaMossa, i, valoreAttuale);
                            if (null == resultMove) //serve per il taglio
                            {
                                resultMove = valore;
                            }
                            else
                            {
                                resultMove = AggiornoValore(resultMove, valore, latoStep);
                                if (depth == _max - 1 && latoStep == LatoPlayer)
                                {
                                    beta = resultMove.Valore;
                                }
                            }
                        }
                    }
                }
            }
            return(resultMove);
        }
Пример #6
0
 public int[] HeuristicFunction(IGioco gioco)
 {
     List<int> outDic = new List<int>();
     for (int i = 0; i < gioco.Tavola.Buche.Count; ++i)
     {
         if (gioco.Tavola.Buche[i].Lato == gioco.ProssimoTurno && i != 6 && i != 13 && gioco.Tavola.Buche[i].Semi > 0 && !gioco.Finito)
         {
             outDic.Add(i);
         }
     }
     return outDic.ToArray();
 }
Пример #7
0
        protected override ValoreMossa MaxValue(IGioco gioco, int depth, int alfa, int beta)
        {
            ValoreMossa mossa = PatternMatching(gioco);

            if (mossa != null)
            {
                return(mossa);
            }
            else
            {
                return(base.MaxValue(gioco, depth, alfa, beta));
            }
        }
Пример #8
0
 protected int ValoreAttuale(IGioco giocoClone)
 {
     int valoreAttuale;
     if (LatoPlayer == Lato.A)
     {
         valoreAttuale = giocoClone.Tavola.Buche[6].Semi - giocoClone.Tavola.Buche[13].Semi;
     }
     else
     {
         valoreAttuale = giocoClone.Tavola.Buche[13].Semi - giocoClone.Tavola.Buche[6].Semi;
     }
     return valoreAttuale;
 }
Пример #9
0
        protected override ValoreMossa GetValoreMossa(IGioco gioco, int depth)
        {
            ValoreMossa mossa = PatternMatching(gioco);

            if (mossa != null)
            {
                return(mossa);
            }
            else
            {
                return(base.GetValoreMossa(gioco, depth));
            }
        }
Пример #10
0
        public override int Elaborazione(IGioco gioco)
        {
            Random r = new Random();

            if (LatoPlayer == Lato.A)
            {
                return(r.Next(0, 6));
            }
            else
            {
                return(r.Next(7, 13));
            }
        }
Пример #11
0
        public override int Elaborazione(IGioco gioco)
        {
            Random r = new Random();

            if (LatoPlayer == Lato.A)
            {
                return r.Next(0, 6);
            }
            else
            {
                return r.Next(7, 13);
            }
        }
Пример #12
0
        public int[] HeuristicFunction(IGioco gioco)

        {
            List <int> outDic = new List <int>();

            for (int i = gioco.Tavola.Buche.Count - 2; i >= 0; --i)
            {
                if (gioco.Tavola.Buche[i].Lato == gioco.ProssimoTurno && i != 6 && i != 13 && gioco.Tavola.Buche[i].Semi > 0 && !gioco.Finito)
                {
                    outDic.Add(i);
                }
            }
            return(outDic.ToArray());
        }
Пример #13
0
        protected ValoreMossa ValoreProssimaMossa(int depth, IGioco giocoClone, bool cambioTurno)
        {
            ValoreMossa valoreProssimaMossa;

            if (!cambioTurno)
            {
                valoreProssimaMossa = GetValoreMossa(giocoClone, depth);
            }
            else
            {
                valoreProssimaMossa = GetValoreMossa(giocoClone, depth + 1);
            }
            return(valoreProssimaMossa);
        }
Пример #14
0
        protected int ValoreAttuale(IGioco prossimoGioco)
        {
            int valoreAttuale;

            if (LatoPlayer == Lato.A)
            {
                valoreAttuale = prossimoGioco.Tavola.Buche[6].Semi - prossimoGioco.Tavola.Buche[13].Semi;
            }
            else
            {
                valoreAttuale = prossimoGioco.Tavola.Buche[13].Semi - prossimoGioco.Tavola.Buche[6].Semi;
            }
            return(valoreAttuale);
        }
Пример #15
0
        protected override ValoreMossa GetValoreMossa(IGioco gioco, int depth)
        {
            ValoreMossa resultMove = null;
            if (depth <= _max)
            {
                ITavola tavola = gioco.Tavola;
                Lato latoStep = gioco.ProssimoTurno;
                int? beta = null;
                for (int i = tavola.Buche.Count - 2; i >= 0; --i)
                {
                    IBuca p = tavola.Buche[i];
                    if (p.Lato == latoStep && i != 6 && i != 13 && p.Semi > 0 && !gioco.Finito)
                    {
                        IGioco giocoClone = gioco.Clone();
                        giocoClone.Muovi(i);
                        int valoreAttuale = ValoreAttuale(giocoClone);

                        if (depth == _max - 1 && beta.HasValue && latoStep == LatoPlayer && valoreAttuale < beta.Value)
                        {
                            continue;
                        }
                        else
                        {
                            bool cambioTurno = gioco.ProssimoTurno != giocoClone.ProssimoTurno;
                            ValoreMossa valoreProssimaMossa;
                            if (!giocoClone.Finito)
                            {
                                valoreProssimaMossa = ValoreProssimaMossa(depth, giocoClone, cambioTurno);
                            }
                            else
                            {
                                valoreProssimaMossa = null;
                            }
                            ValoreMossa valore = new ValoreMossa(valoreProssimaMossa, i, valoreAttuale);
                            if (null == resultMove) //serve per il taglio
                            {
                                resultMove = valore;
                            }
                            else
                            {
                                resultMove = AggiornoValore(resultMove, valore, latoStep);
                                if (depth == _max - 1 && latoStep == LatoPlayer)
                                    beta = resultMove.Valore;
                            }
                        }
                    }
                }
            }
            return resultMove;
        }
Пример #16
0
        protected int ValoreAttuale(IGioco giocoClone)
        {
            int valoreAttuale;

            if (LatoPlayer == Lato.A)
            {
                valoreAttuale = giocoClone.Tavola.Buche[6].Semi - giocoClone.Tavola.Buche[13].Semi;
            }
            else
            {
                valoreAttuale = giocoClone.Tavola.Buche[13].Semi - giocoClone.Tavola.Buche[6].Semi;
            }
            return(valoreAttuale);
        }
Пример #17
0
        private double Valore(IGioco giocoClone)
        {
            int valoreAttuale;

            if (_latoPlayer == Lato.A)
            {
                valoreAttuale = giocoClone.Tavola.Buche[6].Semi - giocoClone.Tavola.Buche[13].Semi;
            }
            else
            {
                valoreAttuale = giocoClone.Tavola.Buche[13].Semi - giocoClone.Tavola.Buche[6].Semi;
            }
            return(valoreAttuale);
        }
Пример #18
0
        private ValoreMossa MinValue(IGioco gioco, int depth, int alfa, int beta)
        {
            ValoreMossa resultMove = null;

            if (depth <= _max && !gioco.Finito)
            {
                ITavola tavola   = gioco.Tavola;
                Lato    latoStep = gioco.ProssimoTurno;

                int[] heuristc = _heuristicFunction.HeuristicFunction(gioco.Clone());
                for (int j = 0; j < heuristc.Length; ++j)
                {
                    int i = heuristc[j];
                    OperationCount++;
                    IGioco giocoClone = gioco.Clone();
                    giocoClone.Muovi(i);
                    bool        cambioTurno         = gioco.ProssimoTurno != giocoClone.ProssimoTurno;
                    ValoreMossa valoreProssimaMossa = null;
                    if (!giocoClone.Finito)
                    {
                        if (!cambioTurno)
                        {
                            valoreProssimaMossa = MinValue(giocoClone, depth, alfa, beta);
                        }
                        else
                        {
                            valoreProssimaMossa = MaxValue(giocoClone, depth + 1, alfa, beta);
                        }
                    }

                    ValoreMossa valore = new ValoreMossa(valoreProssimaMossa, i, ValoreAttuale(giocoClone));
                    if (null == resultMove)//inizializzazione
                    {
                        resultMove = valore;
                    }
                    else
                    {
                        resultMove = AggiornoValore(resultMove, valore, latoStep);
                    }
                    if (resultMove.Valore < alfa)
                    {
                        return(resultMove);
                    }
                    beta = resultMove.Valore < beta ? resultMove.Valore : beta;
                }
            }
            return(resultMove);
        }
Пример #19
0
        private ValoreMossa MinValue(IGioco gioco, int depth)
        {
            ValoreMossa resultMove = null;

            if (depth <= _max && !gioco.Finito)
            {
                ITavola tavola   = gioco.Tavola;
                Lato    latoStep = gioco.ProssimoTurno;


                for (int i = tavola.Buche.Count - 2; i >= 0; --i)
                {
                    IBuca p = tavola.Buche[i];
                    if (p.Lato == latoStep && i != 6 && i != 13 && p.Semi > 0 && !gioco.Finito)
                    {
                        OperationCount++;

                        IGioco giocoClone = gioco.Clone();
                        giocoClone.Muovi(i);
                        bool        cambioTurno         = gioco.ProssimoTurno != giocoClone.ProssimoTurno;
                        ValoreMossa valoreProssimaMossa = null;
                        if (!giocoClone.Finito)
                        {
                            if (!cambioTurno)
                            {
                                valoreProssimaMossa = MinValue(giocoClone.Clone(), depth);
                            }
                            else
                            {
                                valoreProssimaMossa = MaxValue(giocoClone.Clone(), depth + 1);
                            }
                        }

                        ValoreMossa valore = new ValoreMossa(valoreProssimaMossa, i, ValoreAttuale(giocoClone));
                        if (null == resultMove)//inizializzazione
                        {
                            resultMove = valore;
                        }
                        else
                        {
                            resultMove = AggiornoValore(resultMove, valore, latoStep);
                        }
                    }
                }
            }
            return(resultMove);
        }
Пример #20
0
        public static int ReadValue(IGioco gioco)
        {
            int val = -1;
            while (val < 0)
            {
                string s = Console.ReadLine();
                int tmpVal;
                if (int.TryParse(s, NumberStyles.None, null, out tmpVal) && tmpVal >= 0)
                {
                    if (gioco.MossaValida(tmpVal))
                        return tmpVal;

                }
                Console.WriteLine("Errore, mossa non valida!");
            }
            return val;
        }
Пример #21
0
        public int[] HeuristicFunction(IGioco gioco)
        {
            Dictionary <int, decimal> outDic = new Dictionary <int, decimal>();

            for (int i = gioco.Tavola.Buche.Count - 2; i >= 0; --i)
            {
                IBuca p = gioco.Tavola.Buche[i];
                if (gioco.Tavola.Buche[i].Lato == gioco.ProssimoTurno && i != 6 && i != 13 && gioco.Tavola.Buche[i].Semi > 0 && !gioco.Finito)
                {
                    IGioco giocoClone = gioco.Clone();
                    giocoClone.Muovi(i);
                    bool    cambioTurno = gioco.ProssimoTurno != giocoClone.ProssimoTurno;
                    decimal valore      = (decimal)(cambioTurno ? Valore(giocoClone) : Valore(giocoClone) + 0.5);
                    outDic.Add(i, valore);
                }
            }
            return(outDic.OrderByDescending(x => x.Value).Select(x => x.Key).ToArray());
        }
Пример #22
0
        public static int ReadValue(IGioco gioco)
        {
            int val = -1;

            while (val < 0)
            {
                string s = Console.ReadLine();
                int    tmpVal;
                if (int.TryParse(s, NumberStyles.None, null, out tmpVal) && tmpVal >= 0)
                {
                    if (gioco.MossaValida(tmpVal))
                    {
                        return(tmpVal);
                    }
                }
                Console.WriteLine("Errore, mossa non valida!");
            }
            return(val);
        }
Пример #23
0
        protected override ValoreMossa GetValoreMossa(IGioco gioco, int depth)
        {
            ValoreMossa resultMove = null;

            if (depth <= _max)
            {
                ITavola tavola   = gioco.Tavola;
                Lato    latoStep = gioco.ProssimoTurno;

                for (int i = tavola.Buche.Count - 2; i >= 0; --i)
                {
                    IBuca p = tavola.Buche[i];
                    if (p.Lato == latoStep && i != 6 && i != 13 && p.Semi > 0 && !gioco.Finito)
                    {
                        OperationCount++;
                        IGioco giocoClone = gioco.Clone();
                        giocoClone.Muovi(i);
                        int         valoreAttuale = ValoreAttuale(giocoClone);
                        ValoreMossa valoreProssimaMossa;
                        if (!giocoClone.Finito)
                        {
                            bool cambioTurno = gioco.ProssimoTurno != giocoClone.ProssimoTurno;
                            valoreProssimaMossa = ValoreProssimaMossa(depth, giocoClone.Clone(), cambioTurno);
                        }
                        else
                        {
                            valoreProssimaMossa = null;
                        }
                        ValoreMossa m = new ValoreMossa(valoreProssimaMossa, i, valoreAttuale);

                        if (null == resultMove)//inizializzazione
                        {
                            resultMove = m;
                        }
                        else
                        {
                            resultMove = AggiornoValore(resultMove, m, latoStep);
                        }
                    }
                }
            }
            return(resultMove);
        }
Пример #24
0
        protected virtual ValoreMossa MaxValue(IGioco gioco, int depth, int alfa, int beta)
        {
            ValoreMossa resultMove = null;
            if (depth <= _max && !gioco.Finito)
            {
                ITavola tavola = gioco.Tavola;
                Lato latoStep = gioco.ProssimoTurno;

                int[] heuristc = _heuristicFunction.HeuristicFunction(gioco.Clone());
                for (int j = 0; j < heuristc.Length; ++j)
                {
                    int i = heuristc[j];
                    OperationCount++;
                    IGioco giocoClone = gioco.Clone();
                    giocoClone.Muovi(i);
                    bool cambioTurno = gioco.ProssimoTurno != giocoClone.ProssimoTurno;
                    ValoreMossa valoreProssimaMossa = null;
                    if (!giocoClone.Finito)
                    {
                        if (!cambioTurno)
                            valoreProssimaMossa = MaxValue(giocoClone, depth, alfa, beta);
                        else
                            valoreProssimaMossa = MinValue(giocoClone, depth + 1, alfa, beta);
                    }
                    ValoreMossa valore = new ValoreMossa(valoreProssimaMossa, i, ValoreAttuale(giocoClone));
                    if (null == resultMove)//inizializzazione
                    {
                        resultMove = valore;
                    }
                    else
                    {
                        resultMove = AggiornoValore(resultMove, valore, latoStep);
                    }
                    if (resultMove.Valore > beta)
                        return resultMove;
                    alfa = resultMove.Valore > alfa ? resultMove.Valore : alfa;
                }

            }
            return resultMove;
        }
Пример #25
0
 private ValoreMossa PatternMatching(IGioco gioco)
 {
     IList<IBuca> buche = gioco.Tavola.Buche;
     if (buche[0].Semi == 3 && buche[1].Semi == 3 && buche[2].Semi == 3 && buche[3].Semi == 3 && buche[4].Semi == 3 && buche[5].Semi == 3)
     {
         //ValoreMossa vm2 = new ValoreMossa(null, 5, 2);
         //return new ValoreMossa(vm2, 3, 2);
         return new ValoreMossa(null, 5, 1);
     }
     if (buche[0].Semi == 4 && buche[1].Semi == 4 && buche[2].Semi == 3 && buche[3].Semi == 3 && buche[4].Semi == 3 && buche[5].Semi == 0 && buche[6].Semi == 1)
     {
         ValoreMossa vm3 = new ValoreMossa(null, 1, 2);
         ValoreMossa vm2 = new ValoreMossa(vm3, 5, 2);
         return new ValoreMossa(vm2, 3, 2);
     }
     if (buche[0].Semi == 0 && buche[1].Semi == 0 && buche[2].Semi == 4 && buche[3].Semi == 1 && buche[4].Semi == 5 && buche[5].Semi == 0 && buche[6].Semi == 8 && buche[13].Semi == 8)
     {
         return new ValoreMossa(null, 4, 2);
     }
     return null;
 }
Пример #26
0
        private ValoreMossa PatternMatching(IGioco gioco)
        {
            IList <IBuca> buche = gioco.Tavola.Buche;

            if (buche[0].Semi == 3 && buche[1].Semi == 3 && buche[2].Semi == 3 && buche[3].Semi == 3 && buche[4].Semi == 3 && buche[5].Semi == 3)
            {
                //ValoreMossa vm2 = new ValoreMossa(null, 5, 2);
                //return new ValoreMossa(vm2, 3, 2);
                return(new ValoreMossa(null, 5, 1));
            }
            if (buche[0].Semi == 4 && buche[1].Semi == 4 && buche[2].Semi == 3 && buche[3].Semi == 3 && buche[4].Semi == 3 && buche[5].Semi == 0 && buche[6].Semi == 1)
            {
                ValoreMossa vm3 = new ValoreMossa(null, 1, 2);
                ValoreMossa vm2 = new ValoreMossa(vm3, 5, 2);
                return(new ValoreMossa(vm2, 3, 2));
            }
            if (buche[0].Semi == 0 && buche[1].Semi == 0 && buche[2].Semi == 4 && buche[3].Semi == 1 && buche[4].Semi == 5 && buche[5].Semi == 0 && buche[6].Semi == 8 && buche[13].Semi == 8)
            {
                return(new ValoreMossa(null, 4, 2));
            }
            return(null);
        }
Пример #27
0
        public override int Elaborazione(IGioco gioco)
        {
            if (mossaMultipla == null || mossaMultipla.Count == 0)
            {
                ValoreMossa val = GetValoreMossa(gioco.Clone(), 0);
                mossaMultipla = new List <int>();
                ValoreMossa valTmp = val.ProssimaMossa;
                while (valTmp != null && valTmp.Lato == val.Lato)
                {
                    mossaMultipla.Add(valTmp.Mossa);
                    valTmp = valTmp.ProssimaMossa;
                }

                _valoreMassimo = val.Valore;
                return(val.Mossa);
            }
            else
            {
                int mossa = mossaMultipla[0];
                mossaMultipla.RemoveAt(0);
                return(mossa);
            }
        }
Пример #28
0
        public override int Elaborazione(IGioco gioco)
        {
            if (mossaMultipla == null || mossaMultipla.Count == 0)
            {
                ValoreMossa val = MaxValue(gioco.Clone(), 0);
                mossaMultipla = new List<int>();
                ValoreMossa valTmp = val.ProssimaMossa;
                while (valTmp != null && valTmp.Lato == val.Lato)
                {
                    mossaMultipla.Add(valTmp.Mossa);
                    valTmp = valTmp.ProssimaMossa;
                }

                _valoreMassimo = val.Valore;
                return val.Mossa;
            }
            else
            {
                int mossa = mossaMultipla[0];
                mossaMultipla.RemoveAt(0);
                return mossa;

            }
        }
Пример #29
0
        private ValoreMossa MinValue(IGioco gioco, int depth)
        {
            ValoreMossa resultMove = null;
            if (depth <= _max && !gioco.Finito)
            {

                ITavola tavola = gioco.Tavola;
                Lato latoStep = gioco.ProssimoTurno;

                for (int i = tavola.Buche.Count - 2; i >= 0; --i)
                {
                    IBuca p = tavola.Buche[i];
                    if (p.Lato == latoStep && i != 6 && i != 13 && p.Semi > 0 && !gioco.Finito)
                    {
                        OperationCount++;

                        IGioco giocoClone = gioco.Clone();
                        giocoClone.Muovi(i);
                        bool cambioTurno = gioco.ProssimoTurno != giocoClone.ProssimoTurno;
                        ValoreMossa valoreProssimaMossa = null;
                        if (!giocoClone.Finito)
                        {
                            if (!cambioTurno)
                                valoreProssimaMossa = MinValue(giocoClone.Clone(), depth);
                            else
                                valoreProssimaMossa = MaxValue(giocoClone.Clone(), depth + 1);
                        }

                        ValoreMossa valore = new ValoreMossa(valoreProssimaMossa, i, ValoreAttuale(giocoClone));
                        if (null == resultMove)//inizializzazione
                        {
                            resultMove = valore;
                        }
                        else
                        {
                            resultMove = AggiornoValore(resultMove, valore, latoStep);
                        }

                    }
                }
            }
            return resultMove;
        }
Пример #30
0
 protected abstract ValoreMossa GetValoreMossa(IGioco gioco, int depth);
Пример #31
0
 public abstract int Elaborazione(IGioco gioco);
Пример #32
0
 public override int Elaborazione(IGioco gioco)
 {
     return(0);
 }
Пример #33
0
 public override int Elaborazione(IGioco gioco)
 {
     return 0;
 }
Пример #34
0
 public abstract int Elaborazione(IGioco gioco);