Створення першої програми Windows Forms на C# на прикладі гри «хрестики-нулики»
Рейтинг статті: / 5
НайгіршеНайкраще 

Windows Forms - інтерфейс програмування додатків, що відповідає за графічний інтерфейс користувача, є частиною Microsoft.NET Framework і спрощує доступ до елементів інтерфейсу Microsoft Windows.
У чому ж переваги Windows Forms?
Насамперед, форми підходять новачкам, тому що вони можуть писати програми у Visual Studio без глибоких знань в об’єктно-орієнтованому програмуванні. Студія передбачає використання стандартних об’єктів (кнопка, надпис, текстове поле, картинка тощо) з інтуїтивно зрозумілими параметрами (висота, ширина і т.п.). Більш того, в студії процес зміни деяких з параметрів, додавання нового об’єкта в форму навіть не потребує написання коду - все це є візуалізованим. Користувач просто перетягує необхідний об’єкт з панелі на форму.
Виконуваний код - класи, що реалізують API для Windows Forms, не залежать від мови розробки. Тобто програміст однаково може використовувати Windows Forms як при написанні ПЗ на C#, так і на інших мовах програмування.
Але не буває нічого без недоліків, тож розглянемо Windows Forms з іншої сторони.
Програма, написана за допомогою Windows Form, не зможе бути запущена на комп’ютері, на якому не встановлена відповідна версія Microsoft.NET Framework (програмна платформа, в якій працюють Windows Forms). Детальніше про Microsoft.NET Framework можна прочитати в wikipedia.org .
Значним недоліком Windows Forms також є те, що якщо над проектом працюють не лише програмісти, а й дизайнери, то їм доводеться працювати дуже тісно, щоб вийшов якісний проект. Мається на увазі, щоб дизайнер малював інтерфейс, віддавав його програмісту, а той, в свою чергу, реалізовував його (відволікаючись від свого безпосереднього завдання), а не програмував логіку програми.
Нарешті настав час перейти від теорії до практики, тож створимо нашу першу програму Windows Forms, а саме гру «хрестики-нулики».
Одним з інструментів для роботи з Windows Forms, а саме той, з яким ми працюватимемо далі, є Visual Studio, у якій написання даних програм реалізовано за допомогою мови програмування C#. Студія є зручною, адже включає в себе технологію IntelliSense, до того ж розставляє відступи для кращої читабельності.
IntelliSense – це технологія автодоповнення Microsoft. Дописує назву функції при введенні перших букв. Детальніше про IntelliSense в ru.wikipedia.org.
Перш, ніж розпочати створення гри, необхідно підібрати картинки (нулика і хрестика, а також пустої клітинки).
А ось і малюнки, що підібрав я:
Всі малюнки розміру 101х101.
Тепер створимо видиму частину нашої гри.
Для цього створимо новий проект у Visual Studio - запустимо програму і натиснемо Створити проект. При цьому відкриється нове вікно, назвемо нашу програму “game”, це повинен бути проект Visual C#->додаток Windows Forms.
Зробимо нашу форму (майбутній вигляд програми) розміру 355х429 (параметр size у властивостях форми), а параметр text зробимо “Game” - це назва нашої форми. Спочатку додамо елемент MenuStrip. Створимо два елементи меню, а саме “нова гра” і “вихід”. Тепер розмістимо на формі 9 малюнків, а саме об’єктів pictureBox (наше ігрове поле). Це все легко зробити, перетягнувши елемент з панелі інструментів на форму. Тепер знайдемо параметр Image. Натиснемо на вибір картинки біля цього параметра, виберемо файл ресурсів проекта і імпортуємо сюди наші три малюнки. Я назвав їх k.jpg (хрестик), n.jpg (нулик) і p.jpg (пусте місце). У результаті наша форма повинна набути такого остаточного вигляду:
Ну а тепер напишемо код нашої гри, щоб те, що Ви щойно створили, слугувало не лише розрадою для очей.
Натиснемо двічі на пункт меню “нова гра”. Ми бачимо код програми. Створимо масив для зберігання значень клітинок поля таким рядком:
int[] Mass = new int[9];
І змінну Flag у якій буде знаходитись номер гравця, що зараз робить свій хід:
int Flag;
Тепер запишемо функцію, що запускатиметься при натисканні на нову гру. Коли ми двічі натиснули на цей пункт меню у коді створилась нова функція:
private void toolStripMenuItem1_Click(object sender, EventArgs e)
Під створенням Flag створимо змінні для збереженні наших трьох картинок:
Image img = Image.FromFile("p.jpg");
Image img2 = Image.FromFile("k.jpg");
Image img3 = Image.FromFile("n.jpg");
Для початку необхідно усі дев’ять клітинок зробити пустими, а Flag прирівняти одиниці. Наші клітинки називаються pictureBox1, pictureBox2 і т.д. Написавши це і крапку програма підкаже нам можливі параметри об’єкта, обираємо Image. Очищуємо масив значень клітинок:
for(int i=0; i<9; i++)
       Mass[i]=0;
Таким чином, наша програма на даний момент повинна бути такою:
«
namespace game
{
       public partial class Form1 : Form
       {
              int[] Mass = new int[9];
              int Flag;
              Image img = Image.FromFile("p.jpg");
              Image img2 = Image.FromFile("k.jpg");
              Image img3 = Image.FromFile("n.jpg");

              public Form1()
              {
                     InitializeComponent();
              }

