Помощь - Поиск - Пользователи - Календарь
Полная версия: Игра "Шашки" на Delphi.
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
Diman
Здравствуйте! smile.gif

У меня имеется массив целых чисел, состоящий из: 0 - пустая клетка, 1 - чёрные, 2 - белые. Как мне осуществить передвижение шашек?

Я думаю, сделать при нажатии на шашку так, чтобы запомнились её координаты I и J. Потом при нажатии на то место, куда я хочу её переместить, I и J обменивались с конечными, и перерисовать поле. Только как это организовать - понятия не имею!

Помогите, люди добрые, советом! Может тут совсем другой алгоритм нужен? rolleyes.gif
IUnknown
Цитата
Только как это организовать - понятия не имею!
В чем конкретно проблема? Не можешь поменять местами 2 ячейки массива? Или потом перерисовать не можешь? Где сложности?

Кстати. 2 примечания:
1) надо для начала проверять, разрешен ли ход из ячейки №1 в ячейку №2 (и первая и вторая точки находятся в пределах доски + вторая ячейка пустая + выполняется условие Abs(cellXst - cellXfn) = Abs(cellYst - cellYfn)), ну, и по пути нет своих шашек...
2) не надо после передвижения шашки перерисовывать всю доску. Достаточно перерисовать начальную/конечную клетки, или только путь от начальной к конечной (на тот случай, если были "сбитые" чужие шашки - их надо убрать с доски)
TarasBer
> 1) надо для начала проверять, разрешен ли ход из ячейки №1 в ячейку №2

Это чуть сложнее.
Потому что надо проверять, нет ли необходимости бить, и если есть, то искать максимум. То есть искать траекторию максимального взятия, и чтобы она не трогала одну шашку дважды.

> У меня имеется массив целых чисел, состоящий из: 0 - пустая клетка, 1 - чёрные, 2 - белые. Как мне осуществить передвижение шашек?

В новое место прописать значение старого, в старое - прописать ноль.

Вообще у меня есть реализация шашек, мой тупой бот, скотина, дерёт меня на сложном уровне 4:1.
Правда, она написана в стиле "моноблок", так как программа маленькая, и из-за этого моноблока читать очень тяжело.

Ссылка вот (с исходниками):
http://tarasber.narod.ru/Draughts.rar
Diman
Спасибо за помощь! Я просто не по зубам игру взял себе. У меня возникла задача написать логическую игровую программу. Времени меньше месяца осталось. Я вот до сих пор ломаю голову, что бы попробовать сделать. С шашками проблем будет много, особенно для меня. Может посоветуете, чё-нибудь не сильно замороченное, но в то же время и не сильно простое? Делфи изучаю с Нового года. wacko.gif
TarasBer
Ну я что-то такое как-то написал: есть поле 8х8, двое по очереди ставят фишки на него. Потом по очереди снимают. При этом, когда ты снимаешь свою фишку, все соседние вражеские дохнут.

(есть другой вариант - когда снимаешь свою, соседние свои дохнут, соседние вражеские становятся своими).

Алгоритм для бота тупой (но почему-то получается очень сильный) - тупо искать клетку, у которой максимум вражеских соседей.
Lapp
Я так и не понял все же - нужна играющая программа или просто интерфейс (доска)?
Гость
Цитата(Lapp @ 10.05.2011 10:27) *

Я так и не понял все же - нужна играющая программа или просто интерфейс (доска)?

Нужна игровая программа. Игра в общем, но только логическая.
Lapp
Цитата(Гость @ 10.05.2011 14:41) *
Нужна игровая программа. Игра в общем, но только логическая.

Гость, нехорошо уходить от ответа. Я спросил тебя, нужна ли играющая программа, а ты мне мозги пудришь про игровую. Это мексиканскому тушкану понятно, что шашки (или любая другая игра) - это игровая программа. Но игровая программа может либо просто делать доску на экране (чтоб два человека играли, за одним компом или по сети), либо САМА ИГРАТЬ за второго человека. Вот в последнем случае она ИГРАЮЩАЯ. Усек разницу?

Ты пойми, когда ты создаешь тему и спрашиваешь, как передвинуть шашку на доске - никому не ясно, какова твоя конечная цель. И твои скользкие уходы от ответов не привносят ясности.

Создание программы для поддержки игрового интерфейса (чтоб два человека играли) - это и сама по себе не такая простая задача с программерской точки зрения (особенно для начинающего). Но создание ИГРАЮЩЕЙ программы в такую игру, как шашки - это очень серьезная работа, несравнимо более сложная.

