Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шахматы, Разработка программы 
:(
    Опции темы
amsoft
Дата 20.10.2009, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

Репутация: 1
Всего: 4



На мой взгляд намного удобнее реализовать поле в виде массива:

Код

  GameField: array [1..8,1..8] of TGameFieldItem;

,где   
   TGameFieldItem = record
                                 Figura: (fNull,fPeshka,...);
                                 Color: (cWhite,cBlack);
                                 end;


Начало хода обрабатываешь в событии OnMouseDown, откуда считываешь координаты курсора (можно ввести переменную типа TPoint - записываешь туда координаты выделенной ячейки) и т.д. и т.п.

Правда тут не будет никакого DragDrop'a

--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
VanHelsing
Дата 20.10.2009, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



Профиль
Группа: Участник
Сообщений: 288
Регистрация: 3.1.2008
Где: Екатеринбург

Репутация: нет
Всего: 6



amsoft можно подумать. Но на мой взгляд это сложнее реализовать и сложнее модифицировать. Еще у некоторых фигур есть дополнительные обработки кода, например обработка шаха.

Это сообщение отредактировал(а) VanHelsing - 20.10.2009, 19:55


--------------------
PM MAIL   Вверх
Beltar
Дата 21.10.2009, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 0
Всего: 7



Я пока писал тебе пред. ответы пришел к выводу, что простые цифровые коды все-таки лучше и проще, уже хотя бы при определении что за фигура, особенно с пешками, если они равны плюс\минус один изящно получается.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Hexel
Дата 21.10.2009, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 30.10.2007
Где: UA

Репутация: нет
Всего: нет



по поводу кода рисования: не обязательно рисовать сразу 2 цвета. достаточно применить FloodFill (нафлудитьsmile или Bar одним цветом, потом рисовать квадратики другого.

для зарубывания фигур примени события. то есть, когда фигура ходит (метод Move), возникает событие OnMove. его обработчик будет снимать фигуру с доски и помещать в "мертвяк". может быть, включить в базовый класс TFigure генерацию сего события. я так думаю, что это событие еще пригодится для решения исхода игры, когда какбе шах или мат
PM MAIL   Вверх
Beltar
Дата 22.10.2009, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 0
Всего: 7



С точки зрения удобства лучше всего красить поля так, как на деревянных досках, а вообще чем больше настроек, тем лучше, это и впечатление о софтине должно заметно улучшать.

Цитата

для зарубывания фигур примени события. то есть, когда фигура ходит (метод Move)


Тогда надо доску, как компонент оформлять, что впрочем я считаю оптимальным вариантом. Да и в принципе вышедшие из игры фигуры может опять же хранить доска. Здесь есть один момент, как учитывать взятые превращенные фигуры. Я бы так сделал:
Captured:array[-9..9{ну нравится мне использовать коды равные ценности фигур в пешках, жалко только, что конь и слон оба по 3 стоят}]:of Integer и при взятии, или превращении просто увеличивать соотв. индекс, если он получается больше нач. количества фигур, то рисуем максимум.

Блин, я бы сам охотно попробовал реализовать шахматы для LAN'а, но юзебельность сильно зависит от качества арта, а с этим траблы.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Hexel
Дата 22.10.2009, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 30.10.2007
Где: UA

Репутация: нет
Всего: нет



кстати, VanHelsing , раз уж речь идет об серъезной разработке с обсуждением, начинай осваивать ER-диаграммы (графическое моделлирование классов). сам использую PowerDesigner. там, как по мне, есть все, что нужно. особенно, если тебе улыбается карьера программиста smile
в PowerDesigner также есть куча других диаграмм, вообщем тебе должно понравиться  smile.
и обсуждать это все будет легче, глядя на диаграммы, и тебе сразу станет понятнее структура твоей же программы

ЗЫ: 

Цитата(Beltar @  22.10.2009,  07:35 Найти цитируемый пост)
Тогда надо доску, как компонент оформлять, что впрочем я считаю оптимальным вариантом


это то, что я не осмеливался сказать вслух smile. меня тоже какбе смущает массив объектов. хотя самое простое решение - самое лучшее. с другой стороны, никто не запрещает поместить массив в класс типа "ТДоска"
еще: это свойство-массив в public лучше вывесить как рид-онли, а перестановку фигур выполнять только из кода процедуры Move (или как она там у тебя называется)
PM MAIL   Вверх
Beltar
Дата 22.10.2009, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 0
Всего: 7



Цитата

 никто не запрещает поместить массив в класс типа "ТДоска"


Ну я выше приводил каркас такого класса, наследника TCustomControl, который сам же будет и Drag and Drop вместе с прочими мышиными событиями обрабатывать в перекрытых процедурах диспетчеризации.

Цитата

это свойство-массив в public лучше вывесить как рид-онли, а перестановку фигур выполнять только из кода процедуры Move (или как она там у тебя называется)


А произвольную расстановку как делать? Очевидно у нас д/б еще "коробка" с фигурами (возможно подойдет TDrawGrid, сам этот контрол ни разу не юзал) из которой хватаем фигуру, тащим на доску и уже в MouseUp (как я понимаю при появлении MouseDown мышь перейдет в монопольное использование "коробки" и MouseUp возникнет у нее же) определяем где юзер ее отпустил, а там присваиваем полю нужную фигуру, ес-но в этом случае никаких проверок корректности позиции происходить не должно. Хотя вопрос, как у автора со временем все это делать.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
VanHelsing
Дата 22.10.2009, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



Профиль
Группа: Участник
Сообщений: 288
Регистрация: 3.1.2008
Где: Екатеринбург

Репутация: нет
Всего: 6



Цитата

Ну я выше приводил каркас такого класса, наследника TCustomControl, который сам же будет и Drag and Drop вместе с прочими мышиными событиями обрабатывать в перекрытых процедурах диспетчеризации.

Beltar если я правильно понял, то при таком варианте фигуры придется рисовать на этом компоненте?
Цитата

А произвольную расстановку как делать? 

Я задавался этим вопросом, но пока отложил, самое главное это понять какой вариант более правильный и оптимальный и позволяет расширять приложение.

Это сообщение отредактировал(а) VanHelsing - 22.10.2009, 19:31


--------------------
PM MAIL   Вверх
Beltar
Дата 22.10.2009, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 0
Всего: 7



Цитата

 если я правильно понял, то при таком варианте фигуры придется рисовать на этом компоненте?


Ну да, в простейшем случае рисуешь доску, потом на ней фигуры. Плюс тут в том, что может батонов и побольше потоптать придется, но весь код разделится на 2 части более понятные, чем вся каша, которая неизбежно получится в файле главной формы размеров в 3000 строк.

Практически я бы разбил задачу на следующие этапы:
1) Отрисовка пустой доски.
2) Отрисовка фигур, так что ты сможешь написать что-то вроде Board.Fields[1,1]:=BKnight; и на поле a1 у тебя появится черный конь. Считай режим произвольной расстановки и прокрутки партии готов, на первое время с доской можно даже простейшее контекстное меню в котором будешь выбирать фигуру связать, и он тебе еще ОЧЕНЬ понадобиться при тестировании.
3) Можно заняться ходами. В принципе мат или пат предполагают, что ходов согласно правилам нет, так что возможно, имеет смысл строить массив, всех возможных перемещений (это примерно 30-40, т. е. задаешь размер, например, в 128 и не паришься) проверяя после каких из них противник может взять короля и их не включать.
4) Реализовать собственно ходы, на таскание пока забить, хватит и выделения щелчком мыши.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
VanHelsing
Дата 26.10.2009, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



