示例#1
0
        private void InsertAction(int number, Action action)
        {
            if (!ParallelAlgorithm.GetInstance().running&& ParallelAlgorithm.GetInstance().currentAction == 0)
            {
                dgvAlgorithm.Rows.Insert(number, number + 1, action.commands[0].ToString(),
                                         action.commands[1].ToString(), action.commands[2].ToString());

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

                // Пересчитываем номера строк таблицы
                for (int i = 0; i < dgvAlgorithm.Rows.Count; i++)
                {
                    dgvAlgorithm.Rows[i].Cells[0].Value = i + 1;
                }

                // Отменяем выделение и ставим фокус на таблице
                dgvAlgorithm.ClearSelection();
                dgvAlgorithm.Focus();
            }
            else
            {
                MessageBox.Show("Чтобы изменить команды алгоритма, необходимо сначала остановить его.",
                                "Изменение команд алгоритма", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        public static void ParallelAlgorithmController_Saving(object sender, ParallelAlgorithm.SaveEventArgs e)
        {
            Plan plan = new Plan();

            for (int i = 0; i < planForm.dgvPlan.Rows.Count - 1; i++)
            {
                PlanItem planItem = new PlanItem();
                planItem.number = (int)planForm.dgvPlan.Rows[i].Cells[0].Value;

                for (int j = 1; j < planForm.dgvPlan.Rows[i].Cells.Count; j++)
                {
                    if (planForm.dgvPlan.Rows[i].Cells[j].Value != null)
                    {
                        planItem.tankActions.Add(planForm.dgvPlan.Rows[i].Cells[j].Value.ToString());
                    }
                    else
                    {
                        planItem.tankActions.Add("");
                    }
                }

                plan.items.Add(planItem);
            }

            ParallelAlgorithm.GetInstance().plan = plan;
        }
示例#3
0
        public void SaveAlgorithm()
        {
            XmlSerializer formatter = new XmlSerializer(typeof(ParallelAlgorithm));

            using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write))
            {
                formatter.Serialize(fs, ParallelAlgorithm.GetInstance());
            }
        }
        private void StepAlgorithm()
        {
            if (ParallelAlgorithm.GetInstance().currentAction == 0)
            {
                AttachIndicators();
            }

            algorithmController.StepAlgorithm();
        }
        public static void ParallelAlgorithmController_AlgorithmExecuted(object sender, Algorithm.ExecuteEventArgs e)
        {
            int index = ParallelAlgorithm.GetInstance().algorithms.FindIndex(algo => algo == (Algorithm)sender);

            // Очищаем цвета всех строк в таблице
            foreach (DataGridViewRow row in algorithmForms[index].dgvAlgorithm.Rows)
            {
                row.DefaultCellStyle.BackColor = Color.White;
            }
        }
        private static void DgvAlgorithm_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
        {
            // Удаляем действие
            ParallelAlgorithm.GetInstance().DeleteAction((int)((DataGridView)sender).Tag, e.RowIndex);

            // Обновляем номера строк в таблице
            for (int i = e.RowIndex; i < ((DataGridView)sender).Rows.Count; i++)
            {
                ((DataGridView)sender).Rows[i].Cells[0].Value = i + 1;
            }
        }
        private static void DgvAlgorithm_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {
            DataGridViewRow row = ((DataGridView)sender).Rows[e.RowIndex];

            // Собираем команды с добавленного DataGridViewRow
            MoveCommand.Commands   moveCommand   = Utilities.ToMoveCommand(row.Cells[1].Value.ToString());
            ChargeCommand.Commands chargeCommand = Utilities.ToChargeCommand(row.Cells[2].Value.ToString());
            TurretCommand.Commands turretCommand = Utilities.ToTurretCommand(row.Cells[3].Value.ToString());

            // Добавляем Action в соответствующий алгоритм танка
            Action action = new Action(moveCommand, chargeCommand, turretCommand);

            ParallelAlgorithm.GetInstance().InsertAction((int)((DataGridView)sender).Tag, action, e.RowIndex);
        }
        public override void Extinguish(House house)
        {
            // Проверяем, был ли еще один выстрел на том же шаге алгоритма (эффект синергии)
            if (ParallelAlgorithm.GetInstance().currentAction == algorithmActionNumber)
            {
                currentShootsToExtinguishCount += 2;
            }

            algorithmActionNumber = ParallelAlgorithm.GetInstance().currentAction;

            if (++currentShootsToExtinguishCount >= needShootsToExtinguishCount)
            {
                house.state = new NormalHouseState();
            }
        }
示例#9
0
        public ParallelAlgorithm OpenAlgorithm()
        {
            XmlSerializer formatter = new XmlSerializer(typeof(ParallelAlgorithm));

            using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
            {
                // TODO: на всякий случай чистим
                ParallelAlgorithm.GetInstance().Clear();
                ParallelAlgorithm parallelAlgorithm = (ParallelAlgorithm)formatter.Deserialize(fs);

                // TODO: Почему-то грузит алгоритмы два раза
                parallelAlgorithm.algorithms.RemoveRange(0, parallelAlgorithm.algorithms.Count / 2);

                return(parallelAlgorithm);
            }
        }
示例#10
0
        private void InsertAction()
        {
            InsertActionForm insertActionForm = new InsertActionForm(dgvAlgorithm.Rows.Count);

            if (ParallelAlgorithm.GetInstance().currentAction == 0)
            {
                insertActionForm.ShowDialog();
            }
            else
            {
                MessageBox.Show("Чтобы вставить команду в алгоритм, необходимо сначала остановить его.",
                                "Вставка команды алгоритма", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

            if (insertActionForm.DialogResult == DialogResult.OK)
            {
                InsertAction(insertActionForm.Number, insertActionForm.Action);
            }
        }
示例#11
0
 private void SetPlanItem(uint planItem)
 {
     if (!ParallelAlgorithm.GetInstance().running&& ParallelAlgorithm.GetInstance().currentAction == 0)
     {
         if (dgvAlgorithm.SelectedRows.Count != 0)
         {
             dgvAlgorithm.SelectedRows[0].Cells[4].Value = planItem;
         }
         else
         {
             MessageBox.Show("Выделите строку, чтобы задать пункт плана.",
                             "Изменение пункта плана алгоритма", MessageBoxButtons.OK, MessageBoxIcon.Information);
         }
     }
     else
     {
         MessageBox.Show("Чтобы изменить пункт плана алгоритма, необходимо сначала остановить его.",
                         "Изменение пункта плана алгоритма", MessageBoxButtons.OK, MessageBoxIcon.Information);
     }
 }
        private static void DgvAlgorithm_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            DataGridViewRow row     = ((DataGridView)sender).Rows[e.RowIndex];
            Command         command = null;

            // Создаем команду в зависимости от измененного столбца
            switch (e.ColumnIndex)
            {
            // Команды исполнителей танка
            case 1:
                command = new MoveCommand(Utilities.ToMoveCommand(row.Cells[1].Value.ToString()));
                break;

            case 2:
                command = new ChargeCommand(Utilities.ToChargeCommand(row.Cells[2].Value.ToString()));
                break;

            case 3:
                command = new TurretCommand(Utilities.ToTurretCommand(row.Cells[3].Value.ToString()));
                break;

            // Пункт плана
            case 4:
                ParallelAlgorithm.GetInstance().SetPlanItem((int)((DataGridView)sender).Tag, e.RowIndex, (uint)row.Cells[4].Value);
                return;

            default:
                return;
            }

            // Меняем соответствующую команду алгоритма
            if (command != null)
            {
                ParallelAlgorithm.GetInstance().ChangeCommand((int)((DataGridView)sender).Tag, e.RowIndex, e.ColumnIndex - 1, command);
            }
            else
            {
                throw new Exception("Команде алгоритма присвоено несуществующее значение.");
            }
        }
        public static void ParallelAlgorithmController_NextActionPerforming(object sender, ParallelAlgorithm.PerformNextActionEventArgs e)
        {
            int i = 0;

            // Очищаем цвета всех строк в таблице плана
            foreach (DataGridViewRow row in planForm.dgvPlan.Rows)
            {
                foreach (DataGridViewCell cell in row.Cells)
                {
                    cell.Style.BackColor = Color.White;
                }
            }

            foreach (AlgorithmForm form in algorithmForms)
            {
                // Очищаем цвета всех строк в таблице алгоритмов
                foreach (DataGridViewRow row in form.dgvAlgorithm.Rows)
                {
                    row.DefaultCellStyle.BackColor = Color.White;
                }

                // Подсвечиваем текущее выполняющееся действие (если оно есть)
                try
                {
                    form.dgvAlgorithm.Rows[ParallelAlgorithm.GetInstance().currentAction - 1].DefaultCellStyle.BackColor = Color.Yellow;
                    object planItem = form.dgvAlgorithm.Rows[ParallelAlgorithm.GetInstance().currentAction - 1].Cells[4].Value;
                    if (planItem != null)
                    {
                        int index = int.Parse(((uint)planItem).ToString());
                        planForm.dgvPlan.Rows[index - 1].Cells[i + 1].Style.BackColor = Color.Yellow;
                    }
                }
                catch (Exception)
                {
                    // Ignore exception
                }

                i++;
            }
        }
示例#14
0
 public void DeleteAction()
 {
     // Позволяем удалить строку, если алгоритм не выполняется
     if (!ParallelAlgorithm.GetInstance().running&& ParallelAlgorithm.GetInstance().currentAction == 0)
     {
         if (dgvAlgorithm.SelectedRows.Count != 0)
         {
             dgvAlgorithm.Rows.RemoveAt(dgvAlgorithm.SelectedRows[0].Index);
             dgvAlgorithm.Focus();
         }
         else
         {
             MessageBox.Show("Выберите строку алгоритма, чтобы удалить ее.",
                             "Удаление строки алгоритма", MessageBoxButtons.OK, MessageBoxIcon.Information);
         }
     }
     else
     {
         MessageBox.Show("Чтобы удалить действие алгоритма, необходимо сначала остановить его.",
                         "Удаление строки алгоритма", MessageBoxButtons.OK, MessageBoxIcon.Information);
     }
 }
示例#15
0
 private void BlockTankAlgorithm(object sender)
 {
     // Позволяем заблокировать алгоритм, если он не выполняется
     if (!ParallelAlgorithm.GetInstance().running&& ParallelAlgorithm.GetInstance().currentAction == 0)
     {
         if (((CheckBox)sender).Checked)
         {
             ParallelAlgorithm.GetInstance()[(int)dgvAlgorithm.Tag].blocked = true;
             ((CheckBox)sender).BackgroundImage = Properties.Resources.Block;
         }
         else
         {
             ParallelAlgorithm.GetInstance()[(int)dgvAlgorithm.Tag].blocked = false;
             ((CheckBox)sender).BackgroundImage = Properties.Resources.Unblock;
         }
     }
     else
     {
         MessageBox.Show("Чтобы заблокировать алгоритм, необходимо сначала остановить его.",
                         "Блокировка алгоритма", MessageBoxButtons.OK, MessageBoxIcon.Information);
     }
 }
示例#16
0
        public void Run()
        {
            Clock clock = new Clock();
            Time  timeSinceLastUpdate = Time.Zero;

            while (gui.form.renderWindow.IsOpen)
            {
                Time dt = clock.Restart();
                timeSinceLastUpdate += dt;

                // Handle form events
                Application.DoEvents();

                // Чтобы быстрее реагировало на пошаговое выполнение, искусственно добавляем время
                if (ParallelAlgorithm.GetInstance().step)
                {
                    timeSinceLastUpdate += timePerFrame;
                }

                while (timeSinceLastUpdate > timePerFrame)
                {
                    timeSinceLastUpdate -= timePerFrame;

                    ProcessInput();
                    // TODO: Есть ли синтаксис, который позволяет обратиться к переменной типа bool и после этого ее переключить step = !step
                    if (ParallelAlgorithm.GetInstance().running || ParallelAlgorithm.GetInstance().step)
                    {
                        // TODO: Костыль
                        ParallelAlgorithm.GetInstance().SetNextAction();

                        ParallelAlgorithm.GetInstance().step = false;
                        Update(timePerFrame);
                    }
                }

                Render();
            }
        }
示例#17
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);
            }
        }
        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();
        }
 public double ComputeEfficiency(double mapWidth, double mapHeight, double initiallyBurningTrees, double totalTrees, double burnedTrees)
 {
     return(ParallelAlgorithm.GetInstance().ComputeEfficiency(mapWidth, mapHeight, initiallyBurningTrees, totalTrees, burnedTrees));
 }
 public void SaveAlgorithm(IOpenSave openSave)
 {
     ParallelAlgorithm.GetInstance().SaveAlgorithm(openSave);
 }
 public void RunAlgorithm()
 {
     ParallelAlgorithm.GetInstance().Run();
 }
 public void StepAlgorithm()
 {
     ParallelAlgorithm.GetInstance().Step();
 }
 public void ClearAlgorithm()
 {
     ParallelAlgorithm.GetInstance().Clear();
 }
示例#24
0
 private void button1_Click(object sender, EventArgs e)
 {
     var t = ParallelAlgorithm.GetInstance();
 }
 public void ClearErrors()
 {
     ParallelAlgorithm.GetInstance().errors.Clear();
 }
示例#26
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 bool IsExecuted()
 {
     return(ParallelAlgorithm.GetInstance().IsExecuted());
 }
 public Errors GetErrors()
 {
     return(ParallelAlgorithm.GetInstance().errors);
 }
示例#29
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);
            }
        }
 public bool CheckErrors()
 {
     return(ParallelAlgorithm.GetInstance().errors.Check());
 }