@Ledington

Как осуществить перемещение по диагонали и во все стороны [шахматы]?

Добрый день!
Есть задачка с шахматной доской.
Необходимо создать массив всех возможных ходов определенных фигур и записать их.
С ладьей все довольно просто, а вот с остальными потяжелее.
Подскажите как это можно реализовать или на какую функцию надо обратить внимание для использования.
И для того, чтобы добавить новую фигуру я создаю еще один лист - List BishopMoves (int x, int y)?

Код программы (консольное приложение)
using System;
using System.Collections.Generic;

namespace ConsoleApp_HW2
{
    class Program
    {
        List<Coords>[][,] moves; //список ходов для любого типа фигур (фигура и ее координаты)
        static void Main(string[] args) //выход статичного метода
        {
            Program program = new Program();
            program.Start();
        }

        void Start()
        {
            int count = Enum.GetNames(typeof(Figure)).Length; //запрос из списка Enum
            moves = new List<Coords>[count][,]; //фигуры с массивом списков координат для фигур
            moves[(int)Figure.Rook] = new List<Coords>[8, 8]; //список координат для Ладьи

            for (int x = 0; x <= 7; x++)
                for (int y = 0; y <= 7; y++)
                    moves[(int)Figure.Rook][x, y] = RookMoves(x, y);

        }

        List<Coords> RookMoves (int x, int y) //передвижение Ладьи
        {
            List<Coords>list = new List<Coords>(14); //фигура имеет 14 ходов из любой точки доски

                for (int sx = x - 1; sx >= 0; sx--) //идем влево пока равно нулю или больше и уменьшаем
                    list.Add(new Coords(sx, y)); //добавляем координату x, y без изменений
                for (int sx = x + 1; sx <=7; sx++) //идем вправо пока меньше или равен 7 и прибавляем
                    list.Add (new Coords(sx, y)); //добавляем координату x, y без изменений
                for (int sy = y - 1; sy >= 0; sy--) //идем вниз пока равно нулю или больше и уменьшаем
                    list.Add(new Coords(x, sy)); //добавляем координату y, x без изменений
                for (int sy = y + 1; sy <= 7; sy++) //идем вниз пока меньше или равен 7 и прибавляем
                    list.Add(new Coords(x, sy)); //добавляем координату y, x без изменений

            return list; //вернуть список
        }

        struct Coords //структура
        {
            public int x;
            public int y;

            public Coords (int x, int y)
            {
                this.x = x;
                this.y = y;
            }

            public override string ToString() //запись координат в строчку
                => $"{x}, {y}";
        }

        enum Figure //перечисление фигур
        {
            Rook, // Ладья
            Knight, //Конь
            Bishop, //Слон
            Queen, // Ферзь
            King //Король
        }
    }
}
  • Вопрос задан
  • 149 просмотров
Пригласить эксперта
Ответы на вопрос 1
samodum
@samodum
Какой вопрос - такой и ответ
1. Хранишь только данные о координатах каждой фигуры в матрице 8x8, где 0 - пусто, 1 - белая ладья, 2 - белый конь и т.д. 101 - чёрная ладья, 102 - чёрный конь... (а лучше с маской, например 64 = 0x40)
2. Для каждой фигуры дополнительно храни карту возможных ходов с возможным смещением фигур. Например, для коня их будет 8: [-1, -2], [-1, 2], [2, 1], [2, -1], [1, 2]... и т д.
Для слона их всего 4: [-1, -1], [-1, 1], [1, 1], [1, -1]

P.S. Кстати, не забудь про рокировку - это тоже ход, но который надо прописать отдельно. И их будет по два с каждой стороны доски
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы