Олдфаг
			
			
				
					
				
			
		- Статус
 - Оффлайн
 
- Регистрация
 - 18 Фев 2019
 
- Сообщения
 - 2,842
 
- Реакции
 - 1,853
 
Всем привет! Увидев недавние гайды по Java от @Pauls , я понял, что на форуме реально мало простого материала, по которому можно учится программированию на выбранном языке с нуля (возможно, не считая 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 - О
	Дальше нам нужно написать обработчик Tick для нашего таймера (
	Пожалуйста, авторизуйтесь для просмотра ссылки.
):
			
				Код:
			
		
		
		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
            }
	Готово, теперь мы можем ставить крестики и нолики, но для завершения проекта нужно добавить проверку на наличие выигрышной комбинации (которые находятся в массиве Wins) у одного из игроков. Для этого, добавим несколько строчек кода в функцию 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/
			
				Последнее редактирование: 
			
		
	
								
								
									
	
								
							
							
				