//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); }
protected override ValoreMossa GetValoreMossa(IGioco gioco, int depth) { ValoreMossa mossa = PatternMatching(gioco); if (mossa != null) return mossa; else { return base.GetValoreMossa(gioco, depth); } }
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); } }
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); }
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(); }
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)); } }
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; }
protected override ValoreMossa GetValoreMossa(IGioco gioco, int depth) { ValoreMossa mossa = PatternMatching(gioco); if (mossa != null) { return(mossa); } else { return(base.GetValoreMossa(gioco, depth)); } }
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)); } }
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); } }
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()); }
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); }
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); }
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; }
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); }
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); }
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); }
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; }
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()); }
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); }
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); }
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; }
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; }
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); }
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); } }
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; } }
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 abstract ValoreMossa GetValoreMossa(IGioco gioco, int depth);
public abstract int Elaborazione(IGioco gioco);
public override int Elaborazione(IGioco gioco) { return(0); }
public override int Elaborazione(IGioco gioco) { return 0; }