|
ООП и шахматы. Как лучше сделать? | ☑ | ||
---|---|---|---|---|
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 и пиши только логику. Так же сможешь тестить своего бота с другими шахматными программами
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |