public int[] CheckOffer(int[] o) { if (o != null) { m_rounds--; bool accept = CheckOffer(o, m_rounds); if (accept) { m_log(Utils.Format("Accepting offer {0}", Utils.StringJoin(",", o))); return(null); } } m_rounds--; if (m_rounds == 0) { return(m_counts); } OfferHolder offer = MakeOffer(m_rounds); m_log(Utils.Format("[{0}] Sending offer {1}", m_rounds, offer)); // don't forget to clone at this point, otherwise local offer could be garbled! return(Utils.ArrayClone(offer.Offer)); }
private bool ValidOffer(OfferHolder offer, bool enemyOffers) { if (offer.MyIncome == 0 || offer.EnemyAverage <= 0 || offer.EnemyMedian <= 0) { return(false); } if (!enemyOffers) { if (offer.EnemyAverage < this.m_maxIncome * MinOfferThreshold) { return(false); } if (m_rejectedOffers.Contains(offer.OfferCode)) { return(false); } } return(offer.MyIncome > 0); }
public bool CheckOffer(int[] offer, int turnsLeft) { // enemy would not offer me the items that could give him 9+ score, so let's remove them from the offer table { bool changed = false; for (int i = 0; i < m_allValues.Length; i++) { if (m_excludedValues.Contains(i)) { continue; } // enemy income for his offer (inverted counts) int income = AnalyzerEngine.CalculateIncomeForOffer(m_counts, m_allValues[i], offer, false); if (income >= m_maxIncome * RejectThreshold) // items enemy offered me would cost him 9-10, that is very unlikely { m_excludedValues.Add(i); changed = true; } // enemy income for items left to enemy int invIncome = AnalyzerEngine.CalculateIncomeForOffer(m_counts, m_allValues[i], offer, true); if (invIncome < m_maxIncome * MinEnemyIncomeThreshold) // items left to enemy would cost less then 2-3, that is definitelly not possible { m_excludedValues.Add(i); changed = true; } } if (changed) { m_offers = AnalyzerEngine.FindBestOffers(m_counts, m_allValues, m_excludedValues, m_myValuesIndex); #if DEBUG_RIG PrintStats(); #endif #if LOG_OFFERS m_log("Revised list of offers (according to enemy move)"); for (int i = 0; i < m_offers.Length; i++) { m_log(Utils.Format("{0}: valid: {1}", m_offers[i], ValidOffer(m_offers[i], false))); } #endif } } OfferHolder holder = AnalyzerEngine.TestOffer(m_counts, m_allValues, m_excludedValues, m_myValuesIndex, offer); if (holder == null) // should never happen now { m_log("!!!!Empty offer!!!!"); return(false); } m_log(Utils.Format("[{0}] Checking offer {1}", turnsLeft, holder)); if (holder.MyIncome >= m_maxIncome * AcceptThreshold) // always accept if we're given good option { return(true); } if (turnsLeft <= 1 && holder.MyIncome > 0) // French move ;) { m_log("I surrender! Give me at least " + holder.MyIncome); return(true); } if (!ValidOffer(holder, true)) { return(false); } if (m_lastOffer != null && holder.MyIncome >= m_lastOffer.MyIncome) // better than my current offer { return(true); } return(false); }
public OfferHolder MakeOffer(int turnsLeft) { OfferHolder selectedOffer = null; for (int i = 0; i < m_offers.Length; i++) { if (ValidOffer(m_offers[i], false)) { selectedOffer = m_offers[i]; break; } } if (m_greed) // greed guy does not want to make last offer { if (selectedOffer == null) // no offers left, stick with last one { selectedOffer = m_lastOffer; } } else { if (turnsLeft <= 2) { this.m_log("Making last offer!"); selectedOffer = null; for (var i = 0; i < this.m_offers.Length; i++) { if (this.m_offers[i].EnemyMedian > 0 && this.m_offers[i].EnemyAverage >= this.m_maxIncome * LastOfferThreshold && this.m_offers[i].MyIncome > 0) { return(this.m_offers[i]); } } } if (selectedOffer == null) // no offers left, try relaxed list { m_log("No meaninful offers left!"); for (int i = 0; i < m_offers.Length; i++) { if (this.m_offers[i].EnemyMedian > 0 && m_offers[i].EnemyAverage >= MinOfferThreshold * m_maxIncome && m_offers[i].MyIncome > 0 && !m_rejectedOffers.Contains(m_offers[i].OfferCode)) // relaxed check: not fairest option, but still good { selectedOffer = m_offers[i]; break; } } if (selectedOffer == null) // no offers left, stick with last one { m_log("No offers left and no relaxed found!"); selectedOffer = m_lastOffer; } } } m_rejectedOffers.Add(selectedOffer.OfferCode); m_lastOffer = selectedOffer; // if enemy rejected my offer, that means that his total for this offer never reached 9 or 10 bool changed = false; for (int i = 0; i < m_allValues.Length; i++) { if (m_excludedValues.Contains(i)) { continue; } int income = AnalyzerEngine.CalculateIncomeForOffer(m_counts, m_allValues[i], m_lastOffer.Offer, true); if (income >= m_maxIncome * RejectThreshold) { m_excludedValues.Add(i); changed = true; } } if (changed) { m_offers = AnalyzerEngine.FindBestOffers(m_counts, m_allValues, m_excludedValues, m_myValuesIndex); #if DEBUG_RIG PrintStats(); #endif #if LOG_OFFERS m_log("Revised list of offers (for next move)"); for (int i = 0; i < m_offers.Length; i++) { m_log(Utils.Format("{0}: valid: {1}", m_offers[i], ValidOffer(m_offers[i], false))); } #endif } return(selectedOffer); }