예제 #1
0
파일: Gioco.cs 프로젝트: nickxbs/IA
        protected virtual void RubaSemi(int indiceBuca, Lato turno)
        {
            if (indiceBuca != 13 && indiceBuca != 6)
            {
                if (Tavola.Buche[indiceBuca].Semi == 1)
                {
                    if (indiceBuca < 6 && turno == Lato.A)
                    {
                        int semi = Tavola.Buche[12 - indiceBuca].Semi + 1;
                        Tavola.Buche[12 - indiceBuca].Semi = 0;
                        Tavola.Buche[indiceBuca].Semi      = 0;
                        Tavola.Buche[6].Semi += semi;

                        return;
                    }
                    if (indiceBuca > 6 && turno == Lato.B)
                    {
                        int semi = Tavola.Buche[12 - indiceBuca].Semi + 1;
                        Tavola.Buche[12 - indiceBuca].Semi = 0;
                        Tavola.Buche[indiceBuca].Semi      = 0;
                        Tavola.Buche[13].Semi += semi;
                        return;
                    }
                }
            }
        }
예제 #2
0
 public IPlayer GetPlayer(Lato lato)
 {
     if (lato == Lato.A)
     {
         return(_playerA);
     }
     else
     {
         return(_playerB);
     }
 }
예제 #3
0
파일: Bantumi.cs 프로젝트: nickxbs/IA
 public IPlayer GetPlayer(Lato lato)
 {
     if (lato == Lato.A)
     {
         return _playerA;
     }
     else
     {
         return _playerB;
     }
 }
예제 #4
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);
        }
예제 #5
0
파일: Gioco.cs 프로젝트: nickxbs/IA
        private void CalcolaProssimoTurno(Lato turno, int indice)
        {
            if (indice == 6)
            {
                _prossimoTurno = Lato.A;
                return;
            }
            if (indice == 13)
            {
                _prossimoTurno = Lato.B;
                return;
            }

            _prossimoTurno = turno == Lato.A ? Lato.B : Lato.A;
        }
예제 #6
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);
        }
예제 #7
0
파일: Bantumi.cs 프로젝트: nickxbs/IA
 private void Start(Lato prossimoTurno)
 {
     while (_gioco.Vincitore != null && !_gioco.Parita)
     {
         if (prossimoTurno == Lato.A)
         {
             if (_playerA is IAIPlayer)
                 _gioco.Muovi(((IAIPlayer)_playerA).Elaborazione(_gioco));
         }
         else
         {
             if (_playerA is IAIPlayer)
                 _gioco.Muovi(((IAIPlayer)_playerB).Elaborazione(_gioco));
         }
     }
 }
예제 #8
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);
        }
예제 #9
0
파일: AbsAIPlayer.cs 프로젝트: nickxbs/IA
 protected ValoreMossa AggiornoValore(ValoreMossa resultMove, ValoreMossa m, Lato latoStep)
 {
     if (latoStep == LatoPlayer)
     {
         if (m.Valore >= resultMove.Valore) //MAX: tengo sempre la migliore che poi ritorno
         {
             resultMove = m;
         }
     }
     else
     {
         if (m.Valore <= resultMove.Valore) //MIN: tengo sempre la migliore che poi ritorno
         {
             resultMove = m;
         }
     }
     return(resultMove);
 }
예제 #10
0
파일: AbsAIPlayer.cs 프로젝트: nickxbs/IA
 protected ValoreMossa AggiornoValore(ValoreMossa resultMove, ValoreMossa m, Lato latoStep)
 {
     if (latoStep == LatoPlayer)
     {
         if (m.Valore >= resultMove.Valore) //MAX: tengo sempre la migliore che poi ritorno
         {
             resultMove = m;
         }
     }
     else
     {
         if (m.Valore <= resultMove.Valore) //MIN: tengo sempre la migliore che poi ritorno
         {
             resultMove = m;
         }
     }
     return resultMove;
 }
예제 #11
0
파일: MinMaxPlayer.cs 프로젝트: nickxbs/IA
        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);
        }
예제 #12
0
 private void Start(Lato prossimoTurno)
 {
     while (_gioco.Vincitore != null && !_gioco.Parita)
     {
         if (prossimoTurno == Lato.A)
         {
             if (_playerA is IAIPlayer)
             {
                 _gioco.Muovi(((IAIPlayer)_playerA).Elaborazione(_gioco));
             }
         }
         else
         {
             if (_playerA is IAIPlayer)
             {
                 _gioco.Muovi(((IAIPlayer)_playerB).Elaborazione(_gioco));
             }
         }
     }
 }
예제 #13
0
 public GiocoRuba2(ITavola tavola, Lato prossimoLato)
     : base(tavola, prossimoLato)
 {
 }
예제 #14
0
파일: Gioco.cs 프로젝트: nickxbs/IA
 public Gioco(ITavola tavola, Lato prossimoLato)
 {
     Tavola = tavola;
     _prossimoTurno = prossimoLato;
     _parita = false;
 }
예제 #15
0
파일: Gioco.cs 프로젝트: nickxbs/IA
 public Gioco(ITavola tavola)
 {
     Tavola = tavola;
     _prossimoTurno = Lato.A;
     _parita = false;
 }
예제 #16
0
파일: Gioco.cs 프로젝트: nickxbs/IA
        private void CalcolaProssimoTurno(Lato turno, int indice)
        {
            if (indice == 6)
            {
                _prossimoTurno = Lato.A;
                return;
            }
            if (indice == 13)
            {
                _prossimoTurno = Lato.B;
                return;
            }

            _prossimoTurno = turno == Lato.A ? Lato.B : Lato.A;
        }
예제 #17
0
파일: Gioco.cs 프로젝트: nickxbs/IA
        protected virtual void RubaSemi(int indiceBuca, Lato turno)
        {
            if (indiceBuca != 13 && indiceBuca != 6)
            {
                if (Tavola.Buche[indiceBuca].Semi == 1)
                {
                    if (indiceBuca < 6 && turno == Lato.A)
                    {
                        int semi = Tavola.Buche[12 - indiceBuca].Semi + 1;
                        Tavola.Buche[12 - indiceBuca].Semi = 0;
                        Tavola.Buche[indiceBuca].Semi = 0;
                        Tavola.Buche[6].Semi += semi;

                        return;
                    }
                    if (indiceBuca > 6 && turno == Lato.B)
                    {
                        int semi = Tavola.Buche[12 - indiceBuca].Semi + 1;
                        Tavola.Buche[12 - indiceBuca].Semi = 0;
                        Tavola.Buche[indiceBuca].Semi = 0;
                        Tavola.Buche[13].Semi += semi;
                        return;
                    }
                }
            }
        }
예제 #18
0
 public HeuristicFunctionValue(Lato latoPlayer)
 {
     _latoPlayer = latoPlayer;
 }
예제 #19
0
파일: Gioco.cs 프로젝트: nickxbs/IA
 public Gioco(ITavola tavola)
 {
     Tavola         = tavola;
     _prossimoTurno = Lato.A;
     _parita        = false;
 }
예제 #20
0
파일: Gioco.cs 프로젝트: nickxbs/IA
 public Gioco(ITavola tavola, Lato prossimoLato)
 {
     Tavola         = tavola;
     _prossimoTurno = prossimoLato;
     _parita        = false;
 }