void EnumeratePlayersChanceIndex(Int64 actionTreeNodeIdx, int[] chanceNodes, StrategicState state, Constraint constr) { for (int i = 0; i < _heroVarsInLeaves[actionTreeNodeIdx].Length; ++i) { int chanceNodeIdx = chanceNodes[i]; if (chanceNodeIdx == 0) { // There is no existing cards for this index (a "hole") continue; } int varH = _heroVarsInLeaves[actionTreeNodeIdx][i]; double[] potShares = new double[PLAYERS_COUNT]; UInt16 activePlayers = ActionTree.Nodes[actionTreeNodeIdx].ActivePlayers; //Debug.Assert(round == _roundsCount - 1 || CountBits.Count(activePlayers) == 1, "Must be either chance leaf or single active player"); ChanceTree.Nodes[chanceNodeIdx].GetPotShare(activePlayers, potShares); double chanceProbab = ChanceTree.Nodes[chanceNodeIdx].Probab; double result = state.Pot * potShares[HeroPosition] - state.InPot[HeroPosition]; double coeff = chanceProbab * result; if (varH != -1) { constr.AddVariable(varH, coeff); } else { // Special case - opponent folded before the hero has acted (e.g. small blind folds at the very beginning). // In this case there is no hero variable, and the v-variable is constant. // Constaint has the form: v3 = k3 + k13, or -v3 = -k3 - k13 constr.RightHandSide -= coeff; } } }
void EnumeratePlayersChanceIndex(int round, int player, Int64 actionTreeNodeIdx, int[] chanceNodes, int oppChanceIdx, int oppChanceIdxOffset, double oppStrategicProbab, StrategicState state, ref double nodeValue) { if (player == HeroPosition) { EnumeratePlayersChanceIndex(round, player + 1, actionTreeNodeIdx, chanceNodes, oppChanceIdx, oppChanceIdxOffset, oppStrategicProbab, state, ref nodeValue); return; } if (player == _playersCount) { int chanceNodeIdx = chanceNodes[oppChanceIdx]; if (chanceNodeIdx == 0) { // There is no existing cards for this index (a "hole") return; } double[] potShares = new double[_playersCount]; UInt16 activePlayers = ActionTree.Nodes[actionTreeNodeIdx].ActivePlayers; Debug.Assert(round == _roundsCount - 1 || CountBits.Count(activePlayers) == 1, "Must be either chance leaf or single active player"); ChanceTree.Nodes[chanceNodeIdx].GetPotShare(activePlayers, potShares); double chanceProbab = ChanceTree.Nodes[chanceNodeIdx].Probab; double probab = chanceProbab * oppStrategicProbab; double heroValue = probab * (state.Pot * potShares[HeroPosition] - state.InPot[HeroPosition]); nodeValue += heroValue; return; } double[] strategicProbabs = _strategicProbabs[player][actionTreeNodeIdx]; for (int ci = 0; ci < _chanceIndexSizes[player][round]; ++ci) { double strategicProbab = strategicProbabs[ci]; EnumeratePlayersChanceIndex(round, player + 1, actionTreeNodeIdx, chanceNodes, oppChanceIdx + oppChanceIdxOffset * ci, oppChanceIdxOffset * _chanceIndexSizes[player][round], strategicProbab * oppStrategicProbab, state, ref nodeValue); } }
private void _selectUnitFromList() { if (sodlierstTextures.Any(rectangle => rectangle.Contains(Mouse.GetState().Position))) { FirstUnitPlacing = true; int UnitIndex = 0; for (int i = 0; i < sodlierstTextures.Count; i++) { if (sodlierstTextures[i].Contains(Mouse.GetState().Position)) { UnitIndex = i; break; } } SelectedUnit = _currentWave.AvailableUnits[UnitIndex]; if (SelectedUnit != null) { Logger.Log.Debug("Unit selected: " + SelectedUnit); state = StrategicState.SelectedUnit; } } }
private void _StrategicClick() { FirstUnitPlacing = false; UnitSelected = true; SelectedField = (Field)PickObject(new List <Type>() { typeof(Field) }); switch (state) { case StrategicState.Default: _selectUnitFromList(); break; case StrategicState.SelectedUnit: if (SelectedUnit == null) { state = StrategicState.Default; return; } _selectUnitFromList(); if (SelectedField == null) { SelectedUnit = null; state = StrategicState.Default; return; } else if (SelectedField.StartingTile && SelectedField.CanPlaceUnit()) { _placeUnitOnField(SelectedUnit, SelectedField); state = StrategicState.NavigatingUnit; return; } else { SelectedUnit = null; state = StrategicState.Default; } break; case StrategicState.NavigatingUnit: if (SelectedUnit == null) { state = StrategicState.Default; return; } if (sodlierstTextures.Any(rectangle => rectangle.Contains(Mouse.GetState().Position))) { _unselectPath(SelectedUnit); if (!IsPathFinished(SelectedUnit)) { _removeUnitFromField(SelectedUnit); } _selectUnitFromList(); state = StrategicState.SelectedUnit; return; } else if (SelectedField == null) { _unselectPath(SelectedUnit); if (!IsPathFinished(SelectedUnit)) { _removeUnitFromField(SelectedUnit); } SelectedUnit = null; UnitSelected = false; state = StrategicState.Default; return; } if (SelectedUnit.Field.StartingTile && SelectedField.StartingTile) { _unselectPath(SelectedUnit); _replaceUnit(SelectedUnit, SelectedField); } // Clicking somewhere to unselect unit else if (IsPathFinished(SelectedUnit) && !SelectedUnit.TargetFields.Contains(SelectedField)) { _unselectPath(SelectedUnit); _removeUnitFromField(SelectedUnit); state = StrategicState.Default; SelectedUnit = null; UnitSelected = false; return; } else if (SelectedUnit.Field.Index != SelectedField.Index && !SelectedUnit.TargetFields.Contains(SelectedField) && SelectedField.CanPlaceUnit()) { List <int> path; if (SelectedUnit.TargetFields.Count > 0) { path = Pathfinder.FindPath(SelectedUnit.TargetFields.Last(), SelectedField); } else { path = Pathfinder.FindPath(SelectedUnit.Field, SelectedField); } if (path != null) { for (int i = 0; i < path.Count; i++) { SelectedUnit.AddField(((Board)SelectedUnit.Field.Parent.Parent).GetByIndex(path.ElementAt(i))); Logger.Log.Debug(path.ElementAt(i)); } } else { Logger.Log.Debug("Path not found"); } Logger.Log.Debug("Pathfinding done"); if (SelectedUnit.FieldsInWay.Last().FinishingTile) { SelectedField = null; } } else if (SelectedUnit.TargetFields.Contains(SelectedField)) { for (int i = SelectedUnit.TargetFields.Count - 1; i >= 0 && SelectedUnit.TargetFields.ElementAt(i) != SelectedField; i--) { Field f = SelectedUnit.TargetFields.ElementAt(i); SelectedUnit.TargetFields.RemoveAt(i); if (!SelectedUnit.TargetFields.Contains(f)) { f.IsPartOfWay = false; } } if (SelectedUnit.TargetFields.Last() == SelectedField) { SelectedUnit.TargetFields.RemoveAt(SelectedUnit.TargetFields.Count - 1); if (!SelectedUnit.TargetFields.Contains(SelectedField)) { SelectedField.IsPartOfWay = false; } } } break; } }