2024-04-20 19:07:32 +04:00

157 lines
5.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using ProjectTank.Drawnings;
using ProjectTank.Entities;
using ProjectTank.MovementStrategy;
namespace ProjectTank
{
/// <summary>
/// Форма работы с объектом "Танк"
/// </summary>
public partial class FormTank : Form
{
/// <summary>
/// Поле-объект для прорисовки объекта
/// </summary>
private DrawningTank2? _drawningTank;
private EntityTank2? _entityTank2;
private EntityTank1? _entityTank1;
/// <summary>
/// Стратегия перемещения
/// </summary>
private AbstractStrategy? _strategy;
/// <summary>
/// Конструктор формы
/// </summary>
public FormTank()
{
InitializeComponent();
_strategy = null;
}
/// <summary>
/// Метод прорисовки танка
/// </summary>
private void Draw()
{
if (_drawningTank == null)
{
return;
}
Bitmap bmp = new(pictureBoxTanks.Width, pictureBoxTanks.Height);
Graphics gr = Graphics.FromImage(bmp);
_drawningTank.DrawTransport(gr);
pictureBoxTanks.Image = bmp;
}
/// <summary>
/// Создание объекта класса-перемещения
/// </summary>
/// <param name="type">Тип создаваемого объекта</param>
private void CreateObject(string type)
{
Random random = new Random();
switch (type)
{
case nameof(DrawningTank2):
_drawningTank = new DrawningTank2(random.Next(100, 300), random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)));
break;
case nameof(DrawningTank1):
_drawningTank = new DrawningTank1(random.Next(100, 300), random.Next(1000, 3000),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)),
Color.FromArgb(random.Next(0, 256), random.Next(0, 256), random.Next(0, 256)),
Convert.ToBoolean(random.Next(0, 2)), Convert.ToBoolean(random.Next(0, 2)));
break;
default:
return;
}
_drawningTank.SetPictureSize(pictureBoxTanks.Width, pictureBoxTanks.Height);
_drawningTank.SetPosition(random.Next(10, 100), random.Next(10, 100));
_strategy = null;
СomboBoxStrategy.Enabled = true;
Draw();
}
/// <summary>
/// Обработка нажатия кнопки "Создать"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonCreateTank1_Ckick(object sender, EventArgs e) => CreateObject(nameof(DrawningTank1));
private void ButtonCreateTank2_Ckick(object sender, EventArgs e) => CreateObject(nameof(DrawningTank2));
/// <summary>
/// Перемещение объекта по форме (нажатие кнопок навигации)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonMove_Click(object sender, EventArgs e)
{
if (_drawningTank == null)
{
return;
}
string name = ((Button)sender)?.Name ?? string.Empty;
bool result = false;
switch (name)
{
case "buttonUp":
result = _drawningTank.MoveTransport(DirectionType.Up);
break;
case "buttonLeft":
result = _drawningTank.MoveTransport(DirectionType.Left);
break;
case "buttonRight":
result = _drawningTank.MoveTransport(DirectionType.Right);
break;
case "buttonDown":
result = _drawningTank.MoveTransport(DirectionType.Down);
break;
}
if (result)
{
Draw();
}
}
/// <summary>
/// Обработка нажатия кнопки "Шаг"
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ButtonStrategyStep_Ckick(object sender, EventArgs e)
{
if (_drawningTank == null)
{
return;
}
if (СomboBoxStrategy.Enabled)
{
_strategy = СomboBoxStrategy.SelectedIndex switch
{
0 => new MoveToCenter(),
1 => new MoveToBorder(),
_ => null,
};
if (_strategy == null)
{
return;
}
_strategy.SetData(new MoveableTank(_drawningTank),
pictureBoxTanks.Width, pictureBoxTanks.Height);
}
if (_strategy == null)
{
return;
}
СomboBoxStrategy.Enabled = false;
_strategy.MakeStep();
Draw();
if (_strategy.GetStatus() == StrategyStatus.Finish)
{
СomboBoxStrategy.Enabled = true;
_strategy = null;
}
}
}
}