Молодец, но советую тебе вначале пройти весь курс, а потом делать выводы, да, тут есть что оптимизировать и улучшить, но это как говорится, для самостоятельной работы, кому мало того, что даёт курс. Мне до сих пор некогда запилить видео для финального урока, чтобы перейти к VIP урокам по рефакторингу, так как ещё не все идеи и доработки реализовал по причине отсутствия времени.
Ну что вы, я выводов не делаю, а просто озвучиваю терзающие меня смутные сомнения о сравнительных достоинствах представленного здесь способа и того, как к реализации шахмат подошёл бы я ^_^ Очевидно, что данный способ очень нагляден, требует мало памяти и целиком завязан на строку FEN. Просто я не ожидал такой реализации, а посмотреть на практике интересные способы программирования всегда полезно.
Я как бы без претензии, я о том, что то о чём ты написал, это тоже отличная идея, но требует очень сильного рефакторинга, а тут, как ты верно заметил, всё кружится вокруг FEN и идея изначально была в том, чтобы реализовать проект по правилам MVP, поэтому ничего лишнего не предпринималось. Рефакторинг после финального урока даже считается излишним по этим правилам, что уж говорить о полноценно ООП. Я бы и генерацию доски тоже упростил. В этом и сила курса, показать один из вариантов реализации идеи, остальное пища для ума и в силу опыта каждого, кто будет проходить курс, будут и свои мысли и идеи появляться, это же хорошо, если сразу всё сделать от и до идеально, то это будет скучно, хуже делать нет смысла, а лучше уже не придумать, а тут золотая середина =)
з.ы.
и технологий очень много задействовано, когда пройдёт курс целиком, оценишь =)
Дал подробный ответ на видео.
www.youtube.com/watch?v=D-qw0jBVdGc
Спасибо за ответ на видео! К сожалению я пропустил начало стрима и посмотрел ответ только сейчас. Вы не думайте только, что я критикую - курс замечательный! Просто у меня возник вопрос почему сделано именно так, а не иначе, так как я представлял себе это немного по другому. Я думал больше о реализации фигур на доске для больших возможностей их рендеринга в Unity и о том, чтобы не просчитывать каждую фигуру в момент выбора, а в нескольких потоках сразу рассчитывать возможные ходы для всех фигур игрока. Но, как вы верно сказали на видео, это уже больше написание собственного шахматного движка :) Но вы напомнили, что в этом курсе больше упор на реализацию сетевого взаимодействия. Виноват :(
А как сделать такую же доску в консоли ? Удивительно красиво для консоли !
Надо сначала в настройках консоли (правый клик по зпголовку окна) выбрать шрифт, имеющий знаки шахматных фигур (например 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;
}
}