Гид по технологиям

Бросок кубика на Windows Forms — пошаговое руководство

5 min read Windows Forms Обновлено 24 Nov 2025
Бросок кубика на Windows Forms
Бросок кубика на Windows Forms

Игральные кости в полёте

Введение

Windows Forms — визуальный фреймворк для создания настольных приложений. Вы перетаскиваете элементы UI на форму и добавляете обработчики событий и код для логики. Простой проект, например бросок кубика, помогает быстро освоиться: вы увидите, как работают события кнопки, как рисовать на панели и как управлять видимостью элементов.

Важно: этот пример ориентирован на классические WinForms в .NET Framework и .NET (Core/5/6/7). Код написан на C#.

Как добавить кнопку Бросить

  1. Создайте новый проект Windows Forms в Visual Studio.
  2. На панеле Toolbox перетащите кнопку на форму.

Новая кнопка, перетащенная на холст WinForms

  1. Через окно свойств измените параметры кнопки (пример локализован для русской версии):
СвойствоНовое значение
NamerollButton
TextБросить
Location130, 110

Окно свойств кнопки WinForms

  1. Дважды щёлкните по кнопке. Visual Studio сгенерирует обработчик события Click:
private void rollButton_Click(object sender, EventArgs e)
{
}
  1. Внутри обработчика используйте класс Random для получения числа от 1 до 6. Рекомендация: создавайте один экземпляр Random как поле формы, чтобы избежать повторяющихся значений при быстром многократном нажатии.
// Поле формы
private readonly Random random = new Random();

// В обработчике
int randomNumber = random.Next(1, 7);

Важно: если вы создаёте new Random() внутри метода при частых вызовах, возможны одинаковые значения из‑за одинаковой метки времени (seed).

Как создать шесть граней кубика

Мы будем представлять каждую грань как Panel. На Paint каждой панели нарисуем круги (пипы) в нужных позициях.

  1. Создайте шесть глобальных объектов Panel:
Panel face1 = new Panel();
Panel face2 = new Panel();
Panel face3 = new Panel();
Panel face4 = new Panel();
Panel face5 = new Panel();
Panel face6 = new Panel();
  1. Создайте функцию InitializeFace, которая настраивает панель: имя, видимость, размер, рамку, позицию и обработчик Paint.
private void InitializeFace(Panel face, string name)
{
    face.Name = name;
    face.Visible = false;
    face.Size = new Size(500, 500);
    face.BorderStyle = BorderStyle.FixedSingle;
    face.Location = new Point(250, 250);
    face.Paint += new PaintEventHandler(this.Panel_Paint);
    this.Controls.Add(face);
}

Примечание по локализации размеров: Size и Location заданы в пикселях. При необходимости адаптируйте под разрешение или DPI.

  1. В конструкторе формы вызовите InitializeFace для каждой панели:
public Form1()
{
    InitializeComponent();
    InitializeFace(face1, "1");
    InitializeFace(face2, "2");
    InitializeFace(face3, "3");
    InitializeFace(face4, "4");
    InitializeFace(face5, "5");
    InitializeFace(face6, "6");
}
  1. Реализуйте обработчик Panel_Paint, который рисует круги в зависимости от panel.Name. Код остаётся на C#:
private void Panel_Paint(object sender, PaintEventArgs e)
{
    // Используем кисть для заливки кругов (пип)
    Color red = Color.Red;
    SolidBrush solidBrush = new SolidBrush(red);
    Panel panel = sender as Panel;

    switch (panel.Name)
    {
        case "1":
            e.Graphics.FillEllipse(solidBrush, 200, 200, 100, 100);
            break;
        case "2":
            e.Graphics.FillEllipse(solidBrush, 100, 200, 100, 100);
            e.Graphics.FillEllipse(solidBrush, 300, 200, 100, 100);
            break;
        case "3":
            e.Graphics.FillEllipse(solidBrush, 100, 100, 100, 100);
            e.Graphics.FillEllipse(solidBrush, 200, 200, 100, 100);
            e.Graphics.FillEllipse(solidBrush, 300, 300, 100, 100);
            break;
        case "4":
            e.Graphics.FillEllipse(solidBrush, 100, 100, 100, 100);
            e.Graphics.FillEllipse(solidBrush, 100, 300, 100, 100);
            e.Graphics.FillEllipse(solidBrush, 300, 100, 100, 100);
            e.Graphics.FillEllipse(solidBrush, 300, 300, 100, 100);
            break;
        case "5":
            e.Graphics.FillEllipse(solidBrush, 100, 100, 100, 100);
            e.Graphics.FillEllipse(solidBrush, 100, 300, 100, 100);
            e.Graphics.FillEllipse(solidBrush, 300, 100, 100, 100);
            e.Graphics.FillEllipse(solidBrush, 300, 300, 100, 100);
            e.Graphics.FillEllipse(solidBrush, 200, 200, 100, 100);
            break;
        default:
            // Случай для 6
            e.Graphics.FillEllipse(solidBrush, 100, 200, 100, 100);
            e.Graphics.FillEllipse(solidBrush, 300, 200, 100, 100);
            e.Graphics.FillEllipse(solidBrush, 100, 80, 100, 100);
            e.Graphics.FillEllipse(solidBrush, 300, 80, 100, 100);
            e.Graphics.FillEllipse(solidBrush, 100, 320, 100, 100);
            e.Graphics.FillEllipse(solidBrush, 300, 320, 100, 100);
            break;
    }
}

Совет: координаты и размеры пип можно вынести в константы или вычислять пропорционально размеру панели, чтобы интерфейс корректно масштабировался.

