# | Название видеоурока | Видео / Тесты | Решило | Рейтинг | Доступ |
---|---|---|---|---|---|
1 |
![]() |
3 теста |
|||
Мы начинаем создание клиент-серверной программы для игры в Шахматы по сети. Это комплекс программных решений с исользованием: C#, ASP.NET, MS-SQL, EF, Unity В результате мы создадим сервер, через который клиенты смогут играть друг с другом в шахматы со смартфона. Записаться на курс Отчёт отправил: 10080. FireWolf Выполнено за 24 мин. [Показать отчёт] Научился: C# - самостоятельно изучаю. Unity - когда-то вначале запустил и сделал по официальному руководству игру с катящимся шариком на C# без понятия, как оно работает :) ASP.NET, MS-SQL, Entity Framework - делал уроки из учебника Троелсена. |
|||||
2 | Доска. Установка Unity 3D |
|
|||
Цель этого урока - установить Unity и набрать несколько строчек шахматных терминов. Скачать Unity3D: unity3d.com/ru Набрать шахматные термины: videosharp.info/console/task/level=1766 Скачать архив с картинками: https://yadi.sk/d/irBRduLp3SseXY Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 17 мин. [Показать отчёт] Научился: Шахматные термины: 175 символов/минута - 0 ошибок. Давно хотел попробовать Юнити. Когда-то даже поставил, но тогда я только начал читать про C# и скрипты меня привели в смусщение :) Сейчас, думаю, пойдёт веселее |
|||||
3 | Доска. Фигуры |
|
|||
На этом уроке мы разместим доску с фигурами. Отчёт отправил: 10080. FireWolf Выполнено за 41 мин. [Показать отчёт] Научился: Пока что всё прямо как в простом графическом редакторе :) Сложности: Ничего :) |
|||||
4 | Доска. Состояния переноса |
|
|||
На этом уроке мы начнём процесс Drag-n-Drop и обсудим все состояния, через которые проходит объект в процессе переноса. Создадим скрипт, класс, перечисление, конструктор и метод Action. Отчёт отправил: 10080. FireWolf Выполнено за 19 час. 46 мин. [Показать отчёт] Научился: Подключать скрипт к объекту :) Сложности: Ничего! |
|||||
5 | Доска. Подцеп фигуры |
|
|||
На этом уроке мы найдём фигуру, по которой кликнул пользователь. Отчёт отправил: 10080. FireWolf Выполнено за 4 час. 34 мин. [Показать отчёт] Научился: Прикреплять коллайдер к объектам и получать объект по координатам клика. Сложности: Ничего :) |
|||||
6 | Доска. Смещение |
|
|||
На этом уроке мы допишем перенос фигуры и учтём смещение при клике. Теперь вы сможете разыграть любую партию - сделайте скриншот интересной позиции! Отчёт отправил: 10080. FireWolf Выполнено за 2 час. 31 мин. [Показать отчёт] Научился: Очень просто и понятно объяснена реализация Drag'n'Drop. Сложности: Ничего :) |
|||||
7 | Доска. Запуск на Windows |
|
|||
На этом уроке мы создадим независимый билд (рабочая версия) нашей игры для платформы Windows. Отчёт отправил: 10080. FireWolf Выполнено за 19 мин. [Показать отчёт] Научился: Научился запускать компиляцию под нужную платформу :) На этом знакомство с курсом пока вынужденно заканчиваю. Сложности: Ничего :) |
|||||
8 | Доска. ПЕРВЫЙ ФИНАЛЬНЫЙ УРОК |
|
|||
Мы закончили первую часть курса, создали шахматную доску, запустили её на Windows. Напишите отзыв о первой части курса: что получилось, что было сложным, что ещё вы добавите в программу. Отчёт отправил: 10080. FireWolf Выполнено за 15 мин. [Показать отчёт] Научился: Продолжаю знакомиться с Unity, в том числе и по урокам с официального сайта. Фигурам надо бы добавить автоподстройку под нужные координаты если она не ровно перемещена игроком. |
|||||
9 | Доска. VIP. Запуск на Android |
|
|||
На этом уроке мы запустим нашу доску на операционной системе Android. Приготовьте свой планшет/телефон и приступайте к эскпорту и запуску! * Выполнять этот урок не обязательно. Отчёт отправил: 10080. FireWolf Выполнено за 32 мин. [Показать отчёт] Научился: Удалось запустить на эмуляторе. Unity сразу обнаружила запущенный из под VS2017 эмулятор Андроида и запустила на нём игру. Правда, надо подумать над ресайзом в портретной ориентации, потому что игра выравнивается только по высоте. |
|||||
10 | Доска. VIP. Запуск в Интернете |
|
|||
На этом уроке мы отправим наш проект в Интернет. Для этого мы воспользуемся технологией WebGL. Генерация страницы занимает продолжительное время. Засеки момент начала и напиши в отчете сколько времени это заняло. * Выполнять этот урок необязательно. Отчёт отправил: 10080. FireWolf Выполнено за 22 час. 50 мин. [Показать отчёт] Научился: Первая генерация страницы первый раз заняла минут 5, а последующие менее 30 секунд. Сделал сайт на бесплатном хостинге https://hinoookami.000webhostapp.com/uChess/index.html (Переотправка отчёта, так как вначале не разобрался с хостингом - никогда раньше не занимался этим). Сложности: Разобраться с бесплатным хостингом. |
|||||
11 |
![]() |
1 тест |
|||
На этом уроке мы познакомимся с архитектурой проекта, посмотрим на предстоящее путешествие с высоты птичьего полёта. Задание: написать, что для вас в этом плане самое простое, а что - самое сложное. Отчёт отправил: 10080. FireWolf Выполнено за 17 час. 19 мин. [Показать отчёт] Научился: Для меня здесь простым кажется проверка правил на C#, а сложным Unity, так как я с ним дел особо не имел, и Entity Framework с ASP.NET. Помю, когда делал уроки по учебнику Троелсена, там могут возникнуть проблемы с миграцией версий если EF уже что-то делала с базой SQL. Помню, что мне даже удалось это решить не имея особого представления ни о работе EF ни о функционировании SQL :))) |
|||||
12 | Классы. Шахматная библиотека |
2 теста |
|||
На данном уроке мы начинаем создание шахматных классов на языке C#, которые позволят проверять правила игры. Для этого мы напишем библиотеку, которая сможет для любой шахматной позиции определить возможность любого хода. Отчёт отправил: 10080. FireWolf Выполнено за 1 день 13 мин. [Показать отчёт] Научился: Очевидно, понадобится ещё класс для взаимодействия по сети. В ChessRules добавить, собственно, проверку правил. Ещё я бы добавил историю всех ходов с автовоспроизведением и, возможно, подключить шахматный движок для одиночной игры :) Пока всё просто. Но кроме вывода доски в допзадании я решил ещё сделать вывод фигуры по координатам и попробовать "оптимизировать" перевод строки fen в двумерный массив. И по возможности использую везде StringBuilder, чтобы снизить нагрузку на GarbageCollector; Перевод строки fen в двумерный массив: char[,] board = new char[8, 8]; void FenParse(string fen) { StringBuilder figures = new StringBuilder(); foreach (var c in fen) { if (c == ' ') break; if (c >= '0' && c <= '9') { figures.Append('.', c - 48); //Добавляю точки в количестве выведенном из char } else figures.Append(c); } for (int i = 0, x = 0, y = 0; i<figures.Length; i++) { if (x == 8) x = 0; if (figures[i] == '/') { y++; continue; } board[y, x++] = figures[i]; } } Вывод строки по координатам: void PrintFigure(char figure) { if (figure == '.') { WriteLine("There is no figure at this position"); return; } StringBuilder whatfigure = new StringBuilder(); whatfigure.Append("The figure is a"); string colour = (figure > 90) ? " Black" : " White"; whatfigure.Append(colour); string name = null; figure = (char) ((figure > 90) ? figure - 32 : figure); //Привожу знак фигуры к строчной букве switch (figure) { case 'P': { name = " Pawn"; break;} case 'R': { name = " Rook"; break; } case 'N': { name = " Knight"; break; } case 'B': { name = " Bishop"; break; } case 'Q': { name = " Queen"; break; } case 'K': { name = " King"; break; } } whatfigure.Append(name); WriteLine(whatfigure); } Сложности: Ничего |
|||||
13 | Классы. Цветная фигура |
|
|||
Мы продолжаем создание шахматных классов на языке C#, которые позволят проверять правила игры. На этом уроке мы рассмотри схему библиотеки dll, которая поможет нам сориентироваться в дальнейших действиях. Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 55 мин. [Показать отчёт] Научился: Про Extention Methods интересно - надо с ними больше тренироваться. Сложности: Ничего. |
|||||
14 | Классы. Квадратная площадь |
|
|||
Мы продолжаем создание шахматных классов на языке C#, которые позволят проверять правила игры. На этом уроке мы создадим структуру классов с минимально необходимым кодом. Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 12 мин. [Показать отчёт] Научился: Большое спасибо за идею с вычитанием char - я до этого отнимал 48 для цифр, 65 для строчных или 97 для прописных, но такой способ гораздо нагляднее :) В остальном всё пока знакомо. Сложности: Ничего. |
|||||
15 | Классы. Фигурой марш! |
|
|||
Мы продолжаем создание шахматных классов на языке C#, которые позволят проверять правила игры. На этом уроке мы создадим классы для хранения и перемещения фигур по клеткам. Отчёт отправил: 10080. FireWolf Выполнено за 57 мин. [Показать отчёт] Научился: Подсмотрел способ сокращения кода с помощью прямой передачи подстроки в конструктор и понравилось приведение к перечислению напрямую из символа в строке. |
|||||
16 | Классы. Квадратная матрица |
|
|||
Мы продолжаем создание шахматных классов на языке C#, которые позволят проверять правила игры. На этом уроке мы создадим класс Board(), который будет заниматься доской и работать с FEN. Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 15 мин. [Показать отчёт] Научился: Очень полезный курс по части разнесения ответсвенности по классам в соответствии с принципами ООП. Надо будет внимательно пересмотреть структуру классов, чтобы лучше уяснить, какой за что отвечает, так как мне за отсутствием практики сложно воспринимать так много классов - если бы я делал самостоятельно, то у меня было бы раза в два меньше классов, но более "тяжёлых" :) |
|||||
17 | Классы. Стой, кто идёт! |
|
|||
Мы продолжаем создание шахматных классов на языке C#, которые позволят проверять правила игры. На этом уроке мы создадим класс Moves(), который будет заниматься проверкой возможности хода. Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 21 мин. [Показать отчёт] Научился: Продолжаю постигать тонкости ООП :) Может я слепой, но как я ни старался, я так и не смог найти ошибку в классе Moves(), как предлагает дполнительный 8-й пункт задания :( Сложности: Так и не удалось найти ошибку :( |
|||||
18 | Классы. Шахматная бюрократия |
|
|||
Мы продолжаем создание шахматных классов на языке C#, которые позволят проверять правила игры. На этом уроке мы допишем класс Chess(). Отчёт отправил: 10080. FireWolf Выполнено за 25 мин. [Показать отчёт] Научился: Продолжаю учиться устанавливать взаимодействия между множеством классов. Сложности: Держать в голове структуру классов, так как если повторяешь за кем-то, а не сам придумываешь реализацию, то сложнее следить за развитием классов и их взаимодействием. Но эти навыки в любом случае пригодятся при попытках разобраться в чужом коде :) |
|||||
19 | Классы. Консольная доска |
1 тест |
|||
Мы приступаем к написанию тестов для нашей библиотеки. На этом уроке мы создадим функционал для отображения доски и исправим старую ошибку копипаста. Отчёт отправил: 10080. FireWolf Выполнено за 2 час. 16 мин. [Показать отчёт] Научился: Думаю, что сложнее всего программировать пешку из-за учёта возможности первого хода на 2 клетки, превращения в фигуру и взятия на проходе, ещё сложными должны быть короли и ладьи из-за учёта рокировки, а король ещё и из-за расчёта шаха и мата. Далее по сложности идёт конь из-за возможности перепрыгивания фигур и ферзь из-за большого числа направлений движения. А самым простым, по моему мнению, должен быть слон. А по части текущего урока я решил развить тему украшательства и сделал отображение цвета клеток :) Возможно есть более элегантный вариант расчёта цвета для точки, но для данной строки я лучше не придумал :( Чтобы не писать всё время Console.ReadLine()/WriteLine() и т.д. я вначале в списке ссылок на используемые namespace добавляю using static System.Console; Привожу метод Print() вместе с методом ChessToAscii(), так как отображение цвета точек зависит от чётности индекса знака в строке: static string ChessToAscii(Chess chess) { StringBuilder sb = new StringBuilder(); sb.AppendLine(" a b c d e f g h "); sb.AppendLine(" +-----------------+"); for (int y = 7; y >= 0; y--) { sb.Append(y + 1); sb.Append(" | "); for (int x = 0; x < 8; x++) sb.Append(chess.GetFigureAt(x, y) + " "); sb.AppendLine("| " + (y + 1)); } sb.AppendLine(" +-----------------+"); sb.AppendLine(" A B C D E F G H "); return sb.ToString(); } static void Print(string text) { ConsoleColor old = ForegroundColor; int c = 0; for (int i = 0; i< text.Length; i++, c++) { if (text[i] == ' ') c--; if (text[i] >= 'a' && text[i] <= 'z') ForegroundColor = ConsoleColor.Red; else if (text[i] >= 'A' && text[i] <= 'Z') ForegroundColor = ConsoleColor.White; else if (text[i] == '.') ForegroundColor = ((i + c) % 2 == 0) ? ConsoleColor.Red : ConsoleColor.White; else ForegroundColor = ConsoleColor.Cyan; Write(text[i]); } ForegroundColor = old; } |
|||||
20 | Классы. ВТОРОЙ ФИНАЛЬНЫЙ УРОК |
|
|||
Мы создали все основные классы нашего проекта. Твоя задача - нарисовать UML схему созданных классов. Нарисовать схему значительно проще, когда проект уже готов. Поэтому задание не сложное, но очень, очень полезное и нужное. Используй иерархическую структуру Solution Explorer в VisualStudio. Нарисовать можно от руки, либо в сервисе draw.io. Можно использовать любой другой *не автоматический* инструмент рисования. Важно сделать это самостоятельно, а не сгенерить программой! Поэтому рисуй сам. * Не забывайте потом дорисовывать схему в процессе добавления новых методов в классах. Отчёт отправил: 10080. FireWolf Выполнено за 6 час. 53 мин. [Показать отчёт] Научился: Почитал про UML - это нужно отдельно учить :( Посмотрел как диаграмму классов показывает VS (так себе), почитал о куче разных способов отрисовки и остановился на варианте с указанием какой класс используется в конструкторе другого класса, потому что если рисовать ВСЕ взаимосвязи, то вместо наглядности достигается совершенно обратный эффект. Потом нарисовал в Иллюстраторе. Сложности: Прочитать про UML и нарисовать. |
|||||
21 | Алгоритмы. Волшебные шахматы |
1 тест |
|||
Мы приступаем к написанию шахматных алгоритмов. На этом уроке мы добавил в класс Board() необходимые свойства и реализуем парсинг передаваемого FEN. Отчёт отправил: 10080. FireWolf Выполнено за 19 час. 19 мин. [Показать отчёт] Научился: Всё знакомо и понятно. Только я использовал свой вариант парсинга через StringBuilder. Ну ещё сделал отображение доски в консоли ещё красивее чем сделал в 19-м уроке (спасибо Ивану Воронину за напоминание о BackgroundColor ;)) Сложности: Ничего |
|||||
22 | Алгоритмы. Сборка фена |
1 тест |
|||
Мы продолжаем написание шахматных алгоритмов. На этом уроке мы реализуем формирование текущей позиции в формате FEN. Отчёт отправил: 10080. FireWolf Выполнено за 17 час. 34 мин. [Показать отчёт] Научился: Понравился хак с sb = sb.Replace(eight.Substring(0, i), i.ToString()); Пока не досмотрел до этого места у меня крутились мысли о проходе строки с конца, запоминании места встречи "1", подсчёта количества последовательных единиц и замены подстроки по индексу на количество насчитанных единиц. Но способ из урока конечно проще :)))) Думал над предложением реализовать вывод знаков фигур из Unicode, но они сбивают всё форматирование шахматной доски и надо всё переписывать. Попробую сделать в следующем уроке. |
|||||
23 | Алгоритмы. Генератор ходов |
1 тест |
|||
Мы продолжаем написание шахматных алгоритмов. На этом уроке мы начинаем реализацию проверок можно ли пойти с одной клетки на другую. Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 18 мин. [Показать отчёт] Научился: Попрактиковался в использовании yield. В общих чертах представляю, что это и как это работает (что-то вроде синтаксического сахара для автогенерации Observer/Observable (?)), но всегда сложно понять, где именно это стоит применить. Ещё довёл до ума красивое отображение шахматного поля! :) Если интересно, то я его вывожу вот так (ещё я тут использую нововведение в C# 7.0 - вложенные функции): static string ChessToAscii(Chess chess) { var sb = new StringBuilder(); sb.AppendLine(" a b c d e f g h "); sb.AppendLine(" +----------------+"); for (int y = 7; y >= 0; y--) { sb.Append(" "); sb.Append(y + 1); sb.Append(" |"); for (int x = 0; x < 8; x++) sb.Append(chess.GetFigureAt(x, y)); sb.AppendLine("| " + (y + 1)); } sb.AppendLine(" +----------------+"); sb.AppendLine(" A B C D E F G H "); return sb.ToString(); } static void Print(string text) { OutputEncoding = Encoding.Unicode; ConsoleColor fcOld = ForegroundColor; ConsoleColor bcOld = BackgroundColor; int c = 0; for (int i = 0; i < text.Length; i++, c++) { if (text[i] >= 'a' && text[i] <= 'z') { ForegroundColor = ConsoleColor.Red; } else if (text[i] >= 'A' && text[i] <= 'Z') { ForegroundColor = ConsoleColor.DarkYellow; } else ForegroundColor = ConsoleColor.Cyan; PrintChar(text[i], i); } ForegroundColor = fcOld; BackgroundColor = bcOld; void PrintChar(char f, int i) { if (i > 49 && i < 209) switch (f) { case 'K' : SetBGColor(); Write('\u2654'); break; case 'Q' : SetBGColor(); Write('\u2655'); break; case 'R' : SetBGColor(); Write('\u2656'); break; case 'B' : SetBGColor(); Write('\u2657'); break; case 'N' : SetBGColor(); Write('\u2658'); break; case 'P' : SetBGColor(); Write('\u2659'); break; case 'k' : SetBGColor(); Write('\u265A'); break; case 'q' : SetBGColor(); Write('\u265B'); break; case 'r' : SetBGColor(); Write('\u265C'); break; case 'b' : SetBGColor(); Write('\u265D'); break; case 'n' : SetBGColor(); Write('\u265E'); break; case 'p' : SetBGColor(); Write('\u265F'); break; case '.' : SetBGColor(); Write(" "); break; default: Write(f); break; } else Write(f); BackgroundColor = bcOld; void SetBGColor() { BackgroundColor = (i % 2 == 0) ? ConsoleColor.Gray : ConsoleColor.DarkGray; } } } Сложности: Доделать красивый вывод шахматного поля. |
|||||
24 | Алгоритмы. Куда идёт Король |
1 тест |
|||
Мы продолжаем написание шахматных алгоритмов. На этом уроке мы реализуем проверку может ли King пойти с одной клетки на другую. Отчёт отправил: 10080. FireWolf Выполнено за 3 час. 53 мин. [Показать отчёт] Научился: Научился ещё лучше разносить функции по предназначенным для этого классам :) Когда основа заранее продумана и написаны базовые фнкции, действительно добавлять новые возможности не сложно. Как, например, проверку ходов коня :) (есть на скриншоте). Но меня смущает такой момент: а не было бы логичнее использовать другую парадигму и наследовать фигуры от абстрактной фигуры (или использовать интерфейс), привязать положение на доске к экземпляру фигуры и напрямую опрашивать выбранную фигуру, на какие клетки она может пойти через универсальный или абстрактный метод, который как сейчас будет вызывать подходящий метод проверки в Moves? А то сейчас фигура "проявляется" только в момент попытки совершения хода, да и вся доска пересоздаётся каждый ход. А так мы бы меняли только состояние одной-двух фигур... |
|||||
25 | Алгоритмы. Ночью с Конём |
1 тест |
|||
Мы продолжаем написание шахматных алгоритмов. На этом уроке мы реализуем проверку может ли Knight пойти с одной клетки на другую. Отчёт отправил: 10080. FireWolf Выполнено за 6 мин. [Показать отчёт] Научился: Всё сделал на предыдущем уроке :) |
|||||
26 | Алгоритмы. Дальнобойщики |
1 тест |
|||
Мы продолжаем написание шахматных алгоритмов. На этом уроке мы переходим к дальнобойным фигурам. Отчёт отправил: 10080. FireWolf Выполнено за 3 час. 8 мин. [Показать отчёт] Научился: Понравился хитрый хак с Math.Sign() и удивил неожиданный подход с реализацией проверки ходов слона и ладьи через ограничение на проверку ходов ферзя, а не через проверку ферзя через проверку как ладьи и как слона. |
|||||
27 | Алгоритмы. Храбрая пешка |
|
|||
Мы продолжаем написание шахматных алгоритмов. На этом уроке мы приступаем к реализации алгоритмов самой сложной фигуры: Pawn. Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 31 мин. [Показать отчёт] Научился: Всё понятно. Только я засунул методы CanPawnGo(), CanPawnJump() и CanPawnEat() прямо внутрь метода CanPawnMove(), так как они используются только как вспомогательные для него. Сложности: Ничего! |
|||||
28 | Алгоритмы. Четвёртое превращение |
1 тест |
|||
Мы продолжаем написание шахматных алгоритмов. На этом уроке мы реализуем превращение Pawn в одну из четырёх фигур: Queen, Knight, Bishop и Rook. Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 49 мин. [Показать отчёт] Научился: Очень интересно следить за постепенным надстраиванием функционала. Правда, когда так много разных классов обращаются по цепочке методов к друг другу, иногда надо отвлекаться и проходить по всей цепочке, чтобы вспомнить, как именно всё работает :) |
|||||
29 | Алгоритмы. Рефакторинг на доске |
1 тест |
|||
Мы продолжаем написание шахматных алгоритмов. На этом уроке мы займёмся рефакторингом. Отчёт отправил: 10080. FireWolf Выполнено за 2 час. 51 мин. [Показать отчёт] Научился: Оень понравилась идея со скрытием функционала создания доски в наследуемом классе. Ещё последовав идее из видео, для ускорения создания новой доски сделал копирование полей из старой доски в новую (реализация есть на скриншотах). Правда я сделал это просто копированием, но может как-нибудь переделаю через MemberwiseClone, но не хочется слишком углубляться в рефакторинг, пока программа ещё только создаётся :) |
|||||
30 | Алгоритмы. Допрыгалась! |
|
|||
Мы продолжаем написание шахматных алгоритмов. На этом уроке мы займёмся взятием пешкой на проходе. Отчёт отправил: 10080. FireWolf Выполнено за 4 час. 15 мин. [Показать отчёт] Научился: Очень нравится повторное использование кода и простота и наглядность алгоритмов! |
|||||
31 | Алгоритмы. Королевский паркур |
|
|||
Мы продолжаем написание шахматных алгоритмов. На этом уроке мы реализуем рокировку. Отчёт отправил: 10080. FireWolf Выполнено за 2 час. 57 мин. [Показать отчёт] Научился: Всё прекрасно, но меня всё-таки немного смущают лестницы из if'ов. Попробовал switch с case when, но по размеру то же самое осталось. Остановился пока на if'ах, чуть разбавленных амперсандами :) |
|||||
32 | Алгоритмы. Защита короля |
|
|||
Мы продолжаем написание шахматных алгоритмов. На этом уроке мы будем защищать короля от ШАХа. Отчёт отправил: 10080. FireWolf Выполнено за 3 час. 21 мин. [Показать отчёт] Научился: Оказалось, что проверка на шах ломает введённое копирование параметров из board в nextBoard, так что пока вернул ресурсоёмкую генерацию всех параметров при пересоздании доски, но позже вернусь к этому вопросу. Ещё нашёл и исправил ошибку с упущенными скобками, которые не позволяли ладье совершить рокировку. Ничто так не позволяет понять строение проекта, как дебаггинг :) |
|||||
33 | Алгоритмы. Шах и Мат! |
|
|||
Мы заканчиваем написание шахматных алгоритмов. На этом уроке мы реализуем возврат ситуации на доске. Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 31 мин. [Показать отчёт] Научился: Изящный алгоритм шаха, мата и пата :) Правда, мне кажется, что для полного понимания всех алгоритмов надо будет потом переделать всё самому, а то когда следуешь за учителем, то не в полной мере понимаешь, почему сделано именно так, а не иначе, чем когда приходишь к такому решению сам. |
|||||
34 | Алгоритмы. ТРЕТИЙ ФИНАЛЬНЫЙ УРОК |
|
|||
На этом уроке мы исправим одну ошибку и добавим ещё один вариант метода GetFigureAt(string xy). Ваше задание - записать подробный отзыв об алгоритмической части проекта. Отчёт отправил: 10080. FireWolf Выполнено за 30 мин. [Показать отчёт] Научился: Замечательно просто и понятно объяснено создание алгоритмов движения шахматных фигур, хотя, из-за недостатка опыта, иногда бывает сложно помнить, что именно делает вся цепочка методов в разных классах. Некоторые алгоритмы, в частности пересоздание доски, реализованы не оптимальным методом, но это, как я понимаю, специально, чтобы не усложнять подачу материала, к тому же, никто не запрещает проявить творчество в данном вопросе :) Собственно говоря, мне доставило большое удовольствие собственное "творчество" в написании вывода шахматной доски с клетками и шахматными фигурами из Unicode ^_^ Сложности: Следить за логикой шахматных алгоритмов в цепочках методов в разных классах. |
|||||
35 | Алгоритмы. VIP. Шахматное супертестирование |
|
|||
На этом уроке мы проверим корректность ваших алгоритмов. Для этого мы прогоним супер-тест по генерации всех вариантов. * Выполнять этот урок необязательно. Ссылка: Сайт с результатами тестирования Отчёт отправил: 10080. FireWolf Выполнено за 5 час. 10 мин. [Показать отчёт] Научился: Это будет длинный отчёт, но, надеюсь, интересный! В общем я решил заморочиться и сделать много ненужной работы! Опытным путём удалось выяснить, что очень большие потери идут на пересоздание board, но как уменьшить расходы на пересоздание, чтобы при этом не сбивалось расположение фигур я пока не придумал. Тогда я подумал, как можно ускорить расчёты и решил распараллелить метод Program.NextMoves(). Сделать по-уму через Parallels.Foreach вначале не получилось, так как получались неверные результаты, и тогда я решил схитрить и сделать через PLINQ, а заодно потестить и простой LINQ. Вначале результаты были обнадёживающие, но после нескольких тестовых запусков пошли неверные результаты в многопотоке и тогда я всё-таки разобрался, как сделать многопоточный foreach. Ещё я попытался распараллелить метод Chess.YieldValidMoves(), но из этого ничего хорошего не вышло. Точнее, все распараллеливания считали быстро, но считали ерунду :) В ходе тестирования выяснилось также, что просто перевод foreach в LINQ иногда быстрее. В общем я провёл следующее тестирование: NextMoves - простой метод из урока, NextMovesLINQ - он же, но преобразованный в LINQ, NextMovesParallel - реализованный через Parallel.Foreach Этими методами я вызывал следующие методы: YieldValidMoves - метод из Chess, стостоящий из лесенки foreach, YieldValidMovesLINQ - он же, но преобразованный в LINQ Результаты, полученные на моём ноутбуке с процессором i5 8250 для стартового FEN "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1": NextMoves() + YieldValidMoves() - Steps: 1 / Result: 20 / Done in 16ms NextMovesLINQ() + YieldValidMoves() - Steps: 1 / Result: 20 / Done in 10ms NextMovesParallel + YieldValidMoves() - Steps: 1 / Result: 20 / Done in 63ms NextMoves() + YieldValidMovesLINQ() - Steps: 1 / Result: 20 / Done in 13ms NextMovesLINQ() + YieldValidMovesLINQ() - Steps: 1 / Result: 20 / Done in 6ms NextMovesParallel() + YieldValidMovesLINQ() - Steps: 1 / Result: 20 / Done in 38ms NextMoves() + YieldValidMoves() - Steps: 2 / Result: 400 / Done in 123ms NextMovesLINQ() + YieldValidMoves() - Steps: 2 / Result: 400 / Done in 82ms NextMovesParallel() + YieldValidMoves() - Steps: 2 / Result: 400 / Done in 33ms NextMoves() + YieldValidMovesLINQ() - Steps: 2 / Result: 400 / Done in 94ms NextMovesLINQ() + YieldValidMovesLINQ() - Steps: 2 / Result: 400 / Done in 93ms NextMovesParallel() + YieldValidMovesLINQ() - Steps: 2 / Result: 400 / Done in 26ms NextMoves() + YieldValidMoves() - Steps: 3 / Result: 8902 / Done in 3012ms NextMovesLINQ() + YieldValidMoves() - Steps: 3 / Result: 8902 / Done in 2583ms NextMovesParallel() + YieldValidMoves() - Steps: 3 / Result: 8902 / Done in 513ms NextMoves() + YieldValidMovesLINQ() - Steps: 3 / Result: 8902 / Done in 3067ms NextMovesLINQ() + YieldValidMovesLINQ() - Steps: 3 / Result: 8902 / Done in 2327ms NextMovesParallel() + YieldValidMovesLINQ() - Steps: 3 / Result: 8902 / Done in 471ms NextMoves() + YieldValidMoves() - Steps: 4 / Result: 197281 / Done in 55673ms NextMovesLINQ() + YieldValidMoves() - Steps: 4 / Result: 197281 / Done in 54321ms NextMovesParallel() + YieldValidMoves() - Steps: 4 / Result: 197281 / Done in 21467ms NextMoves() + YieldValidMovesLINQ() - Steps: 4 / Result: 197281 / Done in 55400ms NextMovesLINQ() + YieldValidMovesLINQ() - Steps: 4 / Result: 197281 / Done in 55620ms NextMovesParallel() + YieldValidMovesLINQ() - Steps: 4 / Result: 197281 / Done in 21483ms Выводы: 1) Распараллеливание вредно для глубины просчёта 1, но очень полезно начиная с 2 и далее. 2) Использование LINQ в обоих методах для глубины 1 даёт наибольшую скорость расчётов. 3) Начиная с глубины просчёта 2 распараллеливание очень ускоряет расчёты. 4) Использование распараллеливания в первом методе для глубины 2 и 3 совместно с LINQ во втором методе в целом даёт наибольший эффект, за исключением NextMovesLINQ() + YieldValidMovesLINQ() для глубины 2. 5) Совместное использование NextMovesLINQ() + YieldValidMovesLINQ(), а также NextMovesParallel() + YieldValidMovesLINQ() в глубине расчётов 4 начинает немного отставать от связок NextMovesLINQ() + YieldValidMoves() и NextMovesParallel() + YieldValidMovesLINQ(). Это результат одного из прогонов теста на "прогретом" процессоре. Конечно на малой глубине просчётов были заметные колебания во времени исполнения, но я не стал собирать базу прогонов и вычислять средние значения. Но "на глаз" значения в среднем такие и получаются. Баги: 1) В одном запуске из примерно 5 на глубине 1, несмотря на использование блокировки потоков связка NextMovesParallel() + YieldValidMoves() давало результат 21. 2) В одном запуске из примерно 3 на глубине 1, просто использование связки NextMovesParallel() + YieldValidMovesLINQ() давало результат 21 или 22. 3) На глубине просчётов выше 2 ошибок не замечено. Для других стартовых позиций я подробно быстродействие не тестировал, только проверил на соответствие верным результатам. Ошибки были только во второй стартовой позиции на сайте из шести: "r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R". Так как в остальных 5 позициях всё было верно (за исключением лишней 1 или 2 при многопоточности на малой глубине), то, вероятно причина в том, что в коде не учитываются особые патовые ситуации. Сложности: Заставить *почти* без ошибок работать распараллеливание. |
|||||
36 | Алгоритмы. VIP. Можно пройти? |
|
|||
На этом уроке мы немного порефакторим и добавим очень полезную функцию. Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 30 мин. [Показать отчёт] Научился: Реализовал проверку на правильность хода перед пересозданием доски. Как это просто оказалось, оказывается! А я пытался проверки делать в дополнительном конструкторе... Позор мне _-_ Зато моё тестирование из предыдущего урока - https://www.videosharp.info/10080/checking/chess3=1935 - показало странные результаты. (Чтобы не повторять тут стену текста, подробности посмотрите в отчёте по предыдущему уроку). А по данному уроку, после реализации проверки возможности хода перед пересозданием board для начальной шахматной позиции, без сбора подробной статистики, но после нескольких тестов, можно точно только следующее (чтобы не постить длинную таблицу поверхностного тестирования передам результаты на словах, а подробнее можно на скриншоте посмотреть): 1) Появились сильные колебания производительности на глубинах расчёта ходов 1-3 и без многократных прогонов с вычисление среднего результата сказать определённо ничего нельзя, кроме следующих пунктов: 2) На глубине расчёта 3 стабильно повторяется ускорение расчётов в связках NextMovesLINQ() + YieldValidMoves() (1775ms против 2583ms) и NextMovesLINQ() + YieldValidMovesLINQ() (1815ms против 2327ms). 3) На 2-10% ускорились все варианты расчётов для глубины ходов 4. Выводы: 1) Для собственно проверки возможности хода в данном проекте значительной разницы при избавлении от лишних пересозданий board нет - скорость расчёта сильно скачет и явно в большей мере зависит от внешних факторов (сборщик мусора, троттлинг процессора и т.п.), а для проверки возможности хода фигурой глубина расчёта больше 1 не требуется. 2) Обращает внимание значительное ускорение расчётов для глубины 3 - 30-40%. Возможно есть какой-то sweet spot в количестве создаваемых объектов и вычислений над ними конкретно для LINQ. 3) Многопоточные вычисления продолжают лидировать для глубины расчёта 4, а вот про глубину 1-3 сказать определённо уже ничего нельзя - слишком сильные колебания результатов в каждом прогоне теста. 4) В любом случае для глубины вычислений 4 избавление от лишних board сказывается благотворно. Это всё выводы для начальной шахматной позиции без сделанных ходов. Для других позиций результаты могут отличаться. К следующему финальному уроку постараюсь сделать более подробное тестирование с вычислением средних результатов :) |
|||||
37 | Алгоритмы. VIP. Как пройти в библиотеку |
|
|||
На этом уроке мы подготовим библиотеку ChessRules. Для этого мы скомпилируем её в необходимой версии .NET и проверим работоспособность в Unity проекте. Отчёт отправил: 10080. FireWolf Выполнено за 1 день 3 час. 27 мин. [Показать отчёт] Научился: Вначале были проблемы с подключением dll - Unity ругалась, что не может найти объект по ссылке, но в процессе решения проблемы (видимо поменял версию .NET на 3.5, но не перекомпилировал) выяснилось, что версии Unity 2018 работают с dll версии .NET 4.X. Для этого надо сделать следующее: File -> Build Settings - > Player Settings -> в Inspector найти абзац Configuration и там поменять .NET 3.5 Equivalent на .NET 4.X Equivalent. И подключаемая dll'ка может лежать не только в корне Assets или в той же папке, что и скрип, который к ней обращается, но и, например, в отдельной папке для dll'ок (которая внутри Assets разумеется). |
|||||
38 | Интерфейс. План действий |
|
|||
На этом уроке мы обсудим дальнейший план действий.
Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 34 мин. [Показать отчёт] Научился: В архиве с картинками пустой картинки нет, так что я сам сделал прозрачный квадратик. Идём дальше! |
|||||
39 | Интерфейс. Генерация объектов |
|
|||
На этом уроке мы сгенерируем шахматную доску с базовыми объектами на ней. Отчёт отправил: 10080. FireWolf Выполнено за 3 час. 6 мин. [Показать отчёт] Научился: Улучшил свои зания по Unity, а заодно, так как пересоздал проект из-за обновления Unity и потёр имевшийся скрипт board, то повторил уроки по написанию скрипта :) |
|||||
40 | Интерфейс. Начальная позиция |
|
|||
На этом уроке мы добавим ранее созданную библиотеку ChessRules.dll в проект на Unity. Отчёт отправил: 10080. FireWolf Выполнено за 1 день 2 час. 12 мин. [Показать отчёт] Научился: 1) Научился генерировать шахматную доску и расставалять на ней фигуры с помощью подключённой библиотеки ChessRules.dll. 2) Все фигуры и клетки вначале создавались в двойном экземпляре, но в конце концов удалось отследить проблему. Оказывается я повесил на камеру два экземпляра скрипта генерации доски и они оба исправно отрабатывали. Так что теперь, если в юнити будут загадочные дубликаты объектов я буду знать где стоит искать в первую очередь :) Сложности: Найти ошибку, как обычно. |
|||||
41 | Интерфейс. Ход делегата |
|
|||
На этом уроке мы активируем проверку ходов, которую реализовали в ChessRules.dll. Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 26 мин. [Показать отчёт] Научился: Повторил использование делегатов :) Помню, вначале я вообще не понимал как их использовать. И даже не потому, что суть непонятна (как раз понятна), но потому что нет нормального объяснения что и как в них инициализируется. Все объяснения в учебниках похожи на то, как в институте профессор на лекции по матанализу пишет на доске: "В этой формуле берём это и это, перемножаем, сокращаем, результат подставляем в эту формулу (формула на пол доски) и отсюда ОЧЕВИДНО, что ответ будет такой, но никак не такой". Понять инициализацию делегатов мне в своё время помогли только события, в которых привязка одного к другому более понятна невооружённому взгляду :) |
|||||
42 | Интерфейс. Проверка хода |
|
|||
Мы продолжаем реализацию необходимого функционала для активации проверки ходов на основе ChessRules.dll. Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 7 мин. [Показать отчёт] Научился: В уроке всё выглядит очень просто, но самому до такой простоты пришлось бы доходить очень долго :) Чтобы пешку произвести в фигуру, думаю, надо, наверное, в FigureMoving добавить проверку достижения пешкой края доски и её превращения, чтобы в NextBoard передать уже готовую фигуру. Но остаётся вопрос - производить ли пешку безусловно в ферзя или оставлять выбор (достаточно выбора ферзь или конь). Но в случае выбора, надо добавлять в игру интерфейс для этого. |
|||||
43 | Интерфейс. VIP. Клетки отправления |
|
|||
Это бонусный урок, выполнять его не обязательно. На данном уроке мы реализуем подсветку тех клеток, с которых можно ходить. Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 59 мин. [Показать отчёт] Научился: Научился отмечать клетки, с которых можно совершить ход. |
|||||
44 | Интерфейс. VIP. Клетки прибытия |
1 тест |
|||
Это бонусный урок, выполнять его не обязательно. На данном уроке мы реализуем подсветку тех клеток, на которые можно ходить. Отчёт отправил: 10080. FireWolf Выполнено за 38 мин. [Показать отчёт] Научился: Повторил работу с делегатами. Шахматы становятся всё красивее и красивее. |
|||||
45 | Интерфейс. Щепотка рефакторинга |
1 тест |
|||
На этом уроке мы начинаем подготовку к превращению пешки в одну из четырёх фигур. Для начала проведём небольшой рефакторинг. Отчёт отправил: 10080. FireWolf Выполнено за 39 мин. [Показать отчёт] Научился: Вынесли повторяющиеся куски кода в отдельные функции. |
|||||
46 | Интерфейс. Выставка фигур |
|
|||
На этом уроке мы продолжаем подготовку к превращению пешки в одну из четырёх фигур. Теперь нам надо подготовить фигуры, в которые будем превращать. Отчёт отправил: 10080. FireWolf Выполнено за 48 мин. [Показать отчёт] Научился: Идём дальше! |
|||||
47 | Интерфейс. Долгожданное превращение |
|
|||
На этом уроке мы наконец превратим нашу пешку в одну из четырёх фигур. Отчёт отправил: 10080. FireWolf Выполнено за 3 час. 56 мин. [Показать отчёт] Научился: Ура, теперь пешка превращается в фигуры! По предложению Игромистра в уроке я подумал над тем, что ему не нравится в if (chess.Move(move) != chess) и мне кажется, дело в лишнем пересоздании доски для проверки. Я перекостылил кусок кода так, чтобы переменная доски создавалась один раз, она используется для проверки условия, а потом она же присваивается имеющейся переменной chess (проверил - работает): Chess probing = chess.Move(move); if (figure == "P" && strTo[1] == '8' || figure == "p" && strTo[1] == '1') if (probing != chess) { onPromotionMove = move; ShowPromotionFigures(figure); return; } chess = probing; А для начала игры с начала понятно, что надо сделать кнопку, которая пересоздаст chess и всё переинициализирует, но я не нашёл, как правильно почистить уже созданные в Unity объекты, потому что при переинициализации доски создаются дубликаты фигур. |
|||||
48 | Интерфейс. ЧЕТВЁРТЫЙ ФИНАЛЬНЫЙ УРОК |
|
|||
Напишите отзыв о четвёртой части курса: что получилось, что было сложным, что ещё вы добавите в программу. Отчёт отправил: 10080. FireWolf Выполнено за 19 мин. [Показать отчёт] Научился: Стал лучше понимать работу со скриптами в Unity. Также столкнулся с багом/фичей с возможностью повесить 2 раза один скрипт на объект из-за чего не мог понять, почему у меня доска с фигурами создавалась дважды. Сложности: Перекопать код в поисках причины создания двух копий доски с фигурами, а оказалось просто дважды повесил скрипт _-_ |
|||||
49 | База данных. Management в студию! |
|
|||
На этом уроке мы приступаем к созданию БД для нашего сервера шахматы онлайн. Отчёт отправил: 10080. FireWolf Выполнено за 32 мин. [Показать отчёт] Научился: Пришлось потратить несколько дней, чтобы на мобильном интернете проапгрейдить SQL Express до SQL Developer. А может и Экспресса хватило бы? Сложности: Не порубить топором и не сжечь модем Yota. |
|||||
50 | База данных. Планирование |
|
|||
Мы продолжаем создание БД для нашего сервера шахматы онлайн. На данном уроке мы спроектируем схему нашей БД. Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 37 мин. [Показать отчёт] Научился: Наконец то базы данных! |
|||||
51 | База данных. Упрощение |
|
|||
Мы продолжаем создание БД для нашего сервера шахматы онлайн. На данном уроке мы упростим схему нашей БД. Отчёт отправил: 10080. FireWolf Выполнено за 26 мин. [Показать отчёт] Научился: Упрощать базы SQL на стадии планирования :) Но остаётся вопрос, как назначать цвет и следить за тем, какой игрок каким цветом играет? Ну и базу игроков для статистики можно было бы оставить... |
|||||
52 | База данных. Созидание |
|
|||
Мы продолжаем создание БД для нашего сервера шахматы онлайн. На данном уроке мы наконец создадим нашу базу данных для онлайн шахмат. Отчёт отправил: 10080. FireWolf Выполнено за 29 мин. [Показать отчёт] Научился: Создавать базу SQL в SQL Management Studio. Это попроще чем напрямую из Visual Studio. А вообще наверное надо через Entity Framework учиться такое делать. Ещё нашёл где менять язык SSMS (на втором скриншоте), но там это может зависеть от языка системы и языкового пакета в Visual Studio. |
|||||
53 | База данных. VIP. Таблицы на вырост |
|
|||
Мы продолжаем создание БД для нашего сервера шахматы онлайн. На данном уроке мы создадим дополнительные таблицы, которые понадобятся для реализации полноценной онлайн игры. Отчёт отправил: 10080. FireWolf Выполнено за 41 мин. [Показать отчёт] Научился: Улучшил свои практически отсутсвующие навыки по работе с таблицами SQL (в учебнике Троелсена оно как-то замутнее объяснялось). |
|||||
54 | База данных. VIP. Красивая диаграма |
|
|||
На данном уроке мы нарисуем диаграмму нашей БД.
Отчёт отправил: 10080. FireWolf Выполнено за 23 мин. [Показать отчёт] Научился: Делать диаграммы таблиц SQL :) |
|||||
55 | База данных. ПЯТЫЙ ФИНАЛЬНЫЙ УРОК |
|
|||
Напишите отзыв о пятой части курса: что получилось, что было сложным, что ещё вы добавите в программу. Отчёт отправил: 10080. FireWolf Выполнено за 8 мин. [Показать отчёт] Научился: Научился пользоваться SSMS, что гораздо удобнее чем из Visual Studio. Отзыв: в уроке "База данных. VIP. Таблицы на вырост" возможно стоило бы подробнее пояснить идею Foreign Keys и дать пример тестового заполнения таблиц, но так как в рамках курса для работы берётся таблица попробще, то это просто придирки :) |
|||||
56 | Сервер. Последняя версия |
|
|||
На данном уроке мы приступаем к созданию серверной части нашего онлайн проекта по шахматам. Отчёт отправил: 10080. FireWolf Выполнено за 39 мин. [Показать отчёт] Научился: Очень интересная и полезная тема! Есть подозрение, что без знания SQL и веб приложений работу программистом не найти... |
|||||
57 | Сервер. Райский Эдем - EDM |
|
|||
На этом уроке мы создадим EDM - Entity Data Model.
Отчёт отправил: 10080. FireWolf Выполнено за 54 мин. [Показать отчёт] Научился: Научился подключать базу к web api. Странно: в модели ChessModel метод "protected override void OnModelCreating(DbModelBuilder modelBuilder)" оказался пустым. Не помогло и перепрохождение урока по шагам. После перепечатывания с экрана всё заработало, но причины данного явления пока непонятны. |
|||||
58 | Сервер. Новая игра на JSON |
|
|||
На этом уроке мы изменим формат вывода с XML на JSON.
Отчёт отправил: 10080. FireWolf Выполнено за 3 час. 22 мин. [Показать отчёт] Научился: Программно создавать новую игру в базе SQL. Так как я с SQL был знаком только в рамках учебника Троелсена по C#, то мне сложно с уверенностью ответить на вопрос из урока, что может не нравиться в имеющемся контроллере обращаения к базе данных. Но насколько я помню, прямая модификация базы извне является не самым безопасным и надёжным способом работы с ней и лучше использовать Stored Procedures. |
|||||
59 | Сервер. Официант без логики |
|
|||
На этом уроке мы будем упрощать наш ChessController.
Отчёт отправил: 10080. FireWolf Выполнено за 44 мин. [Показать отчёт] Научился: Лучше понимать работу с SQL. Очень интересно. Давно хотел поизучать работу с SQL на парктике. |
|||||
60 | Сервер. Ваш ход! |
|
|||
Мы продолжаем создание серверной части для нашего проекта Шахматы по сети. На этом уроке мы реализуем выполнение ходов. Отчёт отправил: 10080. FireWolf Выполнено за 1 день 17 час. 36 мин. [Показать отчёт] Научился: Очень интересно и полезно изучить взаимодействие с базой данных на практике. С новым пониманием прямо захотелось перечитать главы учебника Троелсена по C#, где разбиралось нечто подобное. Чтобы конец хода увидел другой игрок, самый простой вариант, что мне пришёл в голову, это ввести новый статус "aboutdone" в случае мата или пата и, когда его видит другой игрок, тогда уже менять статус на "done". |
|||||
61 | Сервер. Шахматная Идемпотентность |
|
|||
Мы продолжаем создание серверной части для нашего проекта Шахматы по сети. На этом уроке мы обсудим Шахматную Идемпотентность. Напишите своими словами, что такое Идемпотентность. Отчёт отправил: 10080. FireWolf Выполнено за 59 мин. [Показать отчёт] Научился: Добавил идемпотентность в код запроса базы данных. "Scientia potentia est!" |
|||||
62 | Сервер. Китайская ничья |
|
|||
Мы продолжаем создание серверной части для нашего проекта Шахматы по сети. На этом уроке мы реализуем завершение игры при сдаче. Отчёт отправил: 10080. FireWolf Выполнено за 59 мин. [Показать отчёт] Научился: Продолжение развития взаимодействия с базой данных. |
|||||
63 | Сервер. ШЕСТОЙ ФИНАЛЬНЫЙ УРОК |
|
|||
Напишите отзыв о шестой части курса: что получилось, что было сложным, что ещё вы добавите в программу. Отчёт отправил: 10080. FireWolf Выполнено за 40 мин. [Показать отчёт] Научился: За исключением того, что в уроке https://www.videosharp.info/video/chess3/nr=1984 по неустанровленной причинев модели ChessModel метод "protected override void OnModelCreating(DbModelBuilder modelBuilder)" оказывался пустым и его содержимое пришлось впечатывать вручную, всё прошло гладко. На мой вгляд в программе больше всего не хватает привязки очереди ходов к игрокам, чтобы нельзя было ходить за соперника. Можно даже не создавать пополняемую таблицу игроков, а сделать, скажем, 10 свободных слотов для игры с кнопкой выхода игрока и таймаутом при неактивности. Также хорошо бы расширить набор статусов игры, чтобы было сразу понятно идёт ли она, неокончена или чем завершилась. Ещё, если не хотим раздувать базу историей игр, то можно ограничить количество слотов игр 1/2 от количества игроков и сбрасывать состояние по завершении игры. |
|||||
64 | Хостинг. Регистрация аккаунта |
|
|||
Приступаем к размещению нашего сервера в интернете. Для этого нам потребуется Windows-хостинг с поддержкой ASP.NET Чтобы мы были на одной волне и смогли проработать всё вместе, пожалуйста зарегистрируйтесь на этом хостинг-сервисе: Ссылка для регистрации на хостинге: https://www.reg.ru/?rlink=reflink-30461 Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 48 мин. [Показать отчёт] Научился: Зарегался на reg.ru Сложности: Открыть reg.ru и почту через мобильный интернет от Йоты. |
|||||
65 | Хостинг. Лучше заплатить |
|
|||
На этом уроке мы выберем план, доменное имя, укажем контактную информацию. Отчёт отправил: 10080. FireWolf Выполнено за 6 час. 57 мин. [Показать отчёт] Научился: Зарегистрировал хостинг и имя на reg.ru. Кстати, если не регистрировать хостинг и имя в тот же день, а подождать, то на следующий день позвонят с вопросом нет ли сложностей с решистрацией и пришлют промокоды на скидку :) |
|||||
66 | Хостинг. Доступ по FTP |
|
|||
На этом уроке мы установим пароль для подключения к хостингу по FTP. Напишите, какой FTP-клиент вы используете и приложите скриншот вашей FTP программы с подключением к хостингу. Отчёт отправил: 10080. FireWolf Выполнено за 40 мин. [Показать отчёт] Научился: Страничка заработала через час после регистрации. Не обошлось без глюков: бесплатный SSL сертификат за первую регистрацию не привязался, так как домен уже зарегистрирован! На меня! И сертификат не привязался! |
|||||
67 | Хостинг. Публикация проекта |
|
|||
На этом уроке мы настроим публикацию проекта из Visual Studio. Выполните все шаги и опубликуйте проект. Приложите скриншот Visual Studio с логами публикации и содержимое FTP каталога после публикации. Отчёт отправил: 10080. FireWolf Выполнено за 22 час. 29 мин. [Показать отчёт] Научился: Научился опубликовывать проект в сети напрямую из Visual Studio. Интересно, а как сделать, чтобы работало из подпапки на сайте? Просто сделать папку и опубликовать в неё? Сложности: Страница упорно не хотела работать, выдавая ошибку, подробности которой скрывала из-за настроек приватности в файле global.config. Поправив настройки в файле, удалось выяснить, что не устраивает версия .Net, под которую было скомпилировано. У меня было 4.7.1, а надо было 4.7. Кстати, эту информацию можно было получить и просто сщёлкнув по надписи "Предпросмотр" под адресом сайта в панели управления хостингом. |
|||||
68 | Хостинг. Перенос базы данных |
|
|||
На этом уроке мы перенесём базу данных на сервер и подключимся к ней из скрипта. Отчёт отправил: 10080. FireWolf Выполнено за 1 день 22 час. 4 мин. [Показать отчёт] Научился: Научился подключать сайт к базе данных на хостинге. Сложности: Найти причину неподключения сайта на хостинге к расположенной на хостинге базе данных. Оказалось, что сайт имел в приоритете строку подключения из web.config, а не из настроек ASP.Net на хостинге. Видимо причина в каком-то недосмотре при выполнении урока по генерации сайта посредством EF на основе базы данных. |
|||||
69 | Хостинг. VIP. Двойные стандарты |
|
|||
На этом уроке мы обсудим нюансы с публикацией очередной версии серверной части на хостинге. Отчёт отправил: 10080. FireWolf Выполнено за 3 час. 17 мин. [Показать отчёт] Научился: Научился модифицировать web.release.config, чтобы не приходилось переписывать строку подключения к базе данных для тестирования на локальном сервере или для релиза на удалённом. Сложности: В этом уроке - ничего, а в предыдущем я столкнулся именно с такой проблемой неработоспособности сайта и героически её решил, правда переписываением web.config под работу на удалнном сервере. |
|||||
70 | Хостинг. СЕДЬМОЙ ФИНАЛЬНЫЙ УРОК |
|
|||
В этой части мы разместили сервер не хостинге. Шахматная серверная программа нашла пристанище в интернете. Наконец-таки можно будет переходить к игре по сети. Напишите в отчёте, всё ли получилось и по какому адресу можно найти ваш серверный API. Отчёт отправил: 10080. FireWolf Выполнено за 34 мин. [Показать отчёт] Научился: Отличный раздел курса! Как раз то, что я хотел изучить: публикация сайта, сделанного на asp.net и подключение его к базе данных. Ссылка на шахматы: http://hinoookami.ru/api/chess Сложности: Решить проблему с неподключением опубликованного сайта к размещённой на хостинге же базе данных. |
|||||
71 | Клиент. Достучаться до облака |
|
|||
На этом уроке мы приступаем к завершающему этапу по созданию клиент-серверной игры "Онлайн шахматы". Отчёт отправил: 10080. FireWolf Выполнено за 20 час. 25 мин. [Показать отчёт] Научился: Научился подключаться к серверу из консольного приложения :) Для выделения FEN из полученной строки, я бы воспользовался методом, использованным мною для написания мобильного приложения для конвертирования валюты: https://www.videosharp.info/10080/checking/start=1891 То есть я использовал бы NuGet Newtonsoft и из полученной десериализированной в JSON строки по ключу FEN достал бы строку. Можно конечно и свой парсер написать, но зачем? То есть выглядит это так: class Client { public const string address = "https://hinoookami.ru/api/chess"; WebClient web; public Client() { web = new WebClient(); } public string GetFenFromServer() { string responce = web.DownloadString(address); var json = ParseJSON(responce); return json.FEN; } public static dynamic ParseJSON(string responce) { return JsonConvert.DeserializeObject(responce); } } Результат запроса к серверу с выводом оригинальной строки ответа и после вытаскивания FEN видно на скриншотах. |
|||||
72 | Клиент. Дедовские методы |
|
|||
На этом уроке мы выделим FEN из полученной json строки.
Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 34 мин. [Показать отчёт] Научился: По совету из урока переделал парсинг из Newtonsoft в ручной, но насколько я понял, есть библиотеки парсинга JSON с поддержкой Unity. |
|||||
73 | Клиент. Ход в мешке |
|
|||
На этом уроке мы научимся отправлять на сервер наш ход.
Отчёт отправил: 10080. FireWolf Выполнено за 22 час. 38 мин. [Показать отчёт] Научился: Играть сам собой в шахматы в двух консолях :) Ну и отправлять ход на сервер через консоль, но это уже мелочи... |
|||||
74 | Клиент. Серверные пешки |
|
|||
На этом уроке мы используем ранее созданный класс Client() в наш проект на Unity, чтобы можно было поиграть с GUI. Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 41 мин. [Показать отчёт] Научился: Получать расстонвку фигур в Unity с сервера. Почитал, как работать с https в Unity: надо использовать встроенные в Unity классы для работы с сетью, но применять их подожду до рефакторинга. Сложности: Понять, что для работы Newtonsoft надо его добавить в Assets проекта Unity :) |
|||||
75 | Клиент. Следы невиданных ходов |
|
|||
На этом уроке мы реализуем отправку хода через GUI.
Отчёт отправил: 10080. FireWolf Выполнено за 56 мин. [Показать отчёт] Научился: Оптравлять ход на сервер из Unity. Как раз то, чего я всегда боялся, но хотел изучить: обмен данными с удалённым сервером :) |
|||||
76 | Клиент. Фоновое обновление |
|
|||
На этом уроке мы реализуем функцию обновления текущего состояния на доске. Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 35 мин. [Показать отчёт] Научился: Использовать встроенный в Unity таймер вызова функции для обновления состояния доски при ходе соперника. |
|||||
77 |
![]() |
|
|||
Поздравляю вас с завершением нашего эпического курса по созданию клиент-серверной игры в шахматы по сети! Запишите живое видео, где будет видно, что в игру можно поиграть с двух разных устройств/компьютеров. Расскажите на видео о своём подвиге. Чем курс понравился, что было сложно, что было интересно, что можно будет добавить. Отчёт отправил: 10080. FireWolf Выполнено за 6 мин. [Показать отчёт] Научился: Научился делать сетевые шахматы на юнити под разные платформы. Были подробно рассмотрены шахматные алгоритмы и проверка правильности ходов, создание веб сервера с базой данных для сохранения игр и связи между игроками. Для полноты игры осталось добавить невозможность играть фигурами соперника, звуки, авторизацию пользователей и подобные украшательства. Ну и ещё рефакторинг... Сложности: Решить некоторые возникающие в процессе создания игры ошибки, что, однако, дало бесценный опыт на будущее :) Видеообзор: rLU0lxnGZbU |
|||||
78 | Рефакторинг. С чего начать? |
|
|||
На этом уроке мы начинаем рефакторинг кода клиентской части на Unity. Отчёт отправил: 10080. FireWolf Выполнено за 51 мин. [Показать отчёт] Научился: Вынесли класс DragAndDrop в отдельный файл. Я бы ещё разделил класс Board на два класса: в одном обрабатывалось бы только отображение доски, а в другом взаимодействие с доской. |
|||||
79 | Рефакторинг. Координатные трансформации |
|
|||
На этом уроке мы продолжаем рефакторинг и сейчас мы выделим статические элементы. Отчёт отправил: 10080. FireWolf Выполнено за 3 час. 22 мин. [Показать отчёт] Научился: Поделал рефакторинг и внёс несколько, как надеюсь, усовершенствований по сравнению с предложенным в уроке. Мне не очень понравился вариант с раздельным получением координат X и Y, когда обычно координаты всё равно требуются вместе и для раздельного получения нужно дважды отправлять Vector2. Вначале я попытался использовать для одновременного возврата X и Y новые ValueTuples из C# 7.x, но Unity понимает только C# 6.0. Так что я подумал вначале вносить полученные из Vector2 координаты в Anonymous Types и возвращать их как dynamic, чтобы избежать приведения и обращаться к полученному dynamic типу за значениями. Но dynamic всё-таки не совсем для этого и правильней было бы использовать кастомную структуру, но это уже лишнее усложнение. Но тут я вспомнил, что в Unity всё уже придумано до нас и есть Vector2Int, который идеально отвечает требованиям. Так что я сделал возврат коордиинат через этот класс из Unity. Пример на скриншотах. |
|||||
80 | Рефакторинг. Чёрный ящик |
|
|||
Мы продолжаем рефакторинг нашего кода. На данном уроке мы займёмся словарями. Отчёт отправил: 10080. FireWolf Выполнено за 40 мин. [Показать отчёт] Научился: Продолжаем рефакторинг! |
|||||
81 | Рефакторинг. Интерфейсная прослойка |
|
|||
Мы продолжаем рефакторинг нашего кода. На данном уроке мы создадим интерфейс ICreatable. Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 3 мин. [Показать отчёт] Научился: Интересное использование интерфейса для получения доступа к классу из которого требуется только один метод из другого класса. |
|||||
82 | Рефакторинг. Ящик с фигурами |
1 тест |
|||
Мы продолжаем рефакторинг нашего кода. На данном уроке мы сделаем класс Box() абстрактным. Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 1 мин. [Показать отчёт] Научился: Повторил применение абстрактных классов. Пока что, без дальнейшего рефакторинга, добавление в Board.InitGameObjects() вызова figures.Init(); с оставлением имеющейся инициализации приводит к заполнению доски лишними пешками :) |
|||||
83 | Рефакторинг. Многоклеточная сущность |
|
|||
Мы продолжаем рефакторинг нашего кода. На данном уроке мы создадим класс BoxSquares(). Отчёт отправил: 10080. FireWolf Выполнено за 3 час. 52 мин. [Показать отчёт] Научился: Продолжаем разносить функциональность по разным классам. Сложности: Найти ошибочку, из-за которой всё шахматное поле замощалось чёрными пешками вдобавок к клеткам и нужным фигурам. |
|||||
84 | Рефакторинг. Вынос переноса |
|
|||
Мы продолжаем рефакторинг нашего кода. На данном уроке мы создадим класс Box().SetPosition(). Отчёт отправил: 10080. FireWolf Выполнено за 30 мин. [Показать отчёт] Научился: Продолжаем выносить функциональность в абстракный класс управления объектами на доске. |
|||||
85 | Рефакторинг. Спрайт, не дай себя заинтерфейсить |
|
|||
Мы продолжаем рефакторинг нашего кода. На данном уроке мы создадим класс Box().SetSpriteAt(). Отчёт отправил: 10080. FireWolf Выполнено за 30 мин. [Показать отчёт] Научился: Продолжаем использовать интерфейс для упрощения и оптимизации работы скриптов! |
|||||
86 | Рефакторинг. Клетка в клетке |
|
|||
Мы продолжаем рефакторинг нашего кода. На данном уроке мы перенесём и разделим класс ShowSquare(). Отчёт отправил: 10080. FireWolf Выполнено за 28 мин. [Показать отчёт] Научился: Продолжаем разгружать класс Board посредством выноса функционала в подходящие для этого классы. |
|||||
87 | Рефакторинг. Шахматная независимость |
|
|||
Мы продолжаем рефакторинг нашего кода. На данном уроке мы перенесём некоторые функции в класс BoxSquares(). Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 50 мин. [Показать отчёт] Научился: Узнал ещё больше тонкостей связанных с рефакторингом и выносом методов в подходящие для них классы. |
|||||
88 | Рефакторинг. Хоровод из четырёх фигур |
|
|||
Мы продолжаем рефакторинг нашего кода. На данном уроке мы порефакторим функционал превращения пешки. Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 24 мин. [Показать отчёт] Научился: Вынос повторяющихся кусков кода в отдельные функции и подготовка к дальнейшему рефакторингу. |
|||||
89 | Рефакторинг. Волшебник изумрудного ящика |
|
|||
Мы продолжаем рефакторинг нашего кода. На данном уроке мы создадим класс BoxPromots(). Отчёт отправил: 10080. FireWolf Выполнено за 1 час. 17 мин. [Показать отчёт] Научился: Отличный рефакторинг! Просто удивительно, как нагромождение сложных методов выстраивается в цепочку простых и понятных методов, распределнных по подходящим для них классам! Вдобавок к предложенному в уроке рефакторингу я применил передачу координат X и Y сразу с помощтю встроенной в Unity структуры Vector2Int. Сложности: Не всегда удаётся уследить за быстрой мыслью Евгения Витольдовича :) |
|||||
90 | Рефакторинг. Потерянная пешка |
|
|||
На этом уроке мы вернёмся к нашей библиотеке для исправления старой ошибки: пешка может превратиться в чужую фигуру ил остаться пешкой. Отчёт отправил: 10080. FireWolf Выполнено за 2 час. 12 мин. [Показать отчёт] Научился: Очень интересно понаблюдать за процессом поиска ошибок :) |
|||||
91 | Рефакторинг. Класс шахматной игры |
|
|||
ЭТОТ УРОК НУЖНО ПЕРЕЗАПИСАТЬ. ДЛЯ ЭТОГО МНЕ НУЖЕН ПРОЕКТ ДО ЕГО ВЫПОЛНЕНИЯ. ПОЖАЛУЙСТА ПЕРЕД ВЫПОЛНЕНИЕМ ЭТОГО УРОКА СОЗДАЙТЕ АРХИВ ПРОЕКТА И ПРИШЛИТЕ ЕГО МНЕ. Мы на финишной прямой нашего рефакторинга. На данном уроке мы вынесем логику игры в отдельный класс Game(). Отчёт отправил: 10080. FireWolf Выполнено за 2 час. 6 мин. [Показать отчёт] Научился: Если честно, то данный урок ломает класс Board гораздо сильнее, чем указывают примечания перед уроком, так как в уроке используется более раннее состояние Board, чем у нас уже есть к данному моменту. Пришлось подумать над костылями и как вызвать получение fen с сервера в свете рефакторинга. Практика самостоятельного придумывания костылей :) Сложности: Найти, куда подставить костыли после того, как рефакторинг поломал код :) |
|||||
92 | Рефакторинг. Двухэтажное превращение |
|
|||
Мы всё ближе и ближе к финишу нашего рефакторинга. На данном уроке мы вынесем оставшуюся логику игры в класс Game(). Отчёт отправил: 10080. FireWolf Выполнено за 1 день 1 час. 56 мин. [Показать отчёт] Научился: Опять, из-за расхождения в коде в видео и в коде, имеющимся после предыдущих уроков, пришлось поискать где происходит сбой. Чувствую, что есть лишний код, но пока подожду завершения уроков по рефакторингу, прежде чем начать править всё самостоятельно :) |
|||||
93 | Рефакторинг. Финальное причёсывание |
|
|||
Мы поздравляем тебя с завершением рефакторинга. На данном уроке мы причешем наши скрипты. Отчёт отправил: 10080. FireWolf Выполнено за 2 час. 21 мин. [Показать отчёт] Научился: Небольшая оптимизация вызова функций. Разнесение инициализации по двум методам давно смущало, но боялся трогать на случай последующих уроков :) |
|||||
94 | Рефакторинг. Последний аккорд |
|
|||
На этом уроке мы заканчиваем наш эпический курс. Получилось здорово. Я доволен результатом. Надеюсь, вы тоже. Мы проделали огромную работу. Каждый стал чуточку умнее и опытнее. Отчёт отправил: 10080. FireWolf Выполнено за 9 дней 1 час. 44 мин. [Показать отчёт] Научился: Отличный курс по созданию сетевых шахмат! Конечно, для полноценной игры надо добавить разделение ходов для разных пользователей, статистику и прочее, но цель этого курса дать основу для саморазвития и базовые знания для понимания работы с Unity, SQL и ASP.Core, а также программирования сложной логики и её последующего рефакторинга, с чем данный курс справляется на отлично! Было очень интересно искать способы дополнить и улучшить предложенные в уроках варианты. Например, в проверке расчёта ходов выясниллось, что реализация проверки через LINQ для глубоких расчётов быстрее простой рекурсии. В скриптах для Unity я вначале отказался от предложенного ручного парсинга JSON ответа сервера в пользу Nuget библиотеки от Newstonsoft, но затем, узнав, что в Unity есть, оказывается, встроенный парсер, стал использовать его. Также, я заменил WebClient из C# на UnityWebRequest из Unity, что потребовало некоторой реорганизации вызовов обновления состояния доски, так как веб-запросы в Unity выполняются асинхронно и из-за этого появлялась задержка с обновлением доски после хода. Еще пришлось подумать над сведением рефакторинга из уроков с разными версиями скриптов, но всё получилось. WebGL ссылка: http://hinoookami.ru/webgl/ Сложности: Свести в одну версию рефакторинг по отличающемуся коду из уроков и использовать встроенный в Unity асинхронный веб-запрос. Видеообзор: -WBNSXAWm8Q |
|||||
95 | VIP. Меню DimanDOSа |
|
|||
1. Создание и размещение кнопки вызова меню и панели с кнопками. 2. Программирование действий по нажатиям кнопок - создание функций и привязка их к событиям нажатия. Отчёт отправил: 10080. FireWolf Выполнено за 23 час. 8 мин. [Показать отчёт] Научился: Научился создавать меню и привязывать методы к событию нажатия кнопки. Спасибо DimanDOS'у за полезный урок по работе с UI в Unity! В отличие от урока я не стал делать диагональную кнопку вызова меню с помощью картинки, а по примеру WPF сделал средствами самой Unity. Ну и переключение состояния элемента меню сделал одной строкой: *объект*.SetActive(!*объект*.activeSelf); Сложности: В начале немного запутала интеллектуальность редактора Unity, когда было не совсем понятно, как он ассоциирует операцию над неинициализированным GameObject и элементами меню. |
|||||
Итого: 95 видеоуроков |
17 час. 04 мин. 18 тестов |
19 чел. | |||
Финалисты: Дмитрий, Yefim, Tekashnik, Иван Воронин, ser2018, Алексей, Дмитрий Б, alklokov, FireWolf, Andrew, Max, Новопашин Владимир, Красимир Зорбов, Антон, Евгений, Anatoli, Freud, Алена, MaxB . |