C# обучение для чайников

Формула программиста

основатель — Волосатов Евгений Витольдович

Клуб формулистов - Ежемесячная подписка

Вступление в Клуб Формулистов на выгодных условиях для НОВЫХ участников.

После взноса  999  499 руб. вы получите подписку
в Клуб Формулистов на 30 дней и 256 байт для быстрого старта.
Байты используются для открытия более одного урока в день, по 50 байт за урок.

Стоимость 1 дня за первый месяц: всего 16 рублей.

Первый взнос - 499 руб./30 дней.

Через 30 дней будет списано 3,000 2,400 руб.
за продление подписки в Клуб на 30 дней + подарок 512 байт.

Так будет продолжаться каждые 30 дней, пока вы не отмените подписку.
Средства будет автоматически считываться с вашей карты.
Вы в любой момент сможете отказаться от продления Клуба.

Только ДО КОНЦА НЕДЕЛИ -
-50% скидка на первый взнос, всего 499 (вместо 999) рублей!
-20% скидка на ЕЖЕМЕСЯЧНЫЙ платёж!
Всего 2400 руб/месяц (вместо 3000 руб/месяц), или 80 руб./день - цена чашки кофе.


Стоимость 1 дня: 80 руб.

Хочу вступить!

Также есть другие варианты оплаты участия в КФ:

Билет в клуб формулистов на ...
30+ дней | 60 дней | 150 дней | 380 дней | 1000 дней

Внимание!
Стоимость участия в Клубе формулистов увеличивается 1 числа каждого месяца на 100 рублей.
При оформления подписки стоимость остаётся постоянной, пока подписка не будет отменена.







Первый взнос - 499 руб./30 дней + 500 байт.
Последующие взносы - 3,000 2400 руб./месяц + 512 байт.



Список уроков | фото | видео

# Название видеоурока Видео / Тесты Решило Рейтинг Доступ
1 FREE Легендарная игра 00:02:13
1 тест
109 чел. ★ 4.8 Done
  Мы начинаем создание легендарной игровой программы
"Сапёр" на языке программирования Java.

Отчёт отправил: 10080. FireWolf Выполнено за 56 мин. [Показать отчёт]
Научился: Научился устанавливать IntelliJ IDEA ) 
Сложности: Дождаться окончания скачивания ) 
2 FREE Простое окно 00:03:02
96 чел. ★ 4.9 Done
  На этом уроке мы начинаем новый проект
и создадим JFrame приложение.
Отчёт отправил: 10080. FireWolf Выполнено за 2 час. 50 мин. [Показать отчёт]
Научился: Научился указывать путь к JDK, так как IntelliJ IDEA сам его не нашёл. 
Сложности: Нацти путь к JDK :) 
3 Закрытие на выходе 00:03:00
91 чел. ★ 4.9 Done
  На этом уроке мы настроим JFrame приложения.
Для этого пропишем необходимые параметры.

Отчёт отправил: 10080. FireWolf Выполнено за 19 мин. [Показать отчёт]
Научился: Пока всё похоже на C# 
Сложности: Пока ничего :) 
4 Полёт над классом 00:03:53
89 чел. ★ 4.8 Done
  На этом слайде мы обсудим все поля и методы основного класса нашей запускаемой игры JavaSweeper, который наследуется от JFrame
Отчёт отправил: 10080. FireWolf Выполнено за 3 час. 37 мин. [Показать отчёт]
Научился: Интереснее всего функция InitPanel, так как в ней должно описываться соответсвие событий нажатия кнопок и обработчиков событий, без чего графический интерфейс не сделать. ну и интересно, как это на Java делается. 
Сложности: Придумать, что предоставить в качестве скриншота... Надо что-то придумать с интерфейсом подачи результатов урока если скриншот не важен. 
5 Пустая панель 00:02:33
88 чел. ★ 4.9 Done
  На этом слайде мы добавим на нашу форму панель, установим ее размер и разместим ее по центру экрана
Отчёт отправил: 10080. FireWolf Выполнено за 7 мин. [Показать отчёт]
Научился: Интересно, что Java требует больше "ручного" кода только для запуска чем C#... 
Сложности: Пока ничего :) 
6 Раздельная инициализация 00:02:23
88 чел. ★ 4.9 Done
  На этом слайде мы займемся рефакторингом. Мы не будем добавлять новой функциональности, а просто красиво оформим то, что уже есть.
