Предыдущий пост Поделиться Следующий пост
(NM – 1)-нашки
lex_kravetski
После того, как разверзлись бездны «простой и понятной» реализации игры в пятнашки на неком языке для контроллеров, похожем на блок-схемы, я просто не удержался от того, чтобы проверить, какого размера будет полная (почти) реализация этой игры на каком-то нормальном языке программирования.

И таки проверил. На языке Wolfram в среде Mathematica. Естественно, по сравнению с представленным по ссылке адовым трешем на Wolfram получилось коротко и довольно понятно.

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

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

Однако я внесу в это размытое предложение коррективы, уточнив правила.

  1. Должен быть реализован случай для доски размера N на М


  2. Настройки размера доски можно прописать прямо в коде


  3. Сама игра должна быть представлена в графике и управляться кликами мышки


  4. С мега-дизайном можно не заморачиваться — любая графика, более-менее изображающая фишки с числами, сойдёт


  5. Должна диагностироваться победа, когда она наступила, и об этом должно писаться на экране


  6. Должно быть можно подвинуть сразу целый фрагмент ряда или столбца — от той фишки, по которой игрок кликнул, до пустого места


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


  8. Программа должна, блин, работать, а не быть написанной чисто «в уме»


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

Поэтому у вас есть две опции.

Первая — заскриншотить отформатированный код в среде разработки и выложить картинку. Можно опционально дать ссылку на файл с этим кодом для желающих опробовать.

Вторая (только для ЖЖ) — обернуть отформатированный код в тэг <pre>. 
Тогда это будет выглядеть, как тут показано, и все отступы сохранятся.


Нечитаемое слипшееся гуано я с большой вероятностью буду удалять.

  • 1
"Должно быть можно подвинуть сразу целый фрагмент ряда — от той фишки, по которой игрок кликнул, до пустого места" - ряда или столбца, имхо?

Узок круг этих революционеров. Страшно далеки они от народа. Но их дело - игра в бисер.

(Удалённый комментарий)
мощно, просто гольф какой-то. А что про это (https://codepen.io/anon/pen/EXLdRz?editors=1000) скажете?

НикогдаVillini не рисовал блок-схемы

Сделал на делфи7, размеры от 3 до 30.
Код большой получился 100 строк, выложил скриншотом у себя,
цифры двигаются по текстовому полю, чтобы не заморачиваться с прорисовкой,
можно двигать не цифры, а пустую ячейку.

Расстановка фишек при запуске корректная.
Если кого exe-шник интересует, скажите, где выложить)

Edited at 2017-07-05 09:49 (UTC)

Просто для интересующихся сюда скопировал.



Edited at 2017-07-05 10:49 (UTC)

Я пойду более простым путем: распаяю-таки на SCART выход со своего Квант-БК (зеленоградский спектрум-клон), оживлю его и на бейсике всех сделаю! Правда, бейсик я тот почти не знал, а что знал - забыл, но всегда смогу отмазаться: "потенциал проекта был безграничный, просто подвела аппаратная часть".

Решение на Wolfram в среде Mathematica.

До строки, начинающейся с «pos» — инициализация. Со строки «click» — интерфейс.

Между ними «движок». Проверка выигрыша вписана в «интерфейсную часть» — в конец длинного «win».

Да, вся логика возможных перемещений и их реализация содержится в шести выражениях.

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


(NM-1)-нашки.png

Edited at 2017-07-05 11:03 (UTC)

Не отсеивают некорректные расстановки?

Хм...
Почему реализации не отсеивают некорректные начальные расстановки?

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


Re: Не отсеивают некорректные расстановки?

там какая-то хитрость с четностью, у 3х3 нет проблемы с обменом двух фишек местами.

Re: Не отсеивают некорректные расстановки?

> Почему реализации не отсеивают некорректные начальные расстановки?

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

Re: Не отсеивают некорректные расстановки?

Чисто из любви к искусству:
Есть ли у Вас формула для игры с произвольным размером коробки? Я нашел только формулу (из Википедии) для игры 4х4

Re: Не отсеивают некорректные расстановки?

У меня нет. Когда-то про неё читал какие-то рассуждения, но где смотреть, не знаю.

Все побежали и я сфиддлил. https://jsfiddle.net/fyc8rhxy/22/ - правда я жабаскрипт со словарем, поэтому громоздко получилось.

Давно хотел освежить навыки в Qt. Вот что получилось:
4.png
Код довольно длинный, но на C++, наверное, и нельзя было сделать коротко. Выкладываю только реализацию игры, без интерфейса:
(смотреть код)

  • 1
?

Log in

No account? Create an account