Курсы по программированию

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

основатель — Волосатов Евгений Витольдович
Поздравляю с 1 сентября! Система начисления Байтов работает.

Шахматы по сети / Алгоритмы. Куда идёт Король

  • Мы продолжаем написание шахматных алгоритмов.
    На этом уроке мы реализуем проверку
    может ли King пойти с одной клетки на другую.
  • Дата отправки отчёта: 12 мая 2018 г.
  • Задание выполнено: за 3 час. 53 мин.
  • Чему научился: Научился ещё лучше разносить функции по предназначенным для этого классам :) Когда основа заранее продумана и написаны базовые фнкции, действительно добавлять новые возможности не сложно. Как, например, проверку ходов коня :) (есть на скриншоте).

    Но меня смущает такой момент: а не было бы логичнее использовать другую парадигму и наследовать фигуры от абстрактной фигуры (или использовать интерфейс), привязать положение на доске к экземпляру фигуры и напрямую опрашивать выбранную фигуру, на какие клетки она может пойти через универсальный или абстрактный метод, который как сейчас будет вызывать подходящий метод проверки в Moves? А то сейчас фигура "проявляется" только в момент попытки совершения хода, да и вся доска пересоздаётся каждый ход. А так мы бы меняли только состояние одной-двух фигур...
  • Оценка видео-уроку:
Отчёт от 10080 за Шахматы по сети / Алгоритмы. Куда идёт Король


Отчёт от 10080 за Шахматы по сети / Алгоритмы. Куда идёт Король




Оцени работу

 
Сохранить страницу:

10558. --
Иван Воронин
Иван Воронин
ответить
→  FireWolf  # Шахматы по сети / Алгоритмы. Куда идёт Король / 2018-05-13 07:03

Молодец, но советую тебе вначале пройти весь курс, а потом делать выводы, да, тут есть что оптимизировать и улучшить, но это как говорится, для самостоятельной работы, кому мало того, что даёт курс. Мне до сих пор некогда запилить видео для финального урока, чтобы перейти к VIP урокам по рефакторингу, так как ещё не все идеи и доработки реализовал по причине отсутствия времени.


10080. --
FireWolf
FireWolf
ответить
→  Иван Воронин  # Шахматы по сети / Алгоритмы. Куда идёт Король / 2018-05-13 10:49

Ну что вы, я выводов не делаю, а просто озвучиваю терзающие меня смутные сомнения о сравнительных достоинствах представленного здесь способа и того, как к реализации шахмат подошёл бы я ^_^ Очевидно, что данный способ очень нагляден, требует мало памяти и целиком завязан на строку FEN. Просто я не ожидал такой реализации, а посмотреть на практике интересные способы программирования всегда полезно.


10558. --
Иван Воронин
Иван Воронин
ответить
→  FireWolf  # Шахматы по сети / Алгоритмы. Куда идёт Король / 2018-05-13 12:16

Я как бы без претензии, я о том, что то о чём ты написал, это тоже отличная идея, но требует очень сильного рефакторинга, а тут, как ты верно заметил, всё кружится вокруг FEN и идея изначально была в том, чтобы реализовать проект по правилам MVP, поэтому ничего лишнего не предпринималось. Рефакторинг после финального урока даже считается излишним по этим правилам, что уж говорить о полноценно ООП. Я бы и генерацию доски тоже упростил. В этом и сила курса, показать один из вариантов реализации идеи, остальное пища для ума и в силу опыта каждого, кто будет проходить курс, будут и свои мысли и идеи появляться, это же хорошо, если сразу всё сделать от и до идеально, то это будет скучно, хуже делать нет смысла, а лучше уже не придумать, а тут золотая середина =)
з.ы.
и технологий очень много задействовано, когда пройдёт курс целиком, оценишь =)


1. --
Евгений Волосатов
Евгений Волосатов
ответить
→  FireWolf  # Шахматы по сети / Алгоритмы. Куда идёт Король / 2018-05-13 21:42

Дал подробный ответ на видео.
www.youtube.com/watch?v=D-qw0jBVdGc


10080. --
FireWolf
FireWolf
ответить
→  Евгений Волосатов  # Шахматы по сети / Алгоритмы. Куда идёт Король / 2018-05-14 13:08

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


18131. --
Александр
Александр
ответить
→  FireWolf  # Шахматы по сети / Алгоритмы. Куда идёт Король / 2018-08-16 18:14

А как сделать такую же доску в консоли ? Удивительно красиво для консоли !


10080. --
FireWolf
FireWolf
ответить
→  Александр  # Шахматы по сети / Алгоритмы. Куда идёт Король / 2018-08-17 14:58

Надо сначала в настройках консоли (правый клик по зпголовку окна) выбрать шрифт, имеющий знаки шахматных фигур (например MS Gothic), а для вывода я использовал следующий код (первый метод собирает строку из состояния шахматного поля, а второй её выводит в консоль):

        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  ");
            if (chess.IsCheck) sb.AppendLine("CHECK!");
            if (chess.IsCheckmate) sb.AppendLine("CHECKMATE!");
            if (chess.IsStalemate) sb.AppendLine("STALEMATE!");
            return sb.ToString();
        }

        static void Print(string text)
        {
            OutputEncoding = Encoding.Unicode;
            ConsoleColor fcOld = ForegroundColor;
            ConsoleColor bcOld = BackgroundColor;
           
            for (int i = 0; i < text.Length; i++)
            {
                if (text[i] >= 'a' && text[i] <= 'z' && i < 228)
                {
                    ForegroundColor = ConsoleColor.DarkRed;
                }
                else if (text[i] >= 'A' && text[i] <= 'Z' && i < 228)
                {
                    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;
            }
        }


  • Отчёт оценивали:
    17947Dmitry Sinitsin+1   791Валерий Жданов+1   17443WildOrc+1   6452Кирилл Шмойлов+1   10558Иван Воронин+1   17606Виктор+1   5394Anton+1   3922Александр+1   2146Иван+1   10895Danil42Russia+1   8275Tekashnik+1   9971Юрий+1   1Евгений Волосатов+1   18249Александр+1   2410Денис+1   17255Слава+1   10494Алексей В.+1   9980Timoha+1   4395Денис+1   16218Дмитрий+1   3747Сергей+1   459Сергей Сергеевич+1   16533Андрей Шевченко+1   18131Александр+1   36285Александр Шлома+1  

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





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

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

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

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


Научился: Ограничивать ходы Короля и Коня. С новыми методами это легко.
Трудности: Пока так и не разобрался почему нужно компилировать длл перед каждым запуском и почему на поле 1ки. С yield разобрался.



Научился: Проверять возможность ходить королём.
Трудности: Самая простая и самая сложная - это я уже писал. Ну судя по всему конь - самая простая - а ферзь - самая сложная. Но пешки есть энпассант, промоушен... Так что даже не знаю. Вообще - все простые))) Коня сделал... Вроде получилось.