Пример #1
0
        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;
                }
            }
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
 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;
         }
     }
 }
Пример #4
0
        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;
            }
        }