![]() |
![]() ![]() |
![]() |
Sybreed |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 3 Пол: Мужской Репутация: ![]() ![]() ![]() |
Зацените игрушку. Писал давно, ради интереса. AI не очень сильный, но меня порой обыгрывает :) управлять можно как мышкой так и клавиатурой. В исходнике много комментариев (даже наверное чересчур), зато нетрудно понять как она работает.
Прикрепленные файлы ![]() |
Lapp |
![]()
Сообщение
#2
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Зацените игрушку. Писал давно, ради интереса. AI не очень сильный, но меня порой обыгрывает ![]() Заценил. ![]() ![]() С удовольствием сбацал аж три партии )). Сразу скажу: в шахматы я играю так себе, практики почти никакой, и никогда целенаправленно не занимался ими. Так что я не показатель, в общем-то )). Хочу поделиться впечатлениями (чисто игровыми, не программерскими)). К первой партии я отнесся несерьезно, и она меня сделала ![]() Во второй партии я собрался с самого начала. Выяснилось, что она ходит точно так же, так что я просто исправил главную ошибку первой партии - и дальше она стала разваливаться, как карточный домик.. Было даже странно - думал, что-то упускаю, и до конца сидел в напряжении. После выигрыша вытер пот со лба )). Тогда я залез в код и исправил глубину просмотра с 4 на 6. Но.. она задумалась, и после 2 минут я понял, что не выдержу этого на протяжении всей партии. Тогда я задал глубину простмотра равной 5. Теперь на каждый ход стало уходить 12-15 секунд, что вполне приемлемо. И вот тут меня ждал сюрприз.. Я не заметил никакого улучшения!! Без труда выиграл пару фигур и завершил партию совершенно спокойно. Что мне показалось особенно странным (как при 4, так и при 5) - она очень слабо развивалась. Сразу выводила ферзя и дальше рулила в основном им. А фланги были заперты, в конце у нее уже не было времени их открывать. Почему так? Вот. А что касается кода, я его пока пристально не разглядывал. Сразу бросаются в глаза некоторые недостатки стиля, но это все же не самое главное. Графику можно было бы заметно (то есть в сотни раз как минимум) ускорить. И, скажем, не перерисовывать при попытке хода за край доски (пустяк, но сильно портит картину). Я понимаю, что главное не в этом )). Фигуры прорисованы с чувством, это приятно ![]() Компилировал я FPC, все прошло на ура - с опцией совместимости с TP и одной исправленной ошибкой (отсутствует закрывающая скобка комментария в строке 72). Кроме того, конечно, я заменил CRT на WinCRT. Мышь, конечно, не работает, но клавиши действуют. Комп у меня тут на Phenom II x4 с частотой 2.8. Ядро работает, понятно, только одно. Нужно переносить на нормальный компилятор и использовать многопоточность. Короче, Sybreed - очень приятно видеть такую прогу тут, на форуме! Спасибо (+1). Если ты не против, можем обсудить код. Да и вообще: добро пожаловать на Форум! ![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Lapp |
![]()
Сообщение
#3
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Кажется, я понял, почему замена 4 на 5 не принесла улучшения.. Поскольку это полуходы (то есть ходы только одной стороны, то убеличивать нужно только на два - то есть, чтоб число оставалось четным. Так? ))
Далее, мне показался не очень убедительным аргумент в комментравиях: Цитата {если максимальная оценка хода для игрока А (альфа) превысила Я закомментировал вторую часть условия в идущим за ним операторе if:максимальную нценку для игрока Б (бета), которая была получена на предыдущем ходе, то мы может досрочно прекратить перебор и вернуть альфа в качестве результата, т.к. уровнем выше мы все равно выберем ход с максимальной оценкой (альфа) и поднимать ее еще выше не имеет смысла. Если мы продолжим перебор то альфа будет только увеличиваться} while (a<>list.c+1) {and (alpha<beta)} do После этого думать она стала, вроде, подольше, но играть стала (тоже вроде) получше - кажется? Пока еще не собрался поглубже посмотреть код. Но, надеюсь, скоро соберусь (если кто-нибудь не сделает этого раньше)) ... Немного посмотрел.. Задача разбивается на четыре. 1. Алгоритм подсчета целевой функции. Он занимает не очень много места - процедуры evaluate и search, а также константы (вес). Если его оптимизировать, можно будет увеличить глубину до 6. 2. Определение корректности хода. Эта часть приличная по объему. Логику надо улучшить.. 3. Графика. Мммм.. Ну просто руки чешутся все переделать )). 4. Управление (клава и мышь). Тоже нужно поменять организацию, даже если оставаться в рамках DOS. Конечно, желательно было бы всю прогу так и организовать - по этим разделам.. Попробовал внести некоторые изменения в отрисовку - чуть голову не сломал.. Но работает, и это плюс! )) Надо было сделать паттерны для всего, включая пустые клетки и фигуры на подсвеченных полях. Памяти же не жалко )). Было бы значительно лучше со всех точек зрения. Ну что, продолжать? ![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
Sybreed |
![]()
Сообщение
#4
|
Группа: Пользователи Сообщений: 3 Пол: Мужской Репутация: ![]() ![]() ![]() |
мм... ну отрисовку я улучшил как мог, сначала пытался рисовать фигуры линиями и затем заливать их цветом, но это оказалось настолько медленно, что я решил использовать битмапы. в начале загрузки можно заметить как фигуры моргают одна за другой, отрисовываясь для запоминания в памяти, а затем уже появляется доска. если есть идеи как сделать отрисовку еще быстрее, то мне будет любопытно узнать
![]() клавиатура и мышь и так прекрасно работают, что там оптимизировать? Что касается функции, которая проверяет корректность хода, в ней действительно куча лишних условий. я там вообще не использовал скобок. в ней для каждой фигуры написано по одному большому условию, и если использовать скобки, то работать она будет быстрее, но принцип работы станет совершенно непонятен. игрушку я периодически дорабатываю, поэтому не спешу приводить функцию к законченному виду. |
Lapp |
![]()
Сообщение
#5
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
мм... ну отрисовку я улучшил как мог, сначала пытался рисовать фигуры линиями и затем заливать их цветом, но это оказалось настолько медленно, что я решил использовать битмапы. в начале загрузки можно заметить как фигуры моргают одна за другой, отрисовываясь для запоминания в памяти, а затем уже появляется доска. если есть идеи как сделать отрисовку еще быстрее, то мне будет любопытно узнать Идея все та же: паттерны (или битмапы, как ты их зовешь, хотя это не совсем правильно). Только нужно сделать ВСЕ паттерны. То есть все фигуры на всех фонах. А дальше - только плеваться ими. Речь тут о правильной организации. Ты прошел только полпути, поскольку выбрал неверный способ организации. Если хочешь, можно обсудить.![]() Цитата клавиатура и мышь и так прекрасно работают, что там оптимизировать? Из того, что паровоз едет, нельзя делать вывод, что в нем нечего оптимизировать.. )) Там у тебя конь не валялся. Нужно разделить логику программы и клавиши. Я поковырялся там немного, чтобы устранить некоторые огрехи - натурально взвыл (народ за соседними столиками в кафе аж головы повернул)). Например, ты селектируешь при любом нажатии (имею в виду выделение первого поля, С которого ход) - даже на пустое место и на черную фигуру. И зачем это? Я подправил, смотри код..Цитата Что касается функции, которая проверяет корректность хода, в ней действительно куча лишних условий. я там вообще не использовал скобок. в ней для каждой фигуры написано по одному большому условию, и если использовать скобки, то работать она будет быстрее, но принцип работы станет совершенно непонятен. игрушку я периодически дорабатываю, поэтому не спешу приводить функцию к законченному виду. Здесь пока ничего не буду говорить, кроме того, что там есть небольшая ошибочка. Попробуй ПЕРВЫМ ходом заставить пешку пойти вбок (вперед-влево). Да, пешки так не ходят. Но и программа не должна валиться с ошибокой при этом )). Это я тоже исправил..Короче, хотел я просто улучшить рисование. У тебя при КАЖДОМ движении курсора идет ПОЛНАЯ отрисовка доски. Зачем?? Я, конечно, хотел сделать, как надо, но потом понял, что нужно переделывать просто ВСЕ.. Поэтому, посидев часа полтора, я все же сделал, как НЕ надо. Но все же немного покрасивше )). Файл в кодировке 1251 (расширение txt): ![]() Файл в кодировке 866 (расширение pas): ![]() ![]() Исправил (между ужином и телевизором, могут быть еще ошибки). Еще пара замечаний.. Не надо делать одновременно поля записи a и переменную цикла a - это мешает использовать with. Я исправил параметры цикла на i и j - это намного естественнее. Обрати внимание на формат кода.. Это тебе сильно поможет. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
IUnknown |
![]()
Сообщение
#6
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Sybreed
Цитата клавиатура и мышь и так прекрасно работают, что там оптимизировать? Там еще до оптимизации работы полно. Начнем с того, что у тебя вообще не проверяется наличие мыши (я понимаю, что найти сейчас компьютер без мыши - невозможно, но прежде, чем работать с чем-то ты обязан убедиться в его наличии). Инициализации мыши тоже нет (и не надо опять говорить, что оно и так работает. Где-то сработает, где-то нет).Строка 1116. if not changed then ... А что, Changed где-то инициализировалась? Не вижу этого в коде. Никогда не оставляй неинициализированных переменных (то, что это и так работает - не аргумент. Это неправильно, обращаться к переменной, инициализация которой тобой произведена не была). По поводу "оптимизировать". Я бы не разделял события от клавиатуры и от мыши. То есть, разделять их, конечно, надо, но не в основной программе. Пишется отдельный модуль, который обрабатывает твои действия с клавиатурой и мышью, и возвращает, какое событие произошло, а в основной программе ты просто ждешь наступления любого события из тех, которые возвращаются модулем, и обрабатываешь его. Это упростит код. Опять же, зачем понадобилось эмулировать движение мыши по экрану, с необходимостью отрисовки ее "курсора" через putimage, если драйвер позволяет вообще не заботиться об этом, задать графический курсор любой формы и все движение будет происходить автоматически, все, что останется - "гасить" курсор перед обновлением экрана, и "зажигать" после обновления? Тут есть все, что нужно для реализации подобного поведения. Сообщение отредактировано: IUnknown - 26.08.2011 12:08 |
Lapp |
![]()
Сообщение
#7
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Никогда не оставляй неинициализированных переменных Очень верно, совершенно согласен. Сам я, правда, ничего не инициализировал ![]() ![]() IUnknown, +1 Цитата По поводу "оптимизировать". Это слово автора темы я просто повторил. Конечно, это (организация) - никак не оптимизация. ![]() -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
TarasBer |
![]()
Сообщение
#8
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
> Начнем с того, что у тебя вообще не проверяется наличие мыши (я понимаю, что найти сейчас компьютер без мыши - невозможно, но прежде, чем работать с чем-то ты обязан убедиться в его наличии). Инициализации мыши тоже нет (и не надо опять говорить, что оно и так работает. Где-то сработает, где-то нет).
А в современном мире этот совет ещё актуален? Неужели ещё есть места, где пишут под ДОС за деньги и где это всерьёз важно? (а игру дома посмотрю) -------------------- |
IUnknown |
![]()
Сообщение
#9
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата А в современном мире этот совет ещё актуален? Открою тебе тайну: в современном мире программисты на Паскале и его продолжениях (Дельфи/FPC) вообще нахрен не нужны, и давно пора перестать насиловать трупы. А если уж пишешь - так пиши, как положено. Но к тебе это, разумеется, не относится - ты ж всегда делаешь не по правилам? За что потом и огребаешь от компиляторов и от системы. Делай дальше как не надо... С тобой все ясно. |
TarasBer |
![]()
Сообщение
#10
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
> Но к тебе это, разумеется, не относится - ты ж всегда делаешь не по правилам? За что потом и огребаешь от компиляторов и от системы. Делай дальше как не надо... С тобой все ясно.
А чё ты сразу на личности переходишь? -------------------- |
TarasBer |
![]()
Сообщение
#11
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
В общем я, как и обещал, посмотрел игру дома. Круто, приколол длинный массив байт (задающий вид фигур), вполне нормальный способ на самом деле. Вот только ждать реакцию противника уж очень долго.
-------------------- |
Рамз) |
![]()
Сообщение
#12
|
Гость ![]() |
Зацените игрушку. Писал давно, ради интереса. AI не очень сильный, но меня порой обыгрывает ![]() почему то не получается скачать( |
Lilit |
![]()
Сообщение
#13
|
Гость ![]() |
у меня игра не работает....((((что делать????
|
Sybreed |
![]()
Сообщение
#14
|
Группа: Пользователи Сообщений: 3 Пол: Мужской Репутация: ![]() ![]() ![]() |
отписываюсь о некоторых ошибках, которые нашел в шахматах:
1) неправильно реализовано "правило 50 ходов". функция is_game_ended пытается находить повторяющиеся ходы в массиве sit.moves, но делает это плохо. и то и другое стоит удалить. 2) неправильная проверка на возможность рокировки. в игре проверяется: "если все клетки между ладьёй и королём (включительно) не под ударом вражеских фигур, то можно с этой ладьёй рокироваться", а надо: "если клетка короля, и еще две клетки в сторону ладьи не под ударом, то с этой ладьёй можно рокироваться". 3) когда пешка дошла до последней горизонтали, она автоматически превращается в ферзя. хотя нужно давать игроку возможность выбора фигуры. это не ошибка, а упрощение правил, чтобы игру было легче запрограммировать. |
![]() ![]() |
![]() |
Текстовая версия | 10.09.2024 20:27 |