Отчёт отправил: 10080. FireWolf Выполнено за 7 мин. [Показать отчёт]
Научился: Приятно, что IntelliJ IDEA ворочается гораздо быстрее чем Visual Studio 
Сложности: Ничего :) 
7 Метод рисования 00:01:59
88 чел. ★ 4.9 Done
  На этом слайде мы наконец-то начнем рисовать. Создадим Paint-компонент для отображения рисунков на нашей панели и на форме.
Отчёт отправил: 10080. FireWolf Выполнено за 6 мин. [Показать отчёт]
Научился: Продолжаю узнавать особенности Java :) 
Сложности: Да пока ничего... Когджа жесть начнётся? :) 
8 Импорт картинок 00:01:22
86 чел. ★ 4.9 Done
  На этом слайде мы добавим в наш проект картинки, которые потом будем показывать на панели во время игры.
Отчёт отправил: 10080. FireWolf Выполнено за 13 час. 15 мин. [Показать отчёт]
Научился: Отточил навыки копирования файлов ))) 
9 Загрузка и отображение 00:02:13
86 чел. ★ 4.9 Done
  На этом слайде мы выведем картинку на панель
Отчёт отправил: 10080. FireWolf Выполнено за 26 мин. [Показать отчёт]
Научился: Всё просто и понятно! 
10 Угловая бомба 00:01:31
85 чел. ★ 4.9 Done
  На этом слайде мы добавим еще пару картинок на нашу форму.
Отчёт отправил: 10080. FireWolf Выполнено за 21 мин. [Показать отчёт]
Научился: Всё знакомо по C# ) 
Сложности: Пока ничего сложного, но в этом же и идея? ) 
11 Константные размеры 00:02:42
85 чел. ★ 4.9 Done
  На этом слайде мы добавим константы и немножко порефакторим.
Отчёт отправил: 10080. FireWolf Выполнено за 23 мин. [Показать отчёт]
Научился: Всё знакомо и понятно ) 
12 Перечисление кубиков 00:03:42
85 чел. ★ 4.9 Done
  На этом слайде мы создадим перечисление Box
Отчёт отправил: 10080. FireWolf Выполнено за 19 мин. [Показать отчёт]
Научился: Всецело одобряю перечисления! Они вначале кажутся странной штукой, которая только всё усложняет, но если распробовать, то без них уже никуда ) Мне они ещё показались удобными для свойства Tag UIElement'ов в C# WPF и, наверное это изврат, но и как ключи для Dictionary в C#! 
13 Первый цикл 00:01:59
85 чел. ★ 4.9 Done
  На этом слайде мы выведем все картинки на форме
Отчёт отправил: 10080. FireWolf Выполнено за 54 мин. [Показать отчёт]
Научился: Научился одному из циклов Java :) 
14 Картинка в кубике 00:03:45
84 чел. ★ 4.9 Done
  На этом слайде мы поместим картинку в каждый экземпляр перечисления Box.

Отчёт отправил: 10080. FireWolf Выполнено за 30 мин. [Показать отчёт]
Научился: Какие в Java интересные перечисления, однако! Ошибка во втором пункте задания (2. Создать приватноe пoле Image) и в видео на 0:40 "Мы просто сделаем приватное поле Image" (при этом делается публичное поле). И тут приватное поле не подходит. 
15 Источник ресурсов 00:01:53
79 чел. ★ 4.9 Done
  На этом слайде мы сделаем загрузку картинок через систему ресурсов в языке Java
Отчёт отправил: 10080. FireWolf Выполнено за 37 мин. [Показать отчёт]
Научился: Научился указывать папки, как ресурсы :) 
16 Запускаемый jархив 00:02:55
73 чел. ★ 5 Done
  На этом слайде мы создадим запускаемый JAR-архив для нашей программы

Примечание.
При попытке запуска jar на линуксе появляется сообщение "is not marked as executable".
Необходимо запускать архив из командной строки:
  java -jar JavaSweeper.jar
