Exemple #1
0
        public static Dagger Generate()
        {
            Dagger d = new Dagger();

            d.Id    = 1;
            d.Name  = "匕首";
            d.Level = 1;
            d.ATK   = MainRandom.Gen(1, 3);
            return(d);
        }
 return new Random(MainRandom.Next());
Exemple #3
0
        public bool SimulateOneStep()
        {
            isSomethingChanged = true;

            if (isItFirstStep)
            {
                weights.Clear();

                foreach (var place in Net.places)
                {
                    weights.Add(place.Id, place.NumberOfTokens);
                }
                isItFirstStep = false;
            }

            List <VPlace> initialPlaces = new List <VPlace>();

            foreach (VPlace place in Net.places)
            {
                int numberOfOutgoingArcs = place.ThisArcs.Count(t => place != t.To);

                //todo вот здесь если токены не кружками, то будет плохо
                if (place.TokensList.Count != 0 && numberOfOutgoingArcs != 0)
                {
                    initialPlaces.Add(place);
                }
                foreach (Ellipse ellipse in place.TokensList)
                {
                    ellipse.Fill = Brushes.Black;
                }
            }

            var outgoingTransitions = new List <VTransition>();

            foreach (var place in initialPlaces)
            {
                foreach (var arc1 in place.ThisArcs)
                {
                    if (arc1.From != place)
                    {
                        continue;
                    }

                    foreach (var arc2 in arc1.To.ThisArcs)
                    {
                        var mayBeEnabled = true;

                        if (arc2.To != arc1.To)
                        {
                            continue;
                        }

                        foreach (var arc in arc1.To.ThisArcs)
                        {
                            if (arc.To != arc1.To)
                            {
                                continue;
                            }
                            int numberOfRequiredTokens;
                            int.TryParse(arc.Weight, out numberOfRequiredTokens);
                            var numberOfExistingTokens = (arc.From as VPlace).NumberOfTokens;

                            if (numberOfRequiredTokens <= numberOfExistingTokens)
                            {
                                continue;
                            }
                            mayBeEnabled = false;
                            break;
                        }
                        if (!outgoingTransitions.Contains(arc1.To as VTransition) && mayBeEnabled)
                        {
                            outgoingTransitions.Add(arc1.To as VTransition);
                        }
                    }
                }
            }

            if (outgoingTransitions.Count != 0)
            {
                foreach (VTransition transition in outgoingTransitions)
                {
                    (GetKeyByValueForFigures(transition)
                     as Shape).Stroke = Brushes.Black;
                }


                if (_isTransitionSelected == false)
                {
                    if (_modeChoice == Choice.Forced)
                    {
                        if (outgoingTransitions.Count > 1)
                        {
                            _leftMouseButtonMode = LeftMouseButtonMode.ChooseTransition;
                            foreach (VTransition transition in outgoingTransitions)
                            {
                                SolidColorBrush brush = new SolidColorBrush();
                                brush.Color = Color.FromRgb(255, 0, 51);
                                (GetKeyByValueForFigures(transition) as Shape).Stroke = brush;
                            }
                            return(false);
                        }
                        else
                        {
                            enabledTransition = outgoingTransitions[0];
                        }
                    }
                    else
                    {
                        var transitionsWithTopPriority = new List <VTransition>();
                        outgoingTransitions.Sort(new Comparison <VTransition>((VTransition a, VTransition b) => (a.Priority - b.Priority)));

                        var transitionWithTopPriority = outgoingTransitions.Find(new Predicate <VTransition>((VTransition t) => t.Priority > 0));

                        int topPriority = 0;
                        if (transitionWithTopPriority != null)
                        {
                            topPriority = transitionWithTopPriority.Priority;
                        }

                        outgoingTransitions = outgoingTransitions.FindAll(new Predicate <VTransition>((VTransition a) => (a.Priority == topPriority || a.Priority == 0)));

                        int indexOfEnabledTransition = MainRandom.Next(0, outgoingTransitions.Count);
                        enabledTransition = outgoingTransitions[indexOfEnabledTransition];
                    }
                }
                _isTransitionSelected = false;
                _leftMouseButtonMode  = LeftMouseButtonMode.Select;

                var isFirstRemove = true;

                foreach (var arc in enabledTransition.ThisArcs)
                {
                    if (arc.From == enabledTransition)
                    {
                        continue;
                    }

                    if (colored.Contains(arc.From))
                    {
                        colored.Remove(arc.From);
                        if (isFirstRemove)
                        {
                            numberOfLevels--;
                        }
                        isFirstRemove = false;
                    }
                    colored.Add(arc.From);
                }
                numberOfLevels++;

                if (colored.Contains(enabledTransition))
                {
                    colored.Remove(enabledTransition);
                    numberOfLevels--;
                }
                colored.Add(enabledTransition);

                numberOfLevels++;
                isFirstRemove = true;
                foreach (VArc arc in enabledTransition.ThisArcs)
                {
                    VPlace changedPlace;
                    if (arc.From != enabledTransition)
                    {
                        changedPlace = (arc.From as VPlace);
                        if (changedPlace.NumberOfTokens != 0)
                        {
                            if (changedPlace.NumberOfTokens < 5)
                            {
                                RemoveTokens(changedPlace);
                            }
                            else
                            {
                                MainModelCanvas.Children.Remove(changedPlace.NumberOfTokensLabel);
                            }
                        }
                        int delta;
                        int.TryParse(arc.Weight, out delta);
                        changedPlace.NumberOfTokens -= delta;
                    }
                    else
                    {
                        changedPlace = (arc.To as VPlace);
                        if (changedPlace.NumberOfTokens != 0)
                        {
                            if (changedPlace.NumberOfTokens < 5)
                            {
                                RemoveTokens(changedPlace);
                            }
                            else
                            {
                                MainModelCanvas.Children.Remove(changedPlace.NumberOfTokensLabel);
                            }
                        }
                        int delta;
                        int.TryParse(arc.Weight, out delta);
                        changedPlace.NumberOfTokens += delta;
                        if (colored.Contains(changedPlace))
                        {
                            colored.Remove(changedPlace);
                            if (isFirstRemove)
                            {
                                numberOfLevels--;
                            }
                            isFirstRemove = false;
                        }
                        colored.Add(changedPlace);
                    }



                    AddTokens(changedPlace);
                    if (arc.From != enabledTransition)
                    {
                        continue;
                    }
                    var placeToColor = (arc.To as VPlace);
                    foreach (var ellepse in placeToColor.TokensList)
                    {
                        var brush = new SolidColorBrush {
                            Color = Color.FromRgb(153, 255, 102)
                        };
                        ellepse.Fill   = brush;
                        ellepse.Stroke = Brushes.Black;
                    }
                }
                numberOfLevels++;

                if (simulationMode == SimulationMode.wave)
                {
                    ColorFigures();
                }


                if (marking.Count <= 0)
                {
                    return(false);
                }
                oneStepMarking = new int[Net.places.Count];
                for (int j = 0; j < Net.places.Count; j++)
                {
                    oneStepMarking[j] = Net.places[j].NumberOfTokens;
                }

                marking.Push(oneStepMarking);
                maxMarking++;

                textBoxSimulationCurrentMarking.Text += "M_" + (maxMarking - 1) + " = { ";
                for (int j = 0; j < oneStepMarking.Length - 1; j++)
                {
                    textBoxSimulationCurrentMarking.Text += oneStepMarking[j] + " | ";
                }
                textBoxSimulationCurrentMarking.Text += oneStepMarking[oneStepMarking.Length - 1] + " }\n";
                textBoxSimulationCurrentMarking.ScrollToEnd();
                return(false);
            }
            else
            {
                return(true);
            }
        }