              private void startGameToolStripMenuItem1_Click(object sender, EventArgs e)
              {
                     pictureBox1.Image = img;
                     pictureBox2.Image = img;
                     pictureBox3.Image = img;
                     pictureBox4.Image = img;
                     pictureBox5.Image = img;
                     pictureBox6.Image = img;
                     pictureBox7.Image = img;
                     pictureBox8.Image = img;
                     pictureBox9.Image = img;
                     Flag = 1;
                     for(int i=0; i<9; i++)
                            Mass[i]=0;
              }
       }
}
»
Тепер напишемо функцію для виходу:
private void exitToolStripMenuItem2_Click(object sender, EventArgs e)
{
       Application.Exit();
}
Ну а далі закінчимо програму. Створимо для кожної картинки по функції (подвійним натисканням на картинку або ж натисканням на Click у списку подій картинки). Image і необхідний елемент Mass змінюємо відповідно до поточного значення Flag, а його самого змінюємо на протилежне значення. Але лише якщо елемент Mass на даний момент пустий. Також після кожного натискання на елемент поля необхідно перевіряти чи це ще не кінець гри - це робиться звичайною перевіркою елементів Mass. Для цього напишемо функцію Check(); Також необхідна змінна для збереження переможця int winner.
Наприклад:
«
private void pictureBox1_Click(object sender, EventArgs e)
{
       if (Flag == 1)
       {
              if (Mass[0]==0)
              {
                     Flag = 2;
                     Mass[0] = 1;
                     pictureBox1.Image = img1;
              }
       }
       else
              if (Mass[0] == 0)
              {
                     Flag = 1;
                     Mass[0] = 2;
                     pictureBox1.Image = img2;
              }
       Check();
}
»
І перевірка:
«
public void Check() public void Check()
{
       if ((Mass[0] == Mass[1]) && (Mass[1] == Mass[2]))
              winner = Mass[0];
       if ((Mass[0] == Mass[4]) && (Mass[4] == Mass[8]))
              winner = Mass[1];
       if ((Mass[0] == Mass[3]) && (Mass[3] == Mass[6]))
              winner = Mass[1];
       if ((Mass[3] == Mass[4]) && (Mass[4] == Mass[5]))
              winner = Mass[4];
       if ((Mass[6] == Mass[7]) && (Mass[7] == Mass[8]))
              winner = Mass[7];
       if ((Mass[1] == Mass[4]) && (Mass[4] == Mass[7]))
              winner = Mass[2];
       if ((Mass[2] == Mass[5]) && (Mass[5] == Mass[8]))
              winner = Mass[3];
       if ((Mass[2] == Mass[4]) && (Mass[4] == Mass[6]))
              winner = Mass[3];
}
»
Остаточна програма виглядає так:
«
namespace game
{
       public partial class Form1 : Form
{
              int[] Mass = new int[9];
              int Flag;
              int winner;
              Image img = Image.FromFile("p.jpg");
              Image img1 = Image.FromFile("k.jpg");
              Image img2 = Image.FromFile("n.jpg");

              public Form1()
              {
                     InitializeComponent();
              }

              public void Check()
              {
                     if ((Mass[0] == Mass[1]) && (Mass[1] == Mass[2]))
                            winner = Mass[0];
                     if ((Mass[0] == Mass[4]) && (Mass[4] == Mass[8]))
                            winner = Mass[1];
                     if ((Mass[0] == Mass[3]) && (Mass[3] == Mass[6]))
                            winner = Mass[1];
                     if ((Mass[3] == Mass[4]) && (Mass[4] == Mass[5]))
                            winner = Mass[4];
                     if ((Mass[6] == Mass[7]) && (Mass[7] == Mass[8]))
                            winner = Mass[7];
                     if ((Mass[1] == Mass[4]) && (Mass[4] == Mass[7]))
                            winner = Mass[2];
                     if ((Mass[2] == Mass[5]) && (Mass[5] == Mass[8]))
                            winner = Mass[3];
                     if ((Mass[2] == Mass[4]) && (Mass[4] == Mass[6]))
                            winner = Mass[3];
              }

              private void pictureBox1_Click(object sender, EventArgs e)
              {
                     if (Flag == 1)
                     {
                            if (Mass[0]==0)
                            {
                                   Flag = 2;
                                   Mass[0] = 1;
                                   pictureBox1.Image = img1;
                            }
                     }
                     else
                            if (Mass[0] == 0)
                            {
                                   Flag = 1;
                                   Mass[0] = 2;
                                   pictureBox1.Image = img2;
                            }
                     Check();
              }

              private void startGameToolStripMenuItem1_Click(object sender, EventArgs e)
              {
                     pictureBox1.Image = img;
                     pictureBox2.Image = img;
                     pictureBox3.Image = img;
                     pictureBox4.Image = img;
                     pictureBox5.Image = img;
                     pictureBox6.Image = img;
                     pictureBox7.Image = img;
                     pictureBox8.Image = img;
                     pictureBox9.Image = img;
                     Flag = 1;
                     for(int i=0; i<9; i++)
                            Mass[i]=0;
              }

              private void exitToolStripMenuItem2_Click(object sender, EventArgs e)
              {
                     Application.Exit();
              }
       }
}
»
Як повідомити переможця - вирішуйте самі. Й не забудьте додати ще вісім функцій для натискання на решту клітинок. Ось Ви й написали свою першу графічну програму, не складно, чи не так?
Дякую за увагу, успіхів!
Автор Богдан Ярема, МАН України.
 
>
КнигаНовиниПрактика пошукуПартнериПро нас
Підтримка та дизайн: Могильний С.С. Шаблон: Joomla Templates by BuyHTTP Joomla Hosting