Имя: Пароль:
IT
 
ООП и шахматы. Как лучше сделать?
0 megabax
 
01.03.15
12:41
Добрый день. Я сейчас пишу движок для шахматной игры и у меня возник такой вопрос. В каком классе лучше всего реализовывать метод для определения, куда какая фигура может ходить: в классе Game, который отвечает за игру в целом или для каждой фигуры писать свой класс, дочерний от некого абстрактного класса Unit и уже там реализовывать получение списка возможных ходов?
1 Sserj
 
01.03.15
12:45
Сейчас придет NS и объяснит тебе что ООП и шахматы дурная затея
:)
2 megabax
 
01.03.15
12:46
(1) Почему же дурная? Я вот вообще не представляю, как без ОПП можно написать что то серьёзное? Не линейным же программированием все это  реализовать?
3 Sserj
 
01.03.15
12:48
хи-хи
NS-у это раскажи
:)
4 ДенисЧ
 
01.03.15
12:51
На функциональщине лучше получится...
5 Ненавижу 1С
 
гуру
01.03.15
12:53
пусть работает
6 Xapac
 
01.03.15
12:53
(0)покажи что у тебя есть
7 Sorm
 
01.03.15
12:58
(0) С учетом инкапсуляции - разумеется, в класс фигуры.
8 DJ Anthon
 
01.03.15
13:01
на асме пиши )
9 megabax
 
01.03.15
13:01
(4) На функциональщине это будет звездец.
10 megabax
 
01.03.15
13:02
(6) Ну, вот например, класса Game:
    /// <summary>
    /// Класс для реализации объекта игры. Их может быть несколько, например, для обдумывания хода
    /// компьютер может создавать отдельные отбъекты игры с целью имтировать ходы
    /// </summary>
    public class Game
    {
        /// <summary>
        /// Игровое поле
        /// </summary>
        public Unit[,] field;

        public Game()
        {
            field = new Unit[8, 8];
        }

        /// <summary>
        /// Начальная расстановка
        /// </summary>
        public void strating_setup()
        {
            //Белые
            field[0, 0] = new Unit("Ладья", UnitColor.White);
            field[1, 0] = new Unit("Конь", UnitColor.White);
            field[2, 0] = new Unit("Слон", UnitColor.White);
            field[3, 0] = new Unit("Ферзь", UnitColor.White);
            field[4, 0] = new Unit("Король", UnitColor.White);
            field[5, 0] = new Unit("Слон", UnitColor.White);
            field[6, 0] = new Unit("Конь", UnitColor.White);
            field[7, 0] = new Unit("Ладья", UnitColor.White);
            for (int i = 0; i < 8; i++) field[i, 1] = new Unit("Пешка", UnitColor.White);

            //Черные
            field[0, 7] = new Unit("Ладья", UnitColor.Black);
            field[1, 7] = new Unit("Конь", UnitColor.Black);
            field[2, 7] = new Unit("Слон", UnitColor.Black);
            field[3, 7] = new Unit("Ферзь", UnitColor.Black);
            field[4, 7] = new Unit("Король", UnitColor.Black);
            field[5, 7] = new Unit("Слон", UnitColor.Black);
            field[6, 7] = new Unit("Конь", UnitColor.Black);
            field[7, 7] = new Unit("Ладья", UnitColor.Black);
            for (int i = 0; i < 8; i++) field[i, 6] = new Unit("Пешка", UnitColor.Black);
        }
    }
И класс Unit:
    /// <summary>
    /// Игровые фигуры
    /// </summary>
    public class Unit
    {
        /// <summary>
        /// Имя фигуры
        /// </summary>
        public string name;

        /// <summary>
        /// Цвет фигуры
        /// </summary>
        public UnitColor color;

        /// <summary>
        /// Размер клетки
        /// </summary>
        public static int size = 30;

        /// <summary>
        /// Конструктор по названию и цвету фигуры
        /// </summary>
        /// <param name="a_name">Название</param>
        /// <param name="a_color">Цвет</param>
        public Unit(string a_name, UnitColor a_color)
        {
            name = a_name;
            color = a_color;
        }

        /// <summary>
        ///
        /// </summary>
        /// <param name="gr">Графический объект</param>
        /// <param name="x">Координата x</param>
        /// <param name="y">Координата y</param>
        /// <param name="a_color_cell">Имя чвета клетки</param>
        public void draw(Graphics gr, int x, int y, string a_color_cell)
        {
            string s;
            if (color == UnitColor.White) s = "Белый"; else s = "Черный";
            Bitmap temp = new Bitmap(@"figurs\" + s + name + "На" + a_color_cell + ".bmp");
            gr.DrawImage(temp, x*size, (7-y)*size);
        }
    }
11 ДенисЧ
 
01.03.15
13:06
(10) ой блин...
Логику и рисование в одном классе совмещать - последнее дело...
12 DJ Anthon
 
01.03.15
13:08
тебе лучше на кодебай, а не на мисту, тут 1Сники, а программисты среди них редкость, хоть они так и не считают.
13 Xapac
 
01.03.15
13:08
(10)
а чё за прикалюхи с

/// <summary>
/// </summary>

зачем оно вам, что даёт?
14 megabax
 
01.03.15
13:09
(11) Ну вообще то в классе Unit я еще не реализовывал логику, только думал об этом. А в классе Game никакого рисования у меня точно не будет.
15 megabax
 
01.03.15
13:10
(13) Туда комментарий пишут, который как всплывающая подсказка потом виден
16 Xapac
 
01.03.15
13:12
(15) а чё за среда?
17 Jaap Vduul
 
01.03.15
13:13
18 Sorm
 
01.03.15
13:14
(10) Делай класс юнит абстрактным, метод расчета ходов - тоже. Он же у тебя все равно будет параметризируемым, проще его реализовать на уровне конкретного класса.
19 megabax
 
01.03.15
13:26
(16) Visual Studio 2010, язык C#
20 megabax
 
01.03.15
13:28
(18) Дело в том, что из методов класса Unit(или его потомков) все равно надо будет лезть в Game - именно там храниться игривое поле и расстановка фигур.
21 Sorm
 
01.03.15
13:33
(20) Ну если ты ещё не определился с диаграммой классов - так определяйся:)...
22 Адский плющ
 