Профиль
Группа: Участник
Сообщений: 288
Регистрация: 3.1.2008
Где: Екатеринбург

Репутация: нет
Всего: 6



При реализации столкнулся еще с одной проблемой: это проверка того, что на пути моей фигуры нет другой. То есть, чтобы одна фигура не могла перепрыгнуть другую (ну конечно за исключением коня). Вот такая проблема. 


--------------------
PM MAIL   Вверх
Hexel
Дата 26.10.2009, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 30.10.2007
Где: UA

Репутация: нет
Всего: нет



Значится, какие еще мысли пришли в голову
TTable сделать потомком PaintBox - хорошая идея, там будет удобно обращаться к таким вещам, как Canvas  и выполнять перерисовку OnPaint.
Доступ к массиву обеспечить через Property Figures(i, j): TFigure. Это позволит при присваивании "по горячему" перерисовать новую фигуру, зная, что она изменила положение (и до присваивания массиву ты можешь найти ее на доске и стереть на прежнем месте). Здесь же можно обрабатывать событие Capture (захват фигуры). То есть, когда присваиваем ячейке фигуру другого цвета, чем того, который уже здесь есть, происходит захват. Более того, нельзя захватывать короля.
В этот же класс включить процедуру Drag, которая будет отрисовывать временное положение фигуры при таскании ее мышью (OnMouseDouwn, OnMouseMove, OnMouseUp). В таком случае процедура Move в суперклассе TFigure не нужна (можно объявить как абстракную), а определять ее уже у потомков.
Для начальной расстановки просто напиши процедуру InitTable, которая просто очистит доску и присвоит массиву нужные фигуры.
То есть получается такой себе компонент) Добавь в него свойство "мертвяк" CapturedFigures(Side: Integer - игрок): array of TFigure и новое событие OnCapture, чтобы при появлении новых фигур в мертвяке обновлять внешние компоненты, которые этот список выводят.
Кстати, умные игры в шахматы хранят историю ходов (ее можно сохранять в обработке свойства Figures(i, j): TFigure).