Либо разрешить исполнение этого файла, чтобы запускать по клику мышкой:
 chmod +x JavaSweeper.jar

Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 14 мин. [Показать отчёт]
Научился: Научился делать файл jar :) 
17 Карта классных сокровищ 00:04:48
70 чел. ★ 4.9 Done
  На этом слайде мы разберем UML-схему нашего проекта
Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 13 мин. [Показать отчёт]
Научился: Идею с enum для GameState если GameState может иметь больше 2-х значений надо запомнить! Идея с отдельным массивом для флагов понятна, так как они отдельные сущности и выполняют роль фильтра для ввода пользователя. А вот зачем отдельный массив бомб? Чтобы разнести массив отображаемого на экране и проверки опасности? Наверное это может ещё помочь в уменьшении числа проверок и сделать их линейными: event Click -> (if != flag) -> (if != bomb) -> matrix. Но тогда надо сделать переход от Flag к Bomb... (Это просто мысли вслух, так как очень интересно посмотреть реализацию и сравнить со своими идеями). 
18 Наши координаты 00:03:24
65 чел. ★ 5 Done
  На этом слайде мы создадим класс Coord и задействуем его в нашей программе
Отчёт отправил: 10080. FireWolf Выполнено за 22 мин. [Показать отчёт]
Научился: Всё просто и понятно! 
19 Статичная граница 00:03:12
65 чел. ★ 4.9 Done
  На этом слайде мы создадим класс Ranges, который будет использоваться во многих классах нашего проекта и позволит задавать глобальные параметры и перебор всех координат.
Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 46 мин. [Показать отчёт]
Научился: С нетерпением жду, что будет дальше! 
20 Установка размеров 00:04:22
64 чел. ★ 4.9 Done
  На этом слайде мы создадим класс Range с двумя статичными методами для установки и получения размеров нашего поля.
Отчёт отправил: 10080. FireWolf Выполнено за 58 мин. [Показать отчёт]
Научился: Пока всё ещё понятно :) 
21 Полный список 00:04:28
60 чел. ★ 5 Done
  На этом слайде мы добавим в класс Range список всех координат нашего поля и будем его использовать для перебора всех клеток
Отчёт отправил: 10080. FireWolf Выполнено за 24 мин. [Показать отчёт]
Научился: Видно, что много труда вложено в то, чтобы всё объяснить попроще :) 
22 Радуга картинок 00:03:18
57 чел. ★ 4.9 Done
  На этом слайде мы добавим иконку нашей программе и немножко пошалим с отображением картинок на экране
Отчёт отправил: 10080. FireWolf Выполнено за 12 мин. [Показать отчёт]
Научился: Отличный курс! 
23 Фасадный класс 00:02:05
57 чел. ★ 4.9 Done
  На этом слайде мы начнем создавать фасадный класс Game и напишем первые два метода этого класса

Отчёт отправил: 10080. FireWolf Выполнено за 24 мин. [Показать отчёт]
Научился: Структурный шаблон проектирования "Фасад" как раз и предназначен для упрощения работы с классами внутри программы, чтобы создать несколько методов в одном классе, однажды настроить их взаимодействие с другими классами и обращаться только к этим методам, а не вспоминать каждый раз где что лежит. 
24 Игровая координата 00:04:07
57 чел. ★ 4.9 Done
  На этом слайде мы создадим класс Game и реализуем в нем конструктор, а также метод getBox(), который по заданным координатам возвращает, что должно быть в указанной клетке нашего поля.
Отчёт отправил: 10080. FireWolf Выполнено за 22 мин. [Показать отчёт]
Научился: Учусь делать фасадный класс :) Отличный курс! Показывает, что Java не сильно сложнее C# :) 
25 Матрица мира 00:04:32
56 чел. ★ 4.9 Done
  На этом слайде мы создадим класс Matrix для хранения всех элементов нашего игрового поля
Отчёт отправил: 10080. FireWolf Выполнено за 30 мин. [Показать отчёт]
Научился: Отличный курс! Уже начинает напрягать :) 
Сложности: Мне в таких штуках всегда сложно уследить за множеством классов, содержащих в себе экземпляры других классов, которые вызываются третьими классами... Начинаюсь путаться в этом зверинце: что, зачем, как, откуда вызывается. Был бы интересен курс, где делается вначале монструозный "божественный класс" а потом постепенно рефакторится на множество мелких по принципам ООП. 
26 За гранью видимого 00:04:49
55 чел. ★ 4.9 Done
  На этом слайде мы добавим в класс Matrix два метода - геттер и сеттер для получения и установки полей нашей игры