Если хочешь мой совет - не лезь сразу в дебри, делай все постепенно. Похоже, что твой уровень не очень высок. Так вот, сделай совсем простую игру - например, спички (лежат 12 спичек, берут по очереди не больше 3, берущий последнюю проигрывает). Тут и интерфейс несложный, и алгоритм игры тоже. Только не говори, что тут вообще делать нечего, пока не попробуешь..

Даже если ты скажешь, что это слишком просто для твоей курсовой (или что у тебя там), это не будет пустоц потерей времени. Просто - хорошо, сделай за два дня! Но после этих двух дней у тебя будет значительно более высокий потенциал для решения более сложной задачи.
Успехов тебе.
TarasBer
> Но создание ИГРАЮЩЕЙ программы в такую игру, как шашки - это очень серьезная работа, несравнимо более сложная.

А нифига.

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

А вот в крестиках-ноликах сложнее, там дерево сильно ветвится, надо как-то отсекать ненужные ветки, да и функция оценки там непонятная.
Lapp
Цитата(TarasBer @ 11.05.2011 13:17) *
Если есть функция, возвращающая множество допустимых ходов, и функция, возвращающая цену позиции, и дерево не очень ветвистое, то тупой перебор 500 позиций уже может изрядно напрячь человека (играющего против такой программы), при этом его написание не требует особых умений.
Ага, поэтому нормальные люди и играют в стоклеточные шашки..

Цитата
В общем, сам попробуй с моей программкой потягаться, скажешь потом статистику.
Да я не показатель, я не играю в шашки.. Охотно верю, что ТЫ написал вполне сносную играющую прогу.
Дело не в этом. Я пытаюсь объяснить человеку разницу между интерфейсом и игровой программой. Очень похоже, что он ее не понимает (если он видит главную сложность в том, как передвинуть шашку). Так что не вижу тут предмета для споров на эту тему. Автор просит помощи - я вижу один нормальный способ: пусть сделает для начала что-то простое. Понимаешь? сделает.
TarasBer
> Ага, поэтому нормальные люди и играют в стоклеточные шашки..

И такой вариант в моей программе предусмотрен. Если бы ты её посмотрел, не стал бы этого предъявлять. И поддавки там есть.

> Я пытаюсь объяснить человеку разницу между интерфейсом и игровой программой.

Разница не так и велика, на самом деле, если конечно интерфейс нормальный, а не как белорусский вирус из анекдота.

"Здравствуйте, я Белорусский вирус.
По причине ужасной бедности моего создателя и низкого уровня развития технологий в нашей стране я не способен причинить какой-либо вред Вашему компьютеру. Поэтому очень прошу Вас, пожалуйста, сами сотрите какой-нибудь важный для Вас файл, а потом разошлите меня по почте другим адресатам. Заранее благодарю за понимание и сотрудничество."

То есть не "закрасьте пеинтом клетку, где вы были, и нарисуйте шашку в новом месте, просьба не мухлевать", а с проверкой корректности итд.

> если он видит главную сложность в том, как передвинуть шашку

...то он не сдаст курсовую
Lapp
Цитата(TarasBer @ 11.05.2011 15:29) *
И такой вариант в моей программе предусмотрен. Если бы ты её посмотрел, не стал бы этого предъявлять. И поддавки там есть.
Да я не предъявлял. Я просто хотел сказать, что ветвление в 100-клеточных шашках будет намного больше. Но теперь я вижу, что это не помеха.. smile.gif

Я уже говорил, что в шашки играть не умею (знание правил не является умением)). Но все равно было забавно - твоя прога просто не оставляет ни одного шанса )). А ты сам хорошо играешь? или - пробовал ее дать поиграть хорошему игроку? Я понимаю, конечно, что шашки - это не шахматы, где преимущество компьютеров обнаружилось не так давно. Но я не ожидал, что все НАСТОЛЬКО просто.. Ходы на высшем уровне сложности следуют практически мгновенно, загрузка проца почти незаметна. Мои поздравления! good.gif

Цитата
Разница не так и велика, на самом деле, если конечно интерфейс нормальный, а не как белорусский вирус из анекдота. ...
Ну, извини, все-таки интерфейс - это всего лишь техническая сложность, а в алгоритме игры совсем другие проблемы.. Не зря же есть раздел математики, называемый Теория Игр. Я сейчас не про шашки, а вообще. (Этот анекдот я уже про какие только страны не слышал..)

Цитата
...то он не сдаст курсовую
Мне глубоко фиолетово на его курсовую, мне (как всегда тут) хочется человека чему-то научить. Потому и предлагаю начать с простого. В итоге продвижение получится более быстрое за счет неотвлечения на проблемы с примитивными действиями.
TarasBer
> А ты сам хорошо играешь?