TFigure лучше наследовать от TObject, добавив свойство Image типа TBitmap. Это выгоднее тем, что ты можешь напрямую обрабатывать OnMouseMove класса TTable (эти события не перекроются с событиями TImage, которые находятся на доске). при начале драга делаешь снимок доски в буфер TBitmap, и по мере таскания рисуешь сначала этот фон, а сверху в координатах х, у дорисовываешь Image нужной фигуры.

все ходы искать не обязательно, достаточно найти хотя бы один.

ну считай, вот тебе готовое решение) с тебя только логика)
PM MAIL   Вверх
Beltar
Дата 26.10.2009, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 0
Всего: 7



Цитата

TTable сделать потомком PaintBox


У вин-контролов вроде возможностей больше.

Цитата

То есть, чтобы одна фигура не могла перепрыгнуть другую (ну конечно за исключением коня). Вот такая проблема. 


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

Цитата

эти события не перекроются с событиями TImage, которые находятся на доске


А зачем двигать по доске TImage когда его можно просто скопировать на канвас?

Цитата

Кстати, умные игры в шахматы хранят историю ходов (ее можно сохранять в обработке свойства Figures(i, j): TFigure).


А вот это как раз стоит отдельно от доски делать. По сути можно управлять уже списком ходов, а для доски команда отката, например, будет выглядеть как переместить фигуру с одного поля на другое без проверок, если нужно восстановить сбитую.

Это сообщение отредактировал(а) Beltar - 26.10.2009, 21:00


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
VanHelsing
Дата 11.11.2009, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



Профиль
Группа: Участник
Сообщений: 288
Регистрация: 3.1.2008
Где: Екатеринбург

Репутация: нет
Всего: 6



Beltar, Hexel спасибо за предложения.
Вот все таки решил задуматься на логикой. Наверное лучше будет если доска будет представлена матрицей 8х8. Каждой фигуре будет соответствовать определенное числовое значение (возможно воспользуюсь предложение от -9..9).
Проблема в другом. Если мы смотрим на доску, то левый нижний угол имеет координаты [1, 1], а матрице он имеет координаты [8, 1]. Наверное все просто, но я не понимаю как мне это соединить между собой.


--------------------
PM MAIL   Вверх
Beltar
Дата 12.11.2009, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 0
Всего: 7



Проблема на самом деле не в этом (Какая разница как ты представляешь себе массив, с [1,1] внизу, или, что более привычно вверху? Он просто в твоем воображении зеркально отразится.), а в том, что, экранные координаты считаются от левого верхнего угла и при нормальном положении доски (белые внизу) Y-координата поля a1 больше таковой у a8, впрочем по хорошему доска должна поворачиваться, т. е. нужно 2 способа рассчета Y координат. Несложно, но можно запутаться. А с X там все элементарно, как ни крути X-координаты поля [i,j] будут LeftBorder+(j-1)*FieldWidth и LeftBorder+j*FieldWidth.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
VanHelsing
Дата 12.11.2009, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ХОЧУ ВСЕ ЗНАТЬ!!!
**
Награды: 1



Профиль
Группа: Участник
Сообщений: 288
Регистрация: 3.1.2008
Где: Екатеринбург

Репутация: нет
Всего: 6



Цитата

Несложно, но можно запутаться.

Вот в этом то и проблема, тем более на мой взгляд код из=за этого будет запутанным. Хочу найти другие варианты.


--------------------
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0787 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.