01.03.15
13:48
Класс "Компьютер-противник" сам должен знать куда ходят фигуры. Прелесть ООП в том, чтобы моделировать реальность, а не придумывать несуществующую шнягу.
23 Адский плющ
 
01.03.15
13:49
А проверять корректность хода человека, должна да, игра.
24 Lama12
 
01.03.15
14:02
(0) NS тебе в помощь.
25 megabax
 
01.03.15
15:16
(22) Хм, интересная идея. В принципе, если у класса "игрок комп" будет думалка на основе хитрозадого алгоритма ИИ, который имитирует деятельность человеческого мозга шахматиста, то да, ему полезно будет знать, как правильно ходить. Но если думалка будет построена на основе поиска в пространстве состояний, анализа базы данных матов, дебютов энтшпилей и рапиншпилей, то нафига в таком случае в классе "игрок комп" дублировать проверку корректности хода?
26 megabax
 
01.03.15
15:18
(23) Дык по идее и корретность хода игрока тоже должна првоерять Игра. Это позволит, например, запустить в движке два играющих против друг друга алгоритма и будет соревнования шахматных роботов.
27 alle68
 
01.03.15
15:25
(26) Так ты движок собрался писать или оболочку?
28 megabax
 
01.03.15
15:26
(27) И то и другое. Движок в оболочке.
29 alle68
 
01.03.15
15:33
(28) Обычно движок пишут отдельной программой, между которыми и проводятся соревнования под управлением "оболочки".
30 Злопчинский
 
01.03.15
15:34
я думаю что шахматы с объемомо кода в 1К - уделают топикстартера ;-)
31 megabax
 
01.03.15
15:39
(29) Ну дык в качестве отдельной программки может быть и .NET DDL-ка, которая регистрируется в оболочке.
32 Супер король
 
01.03.15
16:31
(0) Вот шахматы на JavaScript без всякого ООП. Код занимает всего 1 килобайт.
33 Супер король
 
01.03.15
16:31
34 megabax
 
01.03.15
16:41
(33) Да, только они что то не работают.
35 Супер король
 
01.03.15
16:45
(33) у меня работают. Нужно не двигать пешки, а кликать
36 vde69
 
01.03.15
17:10
http://infostart.ru/public/18951/

я думаю класс должен называтся "позиция" и у каждого хода ссылка на следующий класс... только это ресурсо емко будет...
37 vde69
 
01.03.15
17:15
(36)+ я объясню мысль, дело в том, что некоторые ходы возможны при определенных условиях прошлого. Например взятие на проходе, или рокировка. По этому к "Позиция" должны идти еще влаги "чей ход", "король двигался" и т.д. а так-же тройное повторение позиции....
38 Lama12
 
02.03.15
10:20
(37) Еще правило 50 хода :)
39 vhl
 
02.03.15
16:41
(0) А зачем тебе вообще юниты? Только цвет хранить?
40 vhl
 
02.03.15
16:41
public static int size = 30;  у юнита. Это чего такое? У фигур что, есть какой-то размер?
41 vhl
 
02.03.15
16:44
Или ты еще один адепт "ООП" всемогущего. Думал, щас сяду за ООП, так понапишу серьезных программ, а эти функциональщики только баловством у себя на русском-басике занимаются
42 Vladal
 
02.03.15
16:45
(0) Когда-то, когда деревья были большими... Был такой себе Turbo Pascal и к нему библиотеки Turbo Vision, которые прилагались к нему со времен 6 Турбо Паскаля.
И в примерах, демонстрирующих всю мощь ООП, в библиотеках Турбо Вижна был пример шахмат. В консоли вводил ход, и программа после раздумий также построчно в консоли выводила новое положение фигур.
43 Vladal
 
02.03.15
16:46
(12) Годно вбросил.
44 Vladal
 
02.03.15
16:47
(34) Всё работает. Притом с 2010 года
45 Aceforg
 
02.03.15
16:54
Я хочу построить небоскреб типа Бурдж-Халиф. Мне какой фундамент использовать: ленточный или на сваях? )
46 Garykom
 
гуру
02.03.15
16:58
(45) нифига нет ничего лучше монолитной плиты...тока $ хватит?
47 Aceforg
 
02.03.15
17:01
(46) А если серьезно. То на codingame.com начался новый контест с призовым 1k$
48 Aceforg
 
02.03.15
17:02
(47) *начнется
49 DJ Anthon
 
02.03.15
17:14
(38) оно слишком сложное, его проще опустить
50 Lama12
 
02.03.15
17:18
(49) Чего там сложного? Опустим варианты когда выигрыш есть точно (к тому ж эт "точно" не до конца изучено).
Остальное сводится к тому, срубили за 50 ходов хоть одну фигуру или были ли за эти же ходы хоть одно движение пешек.
51 DJ Anthon
 
02.03.15
17:20
(50) вы немного отстали от современных шахмат
52 DJ Anthon
 
02.03.15
17:21
(50) ой, прошу прощения, это я отстал, все отменили уж давно
53 Diversus
 
02.03.15
18:57
Зачем делать оболочку? Прочитай про протокол UCI и пиши только логику. Так же сможешь тестить своего бота с другими шахматными программами