예제 #1
0
        public void ClearTankAlgorithm()
        {
            // Позволяем очистить алгоритм, если он не выполняется
            if (!ParallelAlgorithm.GetInstance().running&& ParallelAlgorithm.GetInstance().currentAction == 0)
            {
                if (MessageBox.Show("Вы уверены, что хотите очистить алгоритм данного танка? Все несохраненные данные будут утеряны.",
                                    "Очистка алгоритма", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    for (int i = dgvAlgorithm.Rows.Count - 1; i >= 0; i--)
                    {
                        dgvAlgorithm.Rows.RemoveAt(i);
                    }

                    dgvAlgorithm.ClearSelection();
                    dgvAlgorithm.Focus();
                }
            }
            else
            {
                MessageBox.Show("Чтобы очистить алгоритм, необходимо сначала остановить его.",
                                "Очистка алгоритма", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
예제 #2
0
        public void SaveAlgorithm()
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(ParallelAlgorithm));
            string        xmlContent    = string.Empty;

            using (StringWriter textWriter = new StringWriter())
            {
                xmlSerializer.Serialize(textWriter, ParallelAlgorithm.GetInstance());
                xmlContent = textWriter.ToString();
            }

            AlgorithmModel algorithm = new AlgorithmModel();

            algorithm.Id           = id;
            algorithm.XmlContent   = xmlContent;
            algorithm.Result       = result;
            algorithm.Success      = success;
            algorithm.CreationDate = DateTime.Now;
            algorithm.Map          = Settings.GetInstance().currentMap;
            algorithm.User         = Settings.GetInstance().currentUser;

            Settings.GetInstance().context.Algorithms.Add(algorithm);
            Settings.GetInstance().context.SaveChanges();
        }
예제 #3
0
        public void SetCommand(ComboBox cb)
        {
            if (cb.SelectedIndex == -1)
            {
                return;
            }

            if (!ParallelAlgorithm.GetInstance().running&& ParallelAlgorithm.GetInstance().currentAction == 0)
            {
                // Задаем номер стобца
                int index = 0;
                switch (cb.Name)
                {
                case "cbMove":
                    index = 1;
                    break;

                case "cbCharge":
                    index = 2;
                    break;

                case "cbTurret":
                    index = 3;
                    break;
                }

                // Изменяем команды выделенного действия алгоритма
                if (dgvAlgorithm.SelectedCells.Count != 0)
                {
                    dgvAlgorithm.Rows[dgvAlgorithm.SelectedCells[0].RowIndex].Cells[index].Value = cb.SelectedItem.ToString();
                }
                // Вставляем новое действие в конец алгоритма
                else
                {
                    int    number = dgvAlgorithm.RowCount + 1;
                    string move   = index == 1 ? cb.SelectedItem.ToString() : "Бездействие";
                    string charge = index == 2 ? cb.SelectedItem.ToString() : "Бездействие";
                    string turret = index == 3 ? cb.SelectedItem.ToString() : "Бездействие";
                    dgvAlgorithm.Rows.Add(number, move, charge, turret);

                    // Перемещаем таблицу вниз, чтобы были видны новые добавленные дейтсвия
                    try
                    {
                        dgvAlgorithm.FirstDisplayedScrollingRowIndex = dgvAlgorithm.Rows.Count - 1;
                    }
                    catch (Exception)
                    {
                        // Ignore exception
                    }
                }

                // Отменяем выделение и ставим фокус на таблице
                dgvAlgorithm.ClearSelection();
                dgvAlgorithm.Focus();
            }
            else
            {
                MessageBox.Show("Чтобы изменить команды алгоритма, необходимо сначала остановить его.",
                                "Изменение команд алгоритма", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
 public Errors GetErrors()
 {
     return(ParallelAlgorithm.GetInstance().errors);
 }
 public bool CheckErrors()
 {
     return(ParallelAlgorithm.GetInstance().errors.Check());
 }
 public double ComputeEfficiency(double mapWidth, double mapHeight, double initiallyBurningTrees, double totalTrees, double burnedTrees)
 {
     return(ParallelAlgorithm.GetInstance().ComputeEfficiency(mapWidth, mapHeight, initiallyBurningTrees, totalTrees, burnedTrees));
 }
 public bool IsExecuted()
 {
     return(ParallelAlgorithm.GetInstance().IsExecuted());
 }
 public void StepAlgorithm()
 {
     ParallelAlgorithm.GetInstance().Step();
 }
 public void SaveAlgorithm(IOpenSave openSave)
 {
     ParallelAlgorithm.GetInstance().SaveAlgorithm(openSave);
 }
 public void ClearAlgorithm()
 {
     ParallelAlgorithm.GetInstance().Clear();
 }
 public void RunAlgorithm()
 {
     ParallelAlgorithm.GetInstance().Run();
 }
 public void ReloadAlgorithm()
 {
     ParallelAlgorithm.GetInstance().Reload();
 }
        public static void ParallelAlgorithmController_Loaded(object sender, ParallelAlgorithm.LoadEventArgs e)
        {
            DetachEvents();

            planForm.dgvPlan.Rows.Clear();
            //planForm.dgvPlan.Rows.Add(1);
            //planForm.dgvPlan.Rows[0].Cells[0].Value = 1;

            // Обновляем DataGridView в соответствии с алгоритмом
            for (int i = 0; i < algorithmForms.Count; i++)
            {
                // Очищаем таблицу перед добавлением строк
                algorithmForms[i].dgvAlgorithm.Rows.Clear();

                // Заполняем таблицу данными алгоритма
                for (int j = 0; j < ParallelAlgorithm.GetInstance().algorithms[i].actions.Count; j++)
                {
                    Action action = ParallelAlgorithm.GetInstance().algorithms[i].actions[j];

                    int    number   = j + 1;
                    string move     = action.commands[(int)Action.Types.Move].ToString();
                    string charge   = action.commands[(int)Action.Types.Charge].ToString();
                    string turret   = action.commands[(int)Action.Types.Turret].ToString();
                    uint?  planItem = action.planItem;

                    algorithmForms[i].dgvAlgorithm.Rows.Add(number, move, charge, turret, planItem != 0 ? planItem : null);
                }

                // Отменяем выделение
                algorithmForms[i].dgvAlgorithm.ClearSelection();
            }

            // Обновляем DataGridView плана в соответствии с алгоритмом
            for (int i = 0; i < ParallelAlgorithm.GetInstance().plan.items.Count; i++)
            {
                if (planForm.dgvPlan.Columns.Count == 2)
                {
                    planForm.dgvPlan.Rows.Add(ParallelAlgorithm.GetInstance().plan.items[i].number,
                                              ParallelAlgorithm.GetInstance().plan.items[i].tankActions[0]);
                }

                if (planForm.dgvPlan.Columns.Count == 3)
                {
                    planForm.dgvPlan.Rows.Add(ParallelAlgorithm.GetInstance().plan.items[i].number,
                                              ParallelAlgorithm.GetInstance().plan.items[i].tankActions[0],
                                              ParallelAlgorithm.GetInstance().plan.items[i].tankActions[1]);
                }

                if (planForm.dgvPlan.Columns.Count == 4)
                {
                    planForm.dgvPlan.Rows.Add(ParallelAlgorithm.GetInstance().plan.items[i].number,
                                              ParallelAlgorithm.GetInstance().plan.items[i].tankActions[0],
                                              ParallelAlgorithm.GetInstance().plan.items[i].tankActions[1],
                                              ParallelAlgorithm.GetInstance().plan.items[i].tankActions[2]);
                }

                if (planForm.dgvPlan.Columns.Count == 5)
                {
                    planForm.dgvPlan.Rows.Add(ParallelAlgorithm.GetInstance().plan.items[i].number,
                                              ParallelAlgorithm.GetInstance().plan.items[i].tankActions[0],
                                              ParallelAlgorithm.GetInstance().plan.items[i].tankActions[1],
                                              ParallelAlgorithm.GetInstance().plan.items[i].tankActions[2],
                                              ParallelAlgorithm.GetInstance().plan.items[i].tankActions[3]);
                }

                //planForm.dgvPlan.Rows.Add(ParallelAlgorithm.GetInstance().plan.items.Count);
                //planForm.dgvPlan.Rows[i].Cells[0].Value = ParallelAlgorithm.GetInstance().plan.items[i].number;

                //for (int j = 0; j < ParallelAlgorithm.GetInstance().plan.items[i].tankActions.Count; j++)
                //{
                //    planForm.dgvPlan.Rows[i].Cells[j + 1].Value = ParallelAlgorithm.GetInstance().plan.items[i].tankActions[j];
                //}
            }

            AttachEvents();
        }
예제 #14
0
 private void button1_Click(object sender, EventArgs e)
 {
     var t = ParallelAlgorithm.GetInstance();
 }
 public void ClearErrors()
 {
     ParallelAlgorithm.GetInstance().errors.Clear();
 }
예제 #16
0
        // Выполняет построение мира, инициализирует точки старта объектов
        public void BuildWorld()
        {
            // Устанавливаем параметры карты
            Utilities.GetInstance().TILE_SIZE          = map.GetTileSize().X;
            Utilities.GetInstance().TANKS_COUNT        = map.GetObjects("tank").Count;
            Utilities.GetInstance().WIDTH_TILE_COUNT   = (uint)map.width;
            Utilities.GetInstance().HEIGHT_TILE_COUNT  = (uint)map.height;
            Utilities.GetInstance().INIT_BURNING_TREES = map.GetObjects("tree").Where(obj => obj.GetPropertyBool("burns")).Count();

            coordinateSystem = new CoordinateSystem(Utilities.GetInstance().WIDTH_TILE_COUNT, Utilities.GetInstance().HEIGHT_TILE_COUNT, resources);
            traces           = new List <WaterTrace>();

            // Устанавливаем направление ветра
            wind = new Wind(Textures.ID.Wind, resources, map.properties["wind"]);
            //switch (map.properties["wind"])
            //{
            //    case "up":
            //        wind = new Wind(Wind.Direction.Up);
            //        break;
            //    case "upleft":
            //        wind = new Wind(Wind.Direction.UpLeft);
            //        break;
            //    case "left":
            //        wind = new Wind(Wind.Direction.Left);
            //        break;
            //    case "leftdown":
            //        wind = new Wind(Wind.Direction.LeftDown);
            //        break;
            //    case "down":
            //        wind = new Wind(Wind.Direction.Down);
            //        break;
            //    case "downright":
            //        wind = new Wind(Wind.Direction.DownRight);
            //        break;
            //    case "right":
            //        wind = new Wind(Wind.Direction.Right);
            //        break;
            //    case "rightup":
            //        wind = new Wind(Wind.Direction.RightUp);
            //        break;
            //    default:
            //        throw new Exception("Неверно указано направление ветра. Проверьте правильность значений переменных карты.");
            //}

            // Устанавливаем начальное положение объектов местности (деревьев, озер, гор)
            terrain = new Terrain(map.GetAllObjects(), resources, wind);

            // TODO: Добавить проверки на корректные цифры из файла карты (кратные цифры...)
            // Устанавливаем начальное положение танков
            tanks = new List <Tank>();
            for (int i = 0; i < map.GetObjects("tank").Count; i++)
            {
                // Создаем экземпляр танка
                GameObject tankObject = map.GetObjects("tank")[i];
                Tank       tank       = new Tank((Textures.ID)(i * 2), (Textures.ID)(i * 2 + 1), resources, (Tank.TankColor)i);
                tank.SetTerrain(terrain);
                tank.SetTanks(tanks);
                tank.SetAlgorithm(ParallelAlgorithm.GetInstance()[i]);
                switch (Utilities.NormalizedRotation(tankObject.rotation))
                {
                case 0:
                    tank.SetPosition(new Vector2f(tankObject.rect.Left + Utilities.GetInstance().TILE_SIZE / 2, tankObject.rect.Top - Utilities.GetInstance().TILE_SIZE / 2));
                    break;

                case 90:
                    tank.SetPosition(new Vector2f(tankObject.rect.Left + Utilities.GetInstance().TILE_SIZE / 2, tankObject.rect.Top + Utilities.GetInstance().TILE_SIZE / 2));
                    break;

                case 180:
                    tank.SetPosition(new Vector2f(tankObject.rect.Left - Utilities.GetInstance().TILE_SIZE / 2, tankObject.rect.Top + Utilities.GetInstance().TILE_SIZE / 2));
                    break;

                case 270:
                    tank.SetPosition(new Vector2f(tankObject.rect.Left - Utilities.GetInstance().TILE_SIZE / 2, tankObject.rect.Top - Utilities.GetInstance().TILE_SIZE / 2));
                    break;

                default:
                    throw new Exception("Неверно указаны координаты танка. Проверьте правильность значений переменных танка.");
                }
                tank.SetRotation(tankObject.rotation);
                //var o = map.GetObjects("tank")[i].properties;
                tank.turret.maxWaterPressure = map.GetObjects("tank")[i].GetPropertyInt("maxPressure");
                tank.turret.maxWaterCapacity = map.GetObjects("tank")[i].GetPropertyInt("maxCapacity");
                tank.turret.waterCapacity    = map.GetObjects("tank")[i].GetPropertyInt("capacity");

                // Подписываемся на обработку ошибок танка
                tank.Collided += (sender, e) =>
                {
                    ParallelAlgorithm.GetInstance().errors.Add(new CollidedError((Tank)sender, e.entity));
                };
                tank.MapLeft += (sender, e) =>
                {
                    ParallelAlgorithm.GetInstance().errors.Add(new LeftMapError((Tank)sender));
                };
                tank.NearLakeError += (sender, e) =>
                {
                    ParallelAlgorithm.GetInstance().errors.Add(new NearLakeError((Tank)sender));
                };
                tank.RefuelError += (sender, e) =>
                {
                    ParallelAlgorithm.GetInstance().errors.Add(new RefuelError((Tank)sender));
                };

                // Создаем экземпляр башни танка
                GameObject turretObject = map.GetObjects("turret").Find(turret => turret.rect.Left == tankObject.rect.Left && turret.rect.Top == tankObject.rect.Top);
                tank.SetTurretRotation(tankObject.rotation - turretObject.rotation);
                tank.turret.UpDown(false);

                // Подписываемся на обработку ошибок башни танка
                tank.turret.TurretPressureError += (sender, e) =>
                {
                    ParallelAlgorithm.GetInstance().errors.Add(new PressureError(((Turret)sender).tank));
                };
                tank.turret.TurretUpError += (sender, e) =>
                {
                    ParallelAlgorithm.GetInstance().errors.Add(new UpError(((Turret)sender).tank));
                };
                tank.turret.TurretDownError += (sender, e) =>
                {
                    ParallelAlgorithm.GetInstance().errors.Add(new DownError(((Turret)sender).tank));
                };
                tank.turret.WeaponAlreadyChargedError += (sender, e) =>
                {
                    ParallelAlgorithm.GetInstance().errors.Add(new WeaponAlreadyChargedError(((Turret)sender).tank));
                };
                tank.turret.WeaponUpChargeError += (sender, e) =>
                {
                    ParallelAlgorithm.GetInstance().errors.Add(new WeaponUpChargeError(((Turret)sender).tank));
                };
                tank.turret.WeaponUnchargedError += (sender, e) =>
                {
                    ParallelAlgorithm.GetInstance().errors.Add(new WeaponUnchargedError(((Turret)sender).tank));
                };
                tank.turret.InsufficientlyWaterError += (sender, e) =>
                {
                    ParallelAlgorithm.GetInstance().errors.Add(new InsufficientlyWaterError(((Turret)sender).tank));
                };
                // При выстреле сохраняем след от выстрела
                tank.turret.TurretShoot += (sender, e) =>
                {
                    traces.Add(new WaterTrace(tank.turret.up, tank.turret.sprite.Position,
                                              tank.turret.waterPressure, tank.turret.NormalizedRotation));
                };

                tanks.Add(tank);
            }
        }
예제 #17
0
        public void LoadAlgorithm(IOpenSave openSave)
        {
            instance = openSave.OpenAlgorithm();

            Loaded?.Invoke(this, new LoadEventArgs());
        }