Изучение С#. Урок 1. Крестики-нолики.

Олдфаг
Статус
Оффлайн
Регистрация
18 Фев 2019
Сообщения
2,825
Реакции[?]
1,852
Поинты[?]
24K
Всем привет! Увидев недавние гайды по Java от r1loaded , я понял, что на форуме реально мало простого материала, по которому можно учится программированию на выбранном языке с нуля (возможно, не считая C++). Мой основной ЯП - C#. Гайдов по нему или уроков на форуме я практически не вижу, хотя C# является одним из самых востребованных языков на рынке. Я решил делать регулярные уроки по изучению C# и показывать вам свои простые проекты для изучения данного ЯП.

Сегодня я хочу научить вас делать простейшую игру - крестики-нолики. Идею я взял у 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 (идентификатора команды игрока)
            }
        }
Осталось только применить нашу функцию к событию Click у кнопок формы. Откроем событие Load у формы (
Пожалуйста, авторизуйтесь для просмотра ссылки.
) и добавим следующий код:
Код:
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)
                }
            }
Наша игра готова!

1567266222786.png

Идеей гайда было краткое знакомство с таким языком программирования, как C#. В ходе урока, я использовал: переменные, массивы (обычные и многомерные), простые конструкции (if и else), более сложные их аналоги (for и foreach), кратко познакомил с компонентами WinForms, а также научил создавать простейшие функции и обработчики событий для элементов формы.

Если у вас есть пожелания к новым урокам или я допустил ошибку, прошу отписать мне в лс или же в саму тему.

Готовый исходник игры с дополнительными пояснениями:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Готовая игра:
Пожалуйста, авторизуйтесь для просмотра ссылки.

VT на игру:
Пожалуйста, авторизуйтесь для просмотра ссылки.


2 часть гайда: https://yougame.biz/threads/103258/
 
Последнее редактирование:
Легенда форума
Статус
Оффлайн
Регистрация
10 Дек 2018
Сообщения
4,385
Реакции[?]
2,286
Поинты[?]
191K
Ууу, чичас скомпилю и буду продавать на рынке по 3К ? ? ? ? ? ?

Ууу, чичас скомпилю и буду продавать на рынке по 3К ? ? ? ? ? ?

p.s. че???
 
EVOLUTION ?
Забаненный
Статус
Оффлайн
Регистрация
30 Июл 2019
Сообщения
1,162
Реакции[?]
269
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Всем привет! Увидев недавние гайды по Java от r1loaded , я понял, что на форуме реально мало простого материала, по которому можно учится программированию на выбранном языке с нуля (возможно, не считая C++). Мой основной ЯП - C#. Гайдов по нему или уроков на форуме я практически не вижу, хотя C# является одним из самых востребованных языков на рынке. Я решил делать регулярные уроки по изучению C# и показывать вам свои простые проекты для изучения данного ЯП.

Сегодня я хочу научить вас делать простейшую игру - крестики-нолики. Идею я взял у 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 (идентификатора команды игрока)
            }
        }
Осталось только применить нашу функцию к событию Click у кнопок формы. Откроем событие Load у формы (
Пожалуйста, авторизуйтесь для просмотра ссылки.
) и добавим следующий код:
Код:
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)
                }
            }
Наша игра готова!

Посмотреть вложение 40387

Идеей гайда было краткое знакомство с таким языком программирования, как C#. В ходе урока, я использовал: переменные, массивы (обычные и многомерные), простые конструкции (if и else), более сложные их аналоги (for и foreach), кратко познакомил с компонентами WinForms, а также научил создавать простейшие функции и обработчики событий для элементов формы.

Если у вас есть пожелания к новым урокам или я допустил ошибку, прошу отписать мне в лс или же в саму тему.

Готовый исходник игры с дополнительными пояснениями:
Пожалуйста, авторизуйтесь для просмотра ссылки.

Готовая игра:
Пожалуйста, авторизуйтесь для просмотра ссылки.

VT на игру:
Пожалуйста, авторизуйтесь для просмотра ссылки.
Ах ты шарпер :roflanBuldiga:
 
Легенда форума
Статус
Оффлайн
Регистрация
10 Дек 2018
Сообщения
4,385
Реакции[?]
2,286
Поинты[?]
191K
Олдфаг
Статус
Оффлайн
Регистрация
18 Фев 2019
Сообщения
2,825
Реакции[?]
1,852
Поинты[?]
24K
Как я и обещал, вышла вторая часть гайда - https://yougame.biz/threads/103258/ . В ней рассматривается возможность работы с реестром посредствам C#
 
Забаненный
Статус
Оффлайн
Регистрация
4 Май 2019
Сообщения
65
Реакции[?]
1
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
также можно и на gmod писать?
 
Забаненный
Статус
Оффлайн
Регистрация
4 Май 2019
Сообщения
65
Реакции[?]
1
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Пол Не выбрано Мужской Женский
Участник
Статус
Оффлайн
Регистрация
6 Ноя 2018
Сообщения
894
Реакции[?]
357
Поинты[?]
0
Последнее редактирование:
Сверху Снизу