Отчёт отправил: 10080. FireWolf Выполнено за 11 мин. [Показать отчёт]
Научился: Отточил навыки создания геттеров и сеттеров :) 
27 Бомбанутый класс 00:02:55
53 чел. ★ 5 Done
  На этом слайде мы поговорим о классе Bomb, который будет использоваться для хранения нижнего слоя нашего поля, где находятся бомбы и числа вокруг них
Отчёт отправил: 10080. FireWolf Выполнено за 6 мин. [Показать отчёт]
Научился: Класс Bomb нужен, чтобы все (ну или почти все) поля и методы связанные с размещением и проверкой попадания по бомбам находились в одном выделенном  классе (принцип ООП). 
28 Тестовая бомба 00:05:11
54 чел. ★ 5 Done
  На этом слайде мы начнем создавать класс Bomb
Отчёт отправил: 10080. FireWolf Выполнено за 16 мин. [Показать отчёт]
Научился: Учусь применять принципы ООП на практике. 
29 Случайные бомборазмещения 00:04:35
54 чел. ★ 5 Done
  На этом слайде мы разместим бомбы в случайных местах на нашей карте
Отчёт отправил: 10080. FireWolf Выполнено за 8 мин. [Показать отчёт]
Научился: В этом слайде всё было знакомо :) 
30 Сравнение координат 00:03:09
53 чел. ★ 5 Done
  На этом слайде мы исправим несколько ошибок и добавим в класс Coord метод для сравнения двух координат
Отчёт отправил: 10080. FireWolf Выполнено за 15 мин. [Показать отчёт]
Научился: Научился делать override! 
31 Ограда из единиц 00:06:29
53 чел. ★ 4.9 Done
  На этом слайде мы научимся проставлять единицы вокруг каждой бомбы
Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 2 мин. [Показать отчёт]
Научился: Ну здесь в принципе всё знакомо :) 
32 Следующая цифра 00:04:16
51 чел. ★ 5 Done
  На этом слайде мы будем увеличивать цифры вокруг каждой новой размещенной бомбы
Отчёт отправил: 10080. FireWolf Выполнено за 22 мин. [Показать отчёт]
Научился: Научился пользоваться функциями автоматического рефакторинга - раньше как-то не очень обращал на них внимания... 
33 Дважды в одну воронку 00:05:52
49 чел. ★ 5 Done
  На этом слайде мы исключим попадание двух бомб в одну воронку
Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 56 мин. [Показать отчёт]
Научился: Продолжаю узнавать, как правильно делать ООП :) 
34 Флаг над классом 00:09:18
48 чел. ★ 5 Done
  На этом слайде мы перейдем к верхнему уровню нашей абстракции - классу Flag.
Отчёт отправил: 10080. FireWolf Выполнено за 43 мин. [Показать отчёт]
Научился: При проигрыше игры setNobombToFlagedSafeBox ставит флажок ошибочной отметки, а setOpenedToClosedBombBox открывает все неоткрытые бомбы. Оба этих метода можно, думаю, выполнять в одном цикле сверяя массив координат флажков с массивом координат бомб. 
35 Королевская траншея 00:05:02
48 чел. ★ 5 Done
  На этом слайде мы создадим методы start() и get() в класс Flag.
Отчёт отправил: 10080. FireWolf Выполнено за 55 мин. [Показать отчёт]
Научился: Всё понятно! 
36 Клавишные инструменты 00:04:16
48 чел. ★ 5 Done
  На этом слайде мы создадим два метода в классе Game - pressLeftButton() и pressRightButton()
Отчёт отправил: 10080. FireWolf Выполнено за 12 мин. [Показать отчёт]
Научился: Здесь пока всё знакомо! 
37 Мышечный адаптер 00:06:27
47 чел. ★ 5 Done
  На этом слайде мы, наконец, добавим интерактив в нашу программу и зарегистрируем адаптер мыши для опроса левой и правой кнопки.
Отчёт отправил: 10080. FireWolf Выполнено за 13 мин. [Показать отчёт]
Научился: Узнал как в Java добавляется событие нажатия кнопки мыши. 
38 Схема правой педали 00:02:24
47 чел. ★ 5 Done
  На этом слайде мы разберем алгоритм нажатия правой кнопки мышки в игре JavaSweeper
