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; }
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(); } }
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); } }
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); } }
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++; } }
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); } }
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); } }
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(); } }
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(); }
private void button1_Click(object sender, EventArgs e) { var t = ParallelAlgorithm.GetInstance(); }
public void ClearErrors() { ParallelAlgorithm.GetInstance().errors.Clear(); }
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); }
// Выполняет построение мира, инициализирует точки старта объектов 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()); }