Во 2 классе получил 4 разряд в шашечном кружке, и всё. Ну пару комбинаций могу построить. Правда, против компьютера это бесполезно, его на невнимательности не проведёшь. Он только в конце, когда много дамок, становится глупее, так как число ходов для перебора не менется, а дерево ветвится сильнее, соответственно, глубина перебора резко падает.

> или - пробовал ее дать поиграть хорошему игроку?

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

> Ходы на высшем уровне сложности следуют практически мгновенно, загрузка проца почти незаметна.

Ну вот, а я на своём селероне-600 аж 2 секунды ждать вынужден. Ну и плюс я по просьбам сделал задержку 300 миллисекунд перед каждым ходом компа, чтобы видно было, например, когда он 5 подряд жрёт.

> Ну, извини, все-таки интерфейс - это всего лишь техническая сложность, а в алгоритме игры совсем другие проблемы.. Не зря же есть раздел математики, называемый Теория Игр. Я сейчас не про шашки, а вообще.

В общем случае - да. Но для игры в спички или для игры, что я предложил в 5 сообщении, опять же, написание противника не составляет никакой сложности.

> Потому и предлагаю начать с простого.

Ну спички я на 3й день изучения написал. При том, что изучал с абсолютного нуля.
Так что тут есть шанс, но в качестве курсовой такое не прокатит.
А вот с убиранием фишек - уже поинтереснее.
Lapp
Цитата(TarasBer @ 12.05.2011 11:01) *
Ну вот, а я на своём селероне-600 аж 2 секунды ждать вынужден. Ну и плюс я по просьбам сделал задержку 300 миллисекунд перед каждым ходом компа, чтобы видно было, например, когда он 5 подряд жрёт.
Да, ходы действительно иногда просто незаметны. Сделал бы ты анимацию, что ли.. И протокол тоже не помешал бы. А правило "тронул-ходи" лучше убрать.. ))

Цитата
Так что тут есть шанс, но в качестве курсовой такое не прокатит.
А вот с убиранием фишек - уже поинтереснее.
Я же сказал - на спички 2 дня. А потом - вдвое быстрее другую задачу. Например, твое это убирание фишек.
Но я не настаиваю. Да и автор темы уже смылся, похоже.. Кстати, я глянул две другие его темы - ни в одной он не утрудил себя ответом norespect.gif. Не люблю говорить в пустоту.
TarasBer
> Сделал бы ты анимацию, что ли..

Это намного сложнее.
У меня же тупо несколько готовых картинок размером в 2 клетки (на которой стоит фигура и пустое поле сверху от неё, за счёт этого рисуются дамки, вылезающие за верхний край), выводятся тупо через BitBlt.

> А правило "тронул-ходи" лучше убрать.. ))

Это намного сложнее, как ни странно. Исходный код не очень затачивался под возможность что-то менять, можешь сам глянуть в исходники.

> И протокол тоже не помешал бы.

Да я много чего думал, включая даже самопополняющуюся базу данных выигрышных и проигрышных позиций (типа самообучение, круто же). Но это не укладывалось в концепцию "от нечего делать быстро написать что-то на 35кб, чтобы было вместо пасьянса".
Lapp
Цитата(TarasBer @ 13.05.2011 12:31) *
Это намного сложнее.
...
Это намного сложнее, как ни странно.
...
Да я много чего думал, включая даже самопополняющуюся базу данных выигрышных и проигрышных позиций (типа самообучение, круто же). Но это не укладывалось в концепцию "от нечего делать быстро написать что-то на 35кб, чтобы было вместо пасьянса".
smile.gif)) Я не стану возражать, что самообучение - это непросто (хоть и круто)). Но нельзя же ставить его на одну доску с возможностью клика по другой шашке..

Вот, кстати, что реально неплохо б: выставлять начальную позицию вручную. Но, согласен, это действительно потребует некоторох затрат времени..
TarasBer
> Вот, кстати, что реально неплохо б: выставлять начальную позицию вручную.

А этого не хватает?
Нажмите для просмотра прикрепленного файла

> Но нельзя же ставить его на одну доску с возможностью клика по другой шашке..

Я понимаю, потому и как бы иронизирую.
> Это намного сложнее, как ни странно

Добавлено через 2 мин.
(на скрине шашки крупные, потому что после того, как я купил нормальный монитор (17'', 1280x1024) вместо нетбукового 10.5'' 1024х600, я пересобрал игру с константой IconSize = 50)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.