Отчёт отправил: 10080. FireWolf Выполнено за 12 мин. [Показать отчёт]
Научился: При нажатии правой кнопки метод проверяет флаг по координатам в массиве флагов и (не) меняет флаг в зависимости от установленного в клетке флага. (Всё-таки надо что-то сделать с окном отправки задания. Вот скриншот чего здесь и в подобных уроках прикладывать? Может можно сделать возможность автору урока отключать обязательность скриншота для подобных уроков? И среди разрешённых форматов скриншота естьMP3?! Ещё неплохо бы форум к сайту прикрутить!) 
39 Смена флагов 00:03:36
47 чел. ★ 5 Done
  На этом слайде мы реализуем установку и удаление флажков и напишем реализацию функции pressRightButton()
Отчёт отправил: 10080. FireWolf Выполнено за 34 мин. [Показать отчёт]
Научился: Отличное руководство по ООП! 
40 Добро пожаловать! 00:04:24
47 чел. ★ 5 Done
  На этом слайде мы добавим строчку состояния в нашу программу
Отчёт отправил: 10080. FireWolf Выполнено за 14 мин. [Показать отчёт]
Научился: Научился добавлять компонент Label в окно программы. 
41 Недетские состояния 00:02:52
47 чел. ★ 5 Done
  На этом слайде мы создадим перечисление GameState, в котором будет храниться состояние игры

Отчёт отправил: 10080. FireWolf Выполнено за 8 мин. [Показать отчёт]
Научился: раньше я перечислениями не пользовался, но не так давно научился их ценить и стараюсь всегда использовать где они помогают вносить ясность и избегать ошибок. 
42 Актуальное информирование 00:06:07
47 чел. ★ 5 Done
  На этом слайде мы сформируем сообщение о текущем статусе игры в зависимости от текущего состояния и выведем его на экран
Отчёт отправил: 10080. FireWolf Выполнено за 33 мин. [Показать отчёт]
Научился: Продолжаю изучать отличный пример реализации ООП! 
43 Алгоритм открывашки 00:07:43
47 чел. ★ 5 Done
  На этом слайде мы займемся обработкой нажатия левой кнопки мышки
Отчёт отправил: 10080. FireWolf Выполнено за 25 мин. [Показать отчёт]
Научился: Вроде всё понятно. Интересно посмотреть на реализацию алгоритма. 
44 Выбор из выбора 00:05:05
47 чел. ★ 5 Done
  На этом слайде мы напишем метод openBox(), который перебирает все возможные состояния клеток и в зависимости от этого выполняет ту или иную операцию.

Отчёт отправил: 10080. FireWolf Выполнено за 28 мин. [Показать отчёт]
Научился: Всё знакомо и понятно. 
45 Нулевая рекурсия 00:04:01
47 чел. ★ 5 Done
  На этом слайде мы рекурсивно откроем все клетки вокруг нулей.
Отчёт отправил: 10080. FireWolf Выполнено за 10 мин. [Показать отчёт]
Научился: Да, с рекурсией надо потренироваться. Почему-то я её совсем не умею применять. 
46 Учёт зарытых флагов 00:04:19
47 чел. ★ 5 Done
  На этом слайде мы будем считать количество флажков и закрытых клеток на нашем поле
Отчёт отправил: 10080. FireWolf Выполнено за 14 мин. [Показать отчёт]
Научился: Всё понятно! 
47 Телеграмма о флажках 00:03:28
47 чел. ★ 5 Done
  На этом слайде мы выведем сообщение пользователю, сколько флажков и сколько бомб есть на экране
Отчёт отправил: 10080. FireWolf Выполнено за 25 мин. [Показать отчёт]
Научился: Спасибо за отличный курс! 
48 День Победы! 00:05:25
47 чел. ★ 5 Done
  На этом слайде мы проверим, а не победили ли мы!
Отчёт отправил: 10080. FireWolf Выполнено за 10 мин. [Показать отчёт]
Научился: Всё понятно! 
49 Первая ошибка сапёра 00:06:13
47 чел. ★ 5 Done
  На этом слайде мы зафиксируем поражение, когда игрок подорвался на бомбе.
