public IGioco Clone() { ITavola tavola = (ITavola)this.Tavola.Clone(); Gioco newGame = new Gioco(tavola); newGame.Vincitore = this.Vincitore; newGame._parita = this.Parita; newGame._prossimoTurno = this.ProssimoTurno; return(newGame); }
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 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 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 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); }
public Stato(ITavola tavola, IPlayer currentTurn) { Tavola = tavola; CurrentTurn = currentTurn; }
public Gioco(ITavola tavola, Lato prossimoLato) { Tavola = tavola; _prossimoTurno = prossimoLato; _parita = false; }
public Gioco(ITavola tavola) { Tavola = tavola; _prossimoTurno = Lato.A; _parita = false; }
public static void Render(ITavola tavola) { Console.WriteLine(String.Format(" {0} {1} {2} {3} {4} {5} {6} {7} ", " ", tavola.Buche[12].Semi, tavola.Buche[11].Semi, tavola.Buche[10].Semi, tavola.Buche[9].Semi, tavola.Buche[8].Semi, tavola.Buche[7].Semi, " ")); Console.WriteLine(String.Format(" {0} {1} {2} {3} {4} {5} {6} {7} ", tavola.Buche[13].Semi, " ", " ", " ", " ", " ", " ", tavola.Buche[6].Semi)); Console.WriteLine(String.Format(" {0} {1} {2} {3} {4} {5} {6} {7} ", " ", tavola.Buche[0].Semi, tavola.Buche[1].Semi, tavola.Buche[2].Semi, tavola.Buche[3].Semi, tavola.Buche[4].Semi, tavola.Buche[5].Semi, " ")); }
public GiocoRuba2(ITavola tavola) : base(tavola) { }
public GiocoRuba2(ITavola tavola, Lato prossimoLato) : base(tavola, prossimoLato) { }