Как бросать кубик (логика показа грани)

Чтобы при каждом нажатии предыдущая грань пропадала, реализуем ResetDie и обновим обработчик кнопки.

private void ResetDie()
{
    face1.Visible = false;
    face2.Visible = false;
    face3.Visible = false;
    face4.Visible = false;
    face5.Visible = false;
    face6.Visible = false;
}

Изменённый обработчик rollButton_Click:

private void rollButton_Click(object sender, EventArgs e)
{
    // Генерируем случайное число от 1 до 6
    int randomNumber = random.Next(1, 7);

    // Скрываем ранее показанные грани
    ResetDie();

    // Отображаем соответствующую грань
    if (randomNumber == 1)
        face1.Visible = true;
    if (randomNumber == 2)
        face2.Visible = true;
    if (randomNumber == 3)
        face3.Visible = true;
    if (randomNumber == 4)
        face4.Visible = true;
    if (randomNumber == 5)
        face5.Visible = true;
    if (randomNumber == 6)
        face6.Visible = true;
}

Альтернатива: вместо шести панелей можно иметь одну панель и перерисовывать на ней требуемую конфигурацию по значению randomNumber. Это снизит количество контролов, но потребует пересчёта расположений при каждом Paint.

Как запустить приложение

  1. В Visual Studio нажмите зелёную кнопку «Запуск» (Run) или F5.

Зелёная кнопка запуска в приложении WinForms

  1. В окне приложения нажимайте «Бросить». Отрисованная грань будет меняться по результату.

Приложение Dice Roller во время выполнения

Полезные улучшения и советы

  • Одно поле Random: объявите Random как поле класса, а не создавайте новый объект при каждом нажатии.
  • Центрирование и масштабирование: рассчитывайте позиции пип относительно размеров панели, чтобы выдерживать разные DPI и размеры окна.
  • Анимация броска: можно добавить таймер и промежуточные случайные грани, затем остановиться на итоговой — это создаст эффект броска.
  • Accessibility: добавьте альтернативный текст (ToolTip) для кнопки и возможность бросать кубик клавишей (например, пробел).
  • Уменьшение контролов: для простоты используйте одну панель и перерисовывайте разные конфигурации по значению.

Когда этот подход не подходит

  • Если вам нужна кроссплатформенность, лучше смотреть в сторону MAUI или веб‑решений.
  • Для сложной графики и анимации предпочтительнее WPF или игровые движки, а не WinForms.

Критерии приёмки

  1. При запуске приложения форма открывается без исключений.
  2. На форме есть кнопка «Бросить» с именем rollButton.
  3. При первом нажатии отображается одна из шести граней.
  4. При многократных быстрых нажатиях видны разные числа (Random не возвращает повторяющейся последовательности из‑за неправильного создания).
  5. Размеры и позиции пип не выходят за границы панели при стандартном разрешении экрана.

Тесты и сценарии приёмки

  • Нормальный сценарий: нажать «Бросить» 100 раз — каждый раз должна отображаться ровно одна грань.
  • Граничный сценарий: быстро нажать кнопку 50 раз подряд — приложение не должно бросать исключения.
  • UI‑сценарий: изменить размер окна — пипы должны оставаться внутри панели или масштабироваться.

Сравнение вариантов реализации (коротко)

  • Шесть Panel (как в статье): проще понять код и обработку Paint для каждой грани; больше контролов.
  • Одна Panel + switch в Paint: меньше контролов, централизованная отрисовка; проще масштабировать.
  • Использовать изображения граний: быстро и просто, но требует ресурсов и не даёт гибкой анимации.

Совместимость и миграция

  • Windows Forms доступен в .NET Framework и в .NET (Core/5/6/7) через пакет поддержки WinForms.
  • При переносе между версиями .NET обратите внимание на пространства имён, версии NuGet и поведение DPI.

Краткая методика обучения (mini‑methodology)

  1. Скопируйте и запустите пример.
  2. Экспериментируйте: замените красный цвет, измените размеры панели.
  3. Попробуйте реализовать одну панель вместо шести.
  4. Добавьте анимацию с Timer.

Шпаргалка (cheat sheet)

  • Random: объявляйте как поле формы — private readonly Random random = new Random();
  • Paint: используйте e.Graphics.FillEllipse для заливки круга.
  • Обновление UI: изменяйте Visible или вызывайте Invalidate() для перерисовки.

Резюме

Важно: поддерживайте один экземпляр Random, продумывайте масштабирование и выбирайте между несколькими панелями или одним контролом в зависимости от задачи. Экспериментируйте с улучшениями: анимация, клавиатурные сочетания, адаптивность под DPI.

Кнопка «Бросить» — отличный учебный проект, который раскрывает основы WinForms: события, отрисовку и управление состоянием.

Дополнительно: попробуйте клонировать другие простые приложения (калькулятор, конвертер, менеджер файлов) для закрепления навыков.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Исправить ошибку «Oops! Something went wrong» в YouTube
Техподдержка

Исправить ошибку «Oops! Something went wrong» в YouTube

Экран входа macOS — настройки и советы
macOS

Экран входа macOS — настройки и советы

Удалить историю Google Bard и отключить её
Конфиденциальность

Удалить историю Google Bard и отключить её

TinyLetter для блогеров: быстро и просто
Email-маркетинг

TinyLetter для блогеров: быстро и просто

Как включить и отключить блокировщик всплывающих окон IE11
браузер

Как включить и отключить блокировщик всплывающих окон IE11

Применение патчей при перемещённых файлах в Git
GIT

Применение патчей при перемещённых файлах в Git