|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
||
Предпросчет возможных ходов в игре Nine Men's Morris (Мельница)23.12.2019, 08:46. Показов 4295. Ответов 33
Метки нет (Все метки)
Идея так себе, но неполный поиск в ширину даже на два хода тоже не сильно доставляет. Да и точность у него хромает. Пока склоняюсь к мысли просчета начальной стадии - выставления фишек. Дальше придется все же писать обход.
0
|
||
| 23.12.2019, 08:46 | |
|
Ответы с готовыми решениями:
33
Программа для вывода возможных ходов коня по клику на клетку шахматной доски Генерация ходов в настольной игре |
|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
||||||||
| 26.12.2019, 10:42 [ТС] | ||||||||
|
Sun Serega,
Добавлено через 2 минуты Добавлено через 4 минуты И как можно красиво хранить значение из 5 байт информации? Ссылочные типы здесь не проходят.
0
|
||||||||
|
2357 / 1460 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
|
|||||||
| 27.12.2019, 01:04 | |||||||
|
И, что важнее, из за того что статичный массив это класс - BlockFileOf<T> сохранит в файл ссылку на этот массив, вместо содержимого (это из за алгоритма сохранения в файл, без него - будет так же медленно как и у file of T).Ну, а окошко которое вам выскакивает - это просто защита от дурака, чтоб классы и указатели и не пытались сохранить в типизированный файл, ничего хорошего из этого получиться не может.
Подробнее про отступы и [StructLayout(LayoutKind.Sequential)]:Процессору удобно читать память из оперативки - "словами". Для 32-битного процессора - слово это 32 бита, а для 64-битного - 64 бита. При чём, читать им удобно не из любой рандомной точки. Вся оперативная память разбита на эти слова, если читать int64 из pointer(80) - читает байты #80-#87 (всего 8 байт) как 1 слово. Но если читать из pointer(81) - процессору приходится читать байты #80-#87 и ещё #88-#85, потому что мимо слов нельзя. Ну и потом побитовыми сдвигами и т.п. резать эти слова чтоб получить отдельно те 8 байт из 16 прочитанных. (это всё пример, офигеть какой упрощённый. К примеру байты в районе pointer(80) вообще зарезервированы системой) Если читать число, размером меньше слова - читает всё равно 1 слово и потом режет, но это не проблема. Но если в записи находится 1 поле типа byte, а затем 1 поле типа int64 - получается int64 будет хранится мимо слова. Вот чтоб такого не было - обычно JIT компилятор смотрит на битность процессора на котором запустили .exe и вставляет нужный отступ между byte и int64. То есть 3 или 7 байт, которые вообще ничем никогда не заполняются и служат только чтоб процессору было удобнее читать. Но, кстати, в типизированный файл - эти пустые байты отступа тоже запишет, потому что BlockFileOf<T> копирует память целиком, 1 блоком, как она хранилась в оперативной памяти (отсюда название).Вообще, раз объём памяти в этом случае проблема - тот атрибут, убирающий отступы можно вставить во все записи. Но это, разумеется, ударит по производительности работы с этими данными.
2
|
|||||||
|
Alvin Seville
|
|||
| 27.12.2019, 13:26 | |||
0
|
|||
|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
|
| 29.12.2019, 17:18 [ТС] | |
|
Есть пока сырющая версия с неполным обходом дерева решений (минимакс). Интерфейс, возможно, буду дорабатывать, также в коде много "строительных лесов" и заготовок для создания базы знаний.
По управлению, буде кто заинтересуется: Ход вводится в формате <откуда двигаем фишку?> <куда двигаем?> <кого в процессе едим?> Так, ввод "2 3 6" - ход из 2 в 3, съедается ячейка 6. Значения по умолчанию: -1 ("-1 2 -1" - ставим фишку на 2) Система управления позволяет жульничать, но всю ответственность за корректную работу в данной версии вы берете на себя. Замечания по коду (преимущественно тому, что сейчас задействован в работе) приветствуются. Во многом за этим и скидываю сюда: https://cloud.mail.ru/public/4ny2/4MbijA9MQ
0
|
|
|
2357 / 1460 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
|
||||||||||||||||
| 29.12.2019, 17:36 | ||||||||||||||||
|
Код лучше заливать куда то типа github-а. Он для этого и сделан. А ещё если залить файлы поверх того что есть - он показывает что именно изменилось (и это 1 из простейших фишек, вообще он много что умеет).
Добавлено через 13 минут По коду - из того что сразу видно: 1. Я уже говорил, статичные массивы реализованы как костыль, использующий динамичные. К примеру в GameFieldInfo.pas на строчке 8:
1) при первой же попытке запуска - вы увидите где индекс был 2. 2) можно делать как то так:
integer(team_red), то есть преобразование из boolean в integer - ничем не отличается от преобразования byte в integer, которое у вас было раньше.То есть внутреннее представление не меняется (true и byte(1) выглядят одинаково в памяти, и так же false и byte(0) ). Но размер значения увеличивается (и у byte и у boolean - размер 1 байт, а у integer - 4). Если принимать параметр как boolean - передать неправильное значение будет вообще невозможно. 2. Экономить память на стеке нет смысла, потому что размер стека задаётся при старте программы (или потока, если вы создаёте свои). Поэтому нет разницы, принимаете вы byte или integer параметром. Зато арифметика над числами меньше integer будет медленнее, потому что для операций вроде +-*/ и т.п. - числа меньше integer переводит в integer (или longword), а после операции - переводит назад. Содержимое массивов, других классов и статичных полей - хранится в куче. Но и ту память экономить - не к чему. При том что даже у самых убогих компов есть хотя бы 1 гигабайт оперативки - то что тип элементов elements из п.1. это byte - будет вообще незаметно. Зато операции -= и += на них будут медленнее.
1
|
||||||||||||||||
|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
|
| 29.12.2019, 17:42 [ТС] | |
|
Sun Serega, какой-то путь вышел длинный, но попробую разобраться. Первый раз через консоль. Idea отучила совсем.
https://github.com/Ksardas178/... 1%86%D0%B0
0
|
|
|
Alvin Seville
|
||||||
| 29.12.2019, 17:49 | ||||||
|
Ksardas_178, Вы можете использовать директивы
1
|
||||||
|
2357 / 1460 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
|
||||||||||||||||||||||
| 29.12.2019, 18:58 | ||||||||||||||||||||||
Добавлено через 31 минуту В остальном просмотрел - код в целом неплохой. И явно лучше чем я ожидал, всё красиво разложено по полочкам и модулям. Некоторые вещи применены не к месту, но чтоб это понять - нужен только опыт (и желание разобраться как правильно использовать на себя принципы ООП). Из мелочей: 1. В некоторых местах (как GameBorders.pas) у вас модификаторы доступа только у половины имён. Не хорошо так. 2. GameMill.pas - если уже используете список, задавайте ему в конструкторе размер 3. А вообще раз размер не меняется - лучше использовать массив. 3. В основном файле у вас есть:
Ну а ещё, из древних потерянных техник комментирования:
А если сделать так:
(*) - раскомментирует области 1 и 3 и одновременно закомментирует область 2.
1
|
||||||||||||||||||||||
|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
||||||
| 29.12.2019, 19:24 [ТС] | ||||||
|
Не совсем понял, как пользоваться регионами. После добавления
0
|
||||||
|
Alvin Seville
|
|
| 29.12.2019, 19:55 | |
|
Ksardas_178, должна. Сбоку слева появляется кнопка для сворачивания и разворачивания региона.
0
|
|
|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
||
| 29.12.2019, 20:31 [ТС] | ||
|
0
|
||
|
2357 / 1460 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
|
||
| 30.12.2019, 13:40 | ||
1
|
||
|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
||
| 30.12.2019, 14:17 [ТС] | ||
|
Добавлено через 10 минут Все, разобрался, цикл не нужен
0
|
||
|
2357 / 1460 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
|
|
| 30.12.2019, 15:32 | |
|
Да, цикл не нужен потому что 1 shl N это то же самое что Power(2, N), только для integer.
Ну а 256 это уже 2**8, то есть 256**(bytes-1) = (2**8)**(bytes-1) = 2 ** (8*(bytes-1)) = 1 shl (8*bytes-8). Добавлено через 24 минуты Но вообще стоит ещё упомянуть что у integer всего 32 бита, а значит формула 1 shl (8*bytes-8) будет работать только для bytes=1..4Если надо больше (1..8) - пишите int64(1) shl (8*bytes-8). Ну и ответ будет в виде int64.
0
|
|
| 30.12.2019, 15:32 | |
|
Как сделать систему ходов в карточной игре? Алгоритм для просчета допустимых ходов в игре нарды. Найти объем информации после 11 сделанных ходов в игре
Алгоритм получения всех вариантов ходов бота в карточной игре 101 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|