protected override Card OnChoose(IPlayer myself, GameState state) { var briscola = state.Briscola; SetLeagueComponents(state.Dish.Count, state.Players); var probabilityPoints = new List <MoveValue>(); var strategyCalculator = new BriscolaCalculator(state, _league); var currentDish = new Model.Deck(state.Dish); if (state.Dish.Count == 0) { // Penalizzare la briscola // Meglio non mettere carichi // Favorire le carte forti Debug.WriteLine("CARTE DI PRIMA MANO "); var cardsInfo = new List <CardInfo>(); foreach (var handCard in new Model.Deck(myself.HandCards)) { var baseWeight = strategyCalculator.GetCardWeight(handCard, _missingCards); var weight = baseWeight; if (handCard.IsCaricoOBriscola(briscola)) { weight *= (decimal) - 1; } cardsInfo.Add(new CardInfo() { Card = handCard, Weight = weight }); Debug.WriteLine($"Weight del {handCard.Value} di {handCard.Seed} : {baseWeight:000.000} -> {weight:000.000}"); } // Seleziona la carta che massimizza il peso var selectedCard = cardsInfo.Where(x => x.Weight == cardsInfo.Max(y => y.Weight)) .Select(x => x.Card) .First(); if (myself.HandCards.Count(x => x.IsCaricoOBriscola(briscola)) == myself.HandCards.Count()) { Debug.WriteLine("Non posso far altro che giocare carico o briscola"); } if (myself.HandCards.Count(x => x.IsCaricoOBriscola(briscola)) < myself.HandCards.Count() && (selectedCard.IsCaricoOBriscola(briscola))) { Debug.WriteLine("******* Ho buttato carico o briscola ad cazzum"); } return(selectedCard); } if (state.Dish.Count == 1) { // Vai su se possibile ma non di carico // Non buttare carico // Non butto butta la briscola se ci sono pochi punti oppure un'altra briscola var firstDishCard = state.Dish.First(); Debug.WriteLine("CARTE DI SECONDA MANO "); var cardsInfo = new List <CardInfo>(); foreach (var handCard in new Model.Deck(myself.HandCards)) { var baseWeight = strategyCalculator.GetCardWeight(handCard, _missingCards); var weight = baseWeight; if (handCard.IsBriscola(briscola)) { if (!firstDishCard.IsCarico() || firstDishCard.IsBriscola(briscola)) { weight = Math.Abs(weight) * (decimal) - 1; } } if (handCard.IsCaricoNonBriscola(briscola) && (!strategyCalculator.IsBestCardInDish(currentDish, handCard) || strategyCalculator.GetCardWinningProbabilty(handCard, _missingCards) < 1)) { weight = Math.Abs(weight) * (decimal) - 1; } cardsInfo.Add(new CardInfo() { Card = handCard, Weight = weight }); Debug.WriteLine($"Weight del {handCard.Value} di {handCard.Seed} : {baseWeight:000.000} -> {weight:000.000}"); } // Seleziona la carta che massimizza il peso var selectedCard = cardsInfo.Where(x => x.Weight == cardsInfo.Max(y => y.Weight)) .Select(x => x.Card) .First(); if (!selectedCard.IsBriscola(briscola) && selectedCard.IsCarico() && strategyCalculator.GetCardWinningProbabilty(selectedCard, _missingCards) == 1 && strategyCalculator.IsBestCardInDish(currentDish, selectedCard)) { Debug.WriteLine("Butto carico perchè vince"); } if (selectedCard.IsBriscola(briscola) && firstDishCard.GetScore() >= 10 && !firstDishCard.IsBriscola(briscola)) { Debug.WriteLine("Butto briscola perchè c'è un carico"); } if (myself.HandCards.Count(x => (x.IsBriscola(briscola) && x.GetScore() < 10) || x.IsCarico()) == myself.HandCards.Count()) { Debug.WriteLine("Non posso far altro che giocare carico o briscola"); } return(selectedCard); } if (state.Dish.Count() == 2) { Debug.WriteLine("CARTE DI TERZA MANO "); var iWin = _league.Contains(strategyCalculator.Winner(new Model.Deck(state.Dish))); var cardsInfo = new List <CardInfo>(); foreach (var handCard in new Model.Deck(myself.HandCards)) { var baseWeight = strategyCalculator.GetCardWeight(handCard, _missingCards); var weight = baseWeight; var tempDish = new Model.Deck(state.Dish); var points = tempDish.GetPoints(); tempDish.Add(handCard); //prendere di carico var baseProbability = strategyCalculator.GetCardWinningProbabilty(handCard, _missingCards); if (handCard.IsCaricoNonBriscola(state.Briscola) && baseProbability < 1) { weight = Math.Abs(weight) * (decimal) - 1; } //prendere di carico di briscola if (handCard.IsCaricoDiBriscola(state.Briscola) && (points < 10 || !strategyCalculator.IsBestCardInDish(tempDish, handCard))) { weight = Math.Abs(weight) * (decimal) - 1; } // prende di briscola if (handCard.IsBriscola(state.Briscola) && !handCard.IsCarico() && (points < 10 || !strategyCalculator.IsBestCardInDish(tempDish, handCard))) { weight = Math.Abs(weight) * (decimal) - 1; } cardsInfo.Add(new CardInfo() { Card = handCard, Weight = weight }); Debug.WriteLine($"Weight del {handCard.Value} di {handCard.Seed} : {baseWeight:000.000} -> {weight:000.000}"); } var selectedCard = cardsInfo.Where(x => x.Weight == cardsInfo.Max(y => y.Weight)) .Select(x => x.Card) .First(); return(selectedCard); } if (state.Dish.Count() == 3) { Debug.WriteLine("CARTE DI QUARTA MANO"); var iWin = _league.Contains(strategyCalculator.Winner(new Model.Deck(state.Dish))); var cardsInfo = new List <CardInfo>(); foreach (var handCard in new Model.Deck(myself.HandCards)) { var baseWeight = strategyCalculator.GetCardWeight(handCard, _missingCards); var weight = baseWeight; // Non buttare briscola if (iWin && handCard.IsCaricoNonBriscola(state.Briscola)) { weight = Math.Abs(weight) * (decimal) - 1; } if (!iWin) { var tempDish = new Model.Deck(state.Dish); var points = tempDish.GetPoints(); tempDish.Add(handCard); //prendere di carico if (handCard.IsCaricoNonBriscola(state.Briscola) && !strategyCalculator.IsBestCardInDish(tempDish, handCard)) { weight = Math.Abs(weight) * (decimal) - 1; } //prendere di carico di briscola if (handCard.IsCaricoDiBriscola(state.Briscola) && (points < 10 || !strategyCalculator.IsBestCardInDish(tempDish, handCard))) { weight = Math.Abs(weight) * (decimal) - 1; } // prende di briscola if (handCard.IsBriscola(state.Briscola) && !handCard.IsCarico() && (points < 10 || !strategyCalculator.IsBestCardInDish(tempDish, handCard))) { weight = Math.Abs(weight) * (decimal) - 1; } // prende senza briscola if (!handCard.IsBriscola(state.Briscola) && (points < 6 || !strategyCalculator.IsBestCardInDish(tempDish, handCard))) { weight = Math.Abs(weight) * (decimal) - 1; } } cardsInfo.Add(new CardInfo() { Card = handCard, Weight = weight }); Debug.WriteLine($"Weight del {handCard.Value} di {handCard.Seed} : {baseWeight:000.000} -> {weight:000.000}"); } // Seleziona la carta che massimizza il peso var selectedCard = cardsInfo.Where(x => x.Weight == cardsInfo.Max(y => y.Weight)) .Select(x => x.Card) .First(); return(selectedCard); } // random return(myself.HandCards.OrderBy(x => new Guid()).First()); }