-
Автор темы
- #1
Всем привет! Увидев недавние гайды по Java от r1loaded , я понял, что на форуме реально мало простого материала, по которому можно учится программированию на выбранном языке с нуля (возможно, не считая C++). Мой основной ЯП - C#. Гайдов по нему или уроков на форуме я практически не вижу, хотя C# является одним из самых востребованных языков на рынке. Я решил делать регулярные уроки по изучению C# и показывать вам свои простые проекты для изучения данного ЯП.
Сегодня я хочу научить вас делать простейшую игру - крестики-нолики. Идею я взял у shapord1488 (находится в бане за 3.4), но код его использовал лишь один раз, когда мне стало лень искать все выигрышные комбинации. На этот гайд у меня еще есть некоторые планы, и если я увижу, что вам понравится моя идея, я буду продолжать его улучшение (запись побед в реестр, сетевая игра и т.д.).
Оформляем нашу игру:
1) Первым делом нужно создать проект Windows Forms, показывать я этого не буду, так как это уже деградация
2) Создадим 9 кнопок, которые будут служить клетками на нашем "поле" (
3) Изменим размеры формы и разместим на ней наши кнопки, заодно изменим размер текста (
4) Добавим таймер на нашу форму и установим ему интервал в 10 мс (
5) Изменим индекс наших кнопок (от 1 до 9) (
Итак, приступим к написанию самого кода
Создадим два важных для нас массива:
Дальше нам нужно написать обработчик Tick для нашего таймера (
Теперь, наша игра может понимать, куда нужно поставить Х, а куда О, но массив
Создадим функцию
Осталось только применить нашу функцию к событию Click у кнопок формы. Откроем событие Load у формы (
Готово, теперь мы можем ставить крестики и нолики, но для завершения проекта нужно добавить проверку на наличие выигрышной комбинации (которые находятся в массиве Wins) у одного из игроков. Для этого, добавим несколько строчек кода в функцию Click (которую мы объявили ранее):
Наша игра готова!
Идеей гайда было краткое знакомство с таким языком программирования, как C#. В ходе урока, я использовал: переменные, массивы (обычные и многомерные), простые конструкции (if и else), более сложные их аналоги (for и foreach), кратко познакомил с компонентами WinForms, а также научил создавать простейшие функции и обработчики событий для элементов формы.
Если у вас есть пожелания к новым урокам или я допустил ошибку, прошу отписать мне в лс или же в саму тему.
Готовый исходник игры с дополнительными пояснениями:
Готовая игра:
VT на игру:
2 часть гайда: https://yougame.biz/threads/103258/
Сегодня я хочу научить вас делать простейшую игру - крестики-нолики. Идею я взял у shapord1488 (находится в бане за 3.4), но код его использовал лишь один раз, когда мне стало лень искать все выигрышные комбинации. На этот гайд у меня еще есть некоторые планы, и если я увижу, что вам понравится моя идея, я буду продолжать его улучшение (запись побед в реестр, сетевая игра и т.д.).
Оформляем нашу игру:
1) Первым делом нужно создать проект Windows Forms, показывать я этого не буду, так как это уже деградация
2) Создадим 9 кнопок, которые будут служить клетками на нашем "поле" (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)3) Изменим размеры формы и разместим на ней наши кнопки, заодно изменим размер текста (
Пожалуйста, авторизуйтесь для просмотра ссылки.
,
Пожалуйста, авторизуйтесь для просмотра ссылки.
)4) Добавим таймер на нашу форму и установим ему интервал в 10 мс (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)5) Изменим индекс наших кнопок (от 1 до 9) (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)Итак, приступим к написанию самого кода
Создадим два важных для нас массива:
Board
и Wins
, а также переменную team
:
Код:
int[] Board = { 0, 0, 0, 0, 0, 0, 0, 0, 0}; // Создаем массив клеток нашего поля. 0 - пустая, 1 - крестик, 2 - нолик
int[,] Wins = { { 0,1,2 },{ 3,4,5 },{ 6,7,8 },{ 0,3,6 },{ 1,4,7 },{ 2,5,8 },{ 0,4,8 },{ 2,4,6 } }; // Создаем двухмерный массив с победными комбинациями
bool team = true; // Создаем переменную, определяющую текущую команду игрока (Х или О). За значение true, я взял Х, за false - О
Пожалуйста, авторизуйтесь для просмотра ссылки.
):
Код:
foreach (Button button in Controls.OfType<Button>()) // Перебираем все кнопки формы
{
for (int i = 1; i <= 9; i++) // Перебираем имя кнопки (в моем проекте от button1 до button9)
{
switch (Board[i - 1]) // Получаем значение для каждой кнопки формы. Вычитаем 1, так как нумерация в массиве начинается с 0, кнопки же нумеруются с 1
{
case 0: // Значение 0 (пустая)
this.Controls["button" + i.ToString()].Text = ""; // Устанавливаем пустой текст для button + i (от 1 до 9)
break;
case 1: // Значение 1 (Х)
this.Controls["button" + i.ToString()].Text = "X"; // Устанавливаем Х, в качестве текста для button + i (от 1 до 9)
break;
case 2: // Значение 2 (О)
this.Controls["button" + i.ToString()].Text = "O"; // Устанавливаем О, в качестве текста для button + i (от 1 до 9)
break;
}
}
}
Board
мы пока не трогали, заставим нашу программу записывать координаты наших крестиков и ноликов!Создадим функцию
Click
, отвечающую за нажатие каждой кнопки нашей формы:
Код:
private void Click(object sender, EventArgs e) // Создаем функцию для нажатия каждой кнопки из формы
{
Button bt = sender as Button; // Определяем элемент, вызывающий событие, как кнопку
int index = bt.TabIndex - 1; // Получаем индекс элемента, который мы указывали для определения нажатой кнопки. 1 мы вычитаем, так как нумерацию индексов я начал с 1, а в массивах она начинается с 0
if (Board[index] == 0) // Проверяем, является ли нажатая кнопка пустой (не занята Х или О)
{
if (team) // Проверяем, является ли текущая команда игрока крестиками
Board[index] = 1; // Если да, то изменяем значение кнопки на 1 (Х)
else
Board[index] = 2; // Иначе, устанавливаем его на 2 (O)
team = !team; // Изменяем значение переменной team (идентификатора команды игрока)
}
}
Пожалуйста, авторизуйтесь для просмотра ссылки.
) и добавим следующий код:
Код:
foreach (Button item in Controls.OfType<Button>()) // Перебираем все кнопки формы
{
(item).Click += Click; // Устанавливаем обработчик события Click на уже объявленную функцию Click
}
Код:
for (int i = 0; i <= 7; i++) // Перебираем левый индекс массива (вариант комбинации)
{
if (Board[Wins[i, 0]] == Board[Wins[i, 1]] && Board[Wins[i, 1]] == Board[Wins[i, 2]] && Board[Wins[i, 1]] != 0) // Проверка на равность нужных нам кнопок с индексом, указанным в Wins. Проверка на наличие значения у кнопки (Х или О)
{
if (team) // Проверка на текущую команду. Значение true (Х) показывает, что предыдущая команда была false (O). Поскольку мы определяем команду победителя уже после ее смены, мы не обращаем внимания на текущее значение и меняем Х и О местами
MessageBox.Show("O WIN"); // Если текущая команда - крестики, то выводим сообщение о победе ноликов
else
MessageBox.Show("X WIN"); // Иначе, сообщаем о победе крестиков
Board = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // Опустошаем доску
team = true; // После сброса значений кнопок на доске, сбрасываем значение команды. Первыми ходят крестики (true)
break; // Выходим из цикла for
}
}
for (int i = 0; i <= 8; i++) // Перебираем все кнопки формы
{
if (Board[i] == 0) // Если одна из кнопок имеет значение 0 (пустая), то выходим из цикла (#6)
break; //(#6)
if (i == 8) // Если перебирается последняя кнопка, то очищаем доску (#7) и ставим team на true (крестики) (#8)
{
Board = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; //(#7)
team = true; //(#8)
}
}
Идеей гайда было краткое знакомство с таким языком программирования, как C#. В ходе урока, я использовал: переменные, массивы (обычные и многомерные), простые конструкции (if и else), более сложные их аналоги (for и foreach), кратко познакомил с компонентами WinForms, а также научил создавать простейшие функции и обработчики событий для элементов формы.
Если у вас есть пожелания к новым урокам или я допустил ошибку, прошу отписать мне в лс или же в саму тему.
Готовый исходник игры с дополнительными пояснениями:
Пожалуйста, авторизуйтесь для просмотра ссылки.
Готовая игра:
Пожалуйста, авторизуйтесь для просмотра ссылки.
VT на игру:
Пожалуйста, авторизуйтесь для просмотра ссылки.
2 часть гайда: https://yougame.biz/threads/103258/
Последнее редактирование: