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

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

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

Шахматы по сети / Алгоритмы. Генератор ходов

  • Мы продолжаем написание шахматных алгоритмов.
    На этом уроке мы начинаем реализацию проверок
    можно ли пойти с одной клетки на другую.
  • Дата отправки отчёта: 9 июля 2018 г.
  • Задание выполнено: за 1 час. 27 мин.
  • Чему научился: Тут мы делали проверку на возможность хода для фигур нужного цвета.

  • Что было сложным: Есть проблемка: где-то пропустил момент (не вовремя моргнул, видимо), когда мы прописывали изменения в ФЭН после хода. У меня позиция всегда остаётся изначальной.

    Вот тот код, который сейчас у меня в классе "Чесс":
        public class Chess
        {
            public string fen { get { return board.fen; } }
            Board board;
            Moves moves;
            public Chess(string fen = "brnqknrb/pppppppp/8/8/8/8/PPPPPPPP/RKBNQBNR w KQkq - 0 1")
            {
                board = new Board(fen);
                moves = new Moves(board);
            }
            Chess(Board board)
            {
                this.board = board;
                moves = new Moves(board);
            }
            public Chess Move(string move)
            {
                FigureMoving fm = new FigureMoving(move);
                if(!moves.CanMove(fm))
                    return this;
                Board nextBoard = board.Move(fm);
                Chess nextChess = new Chess(nextBoard);
                //Color color = Color.white;
                //color = color.FlipColor();
                return nextChess;
            }

            public char GetFigureAt(int x, int y)
            {
                Square square = new Square(x, y);
                Figure figure = board.GetFigureAt(square);
                //square.OnBoard();
                return figure == Figure.none? '.': (char)figure;
            }
            public IEnumerable<string> YieldValidMoves()
            {
                foreach (FigureOnSquare fs in board.YieldMyFiguresOnSquares())
                    foreach (Square to in Square.YieldBoardSquares())
                    {
                        FigureMoving fm = new FigureMoving(fs,to);
                        if(moves.CanMove (fm))
                            yield return fm.ToString();
                    }
            }
        }


    А вот класс "Программ":
            static void Main(string[] args)
            {
                Chess chess = new Chess();
                while (true)
                {
                    Console.WriteLine(chess.fen);
                    Print(ChessToAscii(chess));
                    //foreach (string moves in chess.YieldValidMoves())
                        //Console.WriteLine(moves);
                    string move = Console.ReadLine();
                    //if (move == "") break;
                    chess = chess.Move(move);
                }
            }
            static string ChessToAscii(Chess chess)
            {
                StringBuilder sb = new StringBuilder();
                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("|");
                }
                sb.AppendLine("  +-----------------+");
                sb.AppendLine("    A B C D E F G H  ");
                return sb.ToString();
            }
            static void Print(string text)
            {
                ConsoleColor old = Console.ForegroundColor;
                foreach (char x in text)
                {
                    if (x >= 'a' && x <= 'z')
                        Console.ForegroundColor = ConsoleColor.Red;
                    else if (x >= 'A' && x <= 'Z')
                        Console.ForegroundColor = ConsoleColor.White;
                    else
                        Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.Write(x);

                }
                Console.ForegroundColor = old;
            }
        }

    Ну и
        class FigureMoving
        {
            public Figure figure { get; private set; }
            public Square from { get; private set; }
            public Square to { get; private set; }
            public Figure promotion { get; private set; }

            public FigureMoving( FigureOnSquare fs, Square to, Figure promotion = Figure.none)
            {
                this.figure = fs.figure;
                this.from = fs.square;
                this.to = to;
                this.promotion = promotion;
            }
            public FigureMoving(string move)// Pe2e4, Pe7e8Q
            {                              // 01234  012345
                this.figure = (Figure)move[0];
                this.from = new Square(move.Substring(1, 2));
                this.to = new Square(move.Substring(3, 2));
                if (move.Length == 6)
                    this.promotion = (Figure)move[5];
                else
                    this.promotion = Figure.none;
            }
            public override string ToString()
            {
                return ((char)figure).ToString()
                    + from.Name
                    + to.Name;
            }
        }
  • Оценка видео-уроку:
Отчёт от 4210 за Шахматы по сети / Алгоритмы. Генератор ходов




Оцени работу

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

1. --
Евгений Волосатов
Евгений Волосатов
ответить
→  Дмитрий  # Шахматы по сети / Алгоритмы. Генератор ходов / 2018-07-09 14:01

ну по такой простыне мне сложно подсказать


9913. --
vip
vip
ответить
→  Дмитрий  # Шахматы по сети / Алгоритмы. Генератор ходов / 2018-07-11 10:38

запусти программу в пошаговой отладке и все станет понятным


  • Отчёт оценивали:
    6452Кирилл Шмойлов+1   791Валерий Жданов+1   17947Dmitry Sinitsin+1   17606Виктор+1   3747Сергей+1   1Евгений Волосатов+1   3922Александр+1   17255Слава+1   1570Сарапульцев Константин+1   9980Timoha+1   17443WildOrc+1   5502Антон Кравченко0   11582Родион+1   18688Arslan+1   12464Татьяна+1   9913vip+1   13850Владимир+1   7645Александр Львович+1  

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





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

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

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

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


Научился: Хочу выразить благодарность Евгению Витольдовичу ! Отличный курс, отличный метод преподавания !



Научился: Сделал функцию Chess().YieldValidMoves(); Добавил статичную функцию Square().YieldBoardSquares(), функцию Board().YieldMyFigureOnSquares(); Переопределил функцию FigureMoving().ToString(); Протестировал работу добавленного функционала.