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; } } } }
public IPlayer GetPlayer(Lato lato) { if (lato == Lato.A) { return(_playerA); } else { return(_playerB); } }
public IPlayer GetPlayer(Lato lato) { if (lato == Lato.A) { return _playerA; } else { return _playerB; } }
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); }
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; }
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); }
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)); } } }
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); }
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); }
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; }
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); }
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)); } } } }
public GiocoRuba2(ITavola tavola, Lato prossimoLato) : base(tavola, prossimoLato) { }
public Gioco(ITavola tavola, Lato prossimoLato) { Tavola = tavola; _prossimoTurno = prossimoLato; _parita = false; }
public Gioco(ITavola tavola) { Tavola = tavola; _prossimoTurno = Lato.A; _parita = false; }
public HeuristicFunctionValue(Lato latoPlayer) { _latoPlayer = latoPlayer; }