Отчёт отправил: 10080. FireWolf Выполнено за 41 мин. [Показать отчёт]
Научился: Всё ясно! 
50 Открываем карты 00:07:26
45 чел. ★ 5 Done
  На этом слайде мы покажем расположение бомб после проигрыша.
Отчёт отправил: 10080. FireWolf Выполнено за 23 мин. [Показать отчёт]
Научился: Просто и понятно. 
51 Цифровой помощник сапёра 00:11:31
46 чел. ★ 5 Done
  На этом слайде мы напишем помощник, который помогает открывать заведомо безопасные клетки.
Отчёт отправил: 10080. FireWolf Выполнено за 23 мин. [Показать отчёт]
Научился: Отличный курс, спасибо! Теперь надо будет вдумчиво почитать написанный код для полного усвоения :) 
52 Финальный аккорд 00:17:49
35 чел. ★ 5 Done
  На этом видео мы проанализируем всё, что было сделано - пройдёмся по всему коду программы.
Также поговорим о создании Бота для игры Сапёр - как это можно сделать.
Ваше задание - записать видеообзор созданной игры, выложить
на youtube и разместить ссылку на видео в описании.
Отчёт отправил: 10080. FireWolf Выполнено за 11 час. 37 мин. [Показать отчёт]
Научился: Спасибо за продление возможности допройти курс до конца! Видеообзор, вы уж извините, я записывать не стал, так как просто не знаю, о чём говорить достаточно долго, чтобы это было оправдано :) Я уже пару лет самостоятельно изучаю C# и поэтому из данного курса кардинально нового про программирование я не узнал, но познакомился с особенностями создания программы на Java и увидел отличный пример ООП и рекурсивных алгоритмов (с рекурсиями мне надо тренироваться - не понимаю я их работы). Думаю для самообразования теперь пропробую переписать сапёра под Андроид :) PS: Ещё раз спасибо за отличный курс! 
  Итого:   52 видеоурока 3 час. 50 мин.
1 тест
35 чел. ★ 4.96  
  Финалисты:   Никита,   Владислав,   Иван Воронин,   1  ,   Александр Р.,   Danil42Russia,   Pavlin,   Андрей Шевченко,   Neverwinter 2,   Сергей Стефаненко,   Александр,   Михаил,   Hofflin,   Сергей,   VladYorkyee,   chokayes,   Александр,   Tekashnik,   Денис,   Vladimir Falejev,   Yefim,   Иван,   Новопашин Владимир,   sergeykin,   FireWolf,   Кирилл Шмойлов,   yerv,   Нюта,   Anna,   Алексей В.,   AZANIR,   Дмитрий,   zhikharevav,   Dmitry Sinitsin,   Андрей Гладков .

Начинаем практику по языку C#





Если вы пришли без приглашения -
введите тысяча двадцать четыре (цифрами).
Чтобы стать хорошим программистом — нужно писать программы. На нашем сайте очень много практических упражнений.

После заполнения формы ты будешь подписан на рассылку «C# Вебинары и Видеоуроки», у тебя появится доступ к видеоурокам и консольным задачам.

Несколько раз в неделю тебе будут приходить письма — приглашения на вебинары, информация об акциях и скидках, полезная информация по C#.

Ты в любой момент сможешь отписаться от рассылки.


Научился: Создавать окна, использовать адаптер для мыши. Все это писать на языке Java. Создавать и использовать перечисления. Использовать ООП при написании программ.
Трудности: Сложно было успевать все записывать за маэстро. Чувствуется, что за кадром осталась огромная работа по рефакторингу. Нам же достался бриллиант, сверкающий своими гранями, т.к. каждая функция на своем месте - ни удалить, ни прибавить. Прямо скажу, что курс - образец для подражания, но пока это для меня недостижимая цель. Когда сам начинаешь писать, все валится в одну кучу. Так что буду стремиться к совершенству. Спасибо огромное за курс! Получил огромное удовольствие от его прохождения!



Научился: Просьба за то, что не снял видеообзор камни не кидать xD Была проделана большая работа. Данный курс был разбит на короткие уроки в котором не было воды. Его можно сравнить с хороший книгой, прочитав один раз, хочется прочитать опять. Но понимая, что вложил 0 усилий что бы сделать данную игру, приходят мысли что надо сесть осмыслить и сделать самому. Спасибо Евгению Витольдовичу за данный курс. На этом всё)