LINUX.ORG.RU

Программа для создания кроссвордов в Lazarus

 , , , ,


0

1

Здаров!Товарищи рЫбята! Нужно раскурочить ещё один мой исходник.

Он представляет собой Клёст-кроссворд(тож программа) переписанный на Lazarus так же, не используя ничего нестандартного, во избежании плохой межплатформенной переносимости. Носит кодовое название OpenKlest.
--------------------
Смысл его заключается в создании открытого стандарта файла кроссвордов для всех компиляторов, независимо от платформы или языка.(Скажите это диагноз?! ;) )
--------------------

Версия 0.4.5 - есть функция отгадывания кроссворда в формате OpenKlest 1.0(экспортируют Клёст-кроссворд 0.2.9, 0.3.7). Пока только латиница

Описание формата OpenKlest 1.0:
Это двоичный формат файла кроссворда, разработанный так, чтобы было максимально просто сделать его поддержку в других языках программирования, отличных от C++. Он экспортируется средствами чистого C++, без расширяющих возможностей библиотеки Qt.
---
//Версия файла
cFileBegin array[14] of char := 'OpenKlest-1.0~';
//Количество строк кроссворда
lwRowCount: Longword;
//Количество столбцов кроссворда
lwColumnCount: Longword;
//Ширина(Высота) ячейки
lwRowHeight: Longword;
// Если ячейка чёрная
;(wcCell: WideChar) wcCell = 'b';
// Если ячейка белая
;(wcCell: WideChar) wcCell = 'w';
// Цикл от 0 до lwRowCount
//Вложенный цикл от 0 до lwColumnCount
wCell: Word := Word(wcCell) + 1;
//Количество слов
lwWordCount: Longword;
//Координата строки расположения слова в сетке кроссворда;
//Цикл от 0 до lwWordCount
wWordRow: Word;
//Координата столбца расположения слова в сетке кроссворда;
//Цикл от 0 до lwWordCount
wWordColumn: Word;
// Если слово вертикальное
;(wcDirection: WideChar) wcDirection = 'v';
// Если слово горизонтальное
;(wcDirection: WideChar) wcDirection = 'h';
//Направление слова в сетке кроссворда;
//Цикл от 0 до lwWordCount
wWordDirection: Word := Word(wcDirection);
//Длина слова в сетке кроссворда;
//Цикл от 0 до lwWordCount
wWordLength: Word;
//Слово
;sWord: string;
//Цикл от 0 до lwWordCount
cWord: array[Length(sWord)] of char;
//Длина вопроса;
//Цикл от 0 до lwWordCount
wQuestionLength: Word;
//Вопрос
;sQuestion: string;
//Цикл от 0 до lwWordCount
cQuestion: array[Length(sQuestion)] of char;
//Метка конца файла
cFileEnd: array[10] of char := '~OpenKlest';

А версия 1.0.0 будет разрабатываться исключительно(возможно) в ОС GNU / Linux Debian 6.0 Сьюзи ;)
Сурфорж ГПЛ2 (ЛОР ещё в этом не принимал участие)

А где тег «история испеха» «покушал-покакал» и «ыыыы»? 5 тегов - не многовато ли для поста, который выглядит как один большой нечитаемый слеш?

malbolge ★★ ()

двоичный формат
максимально просто

Ты уверен?

// Если ячейка чёрная
;(wcCell: WideChar) wcCell = 'b';
// Если ячейка белая
;(wcCell: WideChar) wcCell = 'w';

Бинарный и максимально простой, говоришь?

malbolge ★★ ()
Ответ на: комментарий от malbolge

Я не понимаю таких вопросов. На форумах в тредах люди маются с xml и строками, «\10», «\13\10», utf-8->cp1251 и обратно, поэтому да максимально просто. Раз написал - и нет проблем, сомнения???

xwicked ★★ ()
Ответ на: комментарий от xwicked

Обычно XML для обмена данных между платформами,системами и используется. И проблем вроде бы, особых нет. Да даже и неособых не заметно. Я гарантирую это в C++/FreePascal/.NET/Ruby/Erlang/Java

;sWord: string;

Паскалевская строка в бинарном формате. Ню-ню.

Зато булевое значение кодируешь двумя байтами (16 епть бит! вместо одного!):

;(wcDirection: WideChar) wcDirection = 'v';

После такого фраза «люди маются» звучит по меньшей мере странно, т.к. твой «формат» тому способствует гораздо в большей степени. нежели банальный текстовый формат типа XML/JSON/YAML/INI...

malbolge ★★ ()

К слову...

Посмотрел твой код.

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

var
    FormOpenKlest: TFormOpenKlest;//Форма главного окна программы
    sNameCrossword: String;//Название текущего кроссворда
    slWordR,//Список координат первых букв слов(строки)
    slWordC,//Список координат первых букв слов(столбцы)
    slWordV,//Список направлений слов
    slWordL,//Список длин слов
    ListWord,//Список слов
    slQuestionT,//Список вопросов
    ListCurrentWord: TStringList;//Список введённых текущих слов
    wsQuestionL: WideString;//Список длин вопросов
    imgCell: array [0..500] of TImage;//Графический объект ячейки
    bmCell: TBitMap;//Цветная ячейка
    RowFirstCellWord,//Координата строки текущего слова в сетке кроссворда
    ColumnFirstCellWord,//Координата столбца текущего слова в сетке кроссворда
    LengthWord,//Длина текущего слова
    LastRFCW,//Прошлая координата строки слова в сетке кроссворда
    LastCFCW,//Прошлая координата столбца слова в сетке кроссворда
    LastLW : Integer;//Последнее значение длины слова
    gWordLine,//Направление текущего слова в сетке кроссворда
    LastGWL: WideChar;//Прошлое направление слова в сетке кроссворда
    CellState: array of array of TCellState;
    CountCellInWord: Word;
    SelectedWordToEdit: String;
Ну еще непонмтное «LastCFCW» - от прочтет твой код испанец, в какое место он замыслит засунуть тебе урановый лом? Ну еще ярое формашлепство...

Код делает не то, что должен:

//Открытие кроссворда, загрузка данных в память
procedure TFormOpenKlest.actionOpenClick(Sender: TObject);
...
// И, внезапно
GridOpenKlest.FixedCols := 0;//Обнуление числа фиксированных колонок
GridOpenKlest.FixedRows := 0;//Обнуление числа фиксированных строк

Я могу совать разный мусор вместо файла.

FileRead(handleFile, tar^, 14);//Чтение начала файла('OpenKlest-1.0~')
// Бля, а где хоть одна проверка?!?!
FileRead(handleFile, lwCell, 4);//Чтение количества строк сетки кроссворда

Ну и под конец, немного магии:

Caption := 'OpenKlest 0.4.5';//Заголовок окна
FileRead(handleFile, lwCell, 4);
Caption := 'OpenKlest 0.4.5. ' + extractFileNameOnly(sNameCrossword);//Изменение заголовка окна
GetMem(tar, 14);
for i := 0 to 500 do imgCell[i].Free;

PS

  CountCellInWord := 0;
  SelectedWordToEdit := '';
  LengthWord := 0;
Переменные в паскале инициализируются нулями, нолями, и пустыми строками.

--- Воспринимай это как code-review, Малыш...

malbolge ★★ ()

В общем автор не знает базовых вещей по части читаемого кода. Можно посоветовать Мак-Коннела почитать, например. А рвение - это хорошо в любом случае.

anonymous ()
Ответ на: К слову... от malbolge

Пока функционал не усложнился, наличествуют глобальные переменные.

ColumnFirstCellWord,//Координата столбца текущего слова в сетке кроссворда
...
LastCFCW,//Прошлая координата столбца слова в сетке кроссворда

какой-то мультик

Птица говорун отличается умом и сообразительностью

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

xwicked ★★ ()
Ответ на: комментарий от malbolge

Если строка в бинарнике смущает, то как его назвать, mix'овый формат?
Звучит круто, но не отражает сути объективной действительности.
Два байта для читабельности кода ;)
Не ну, если одна кодировка и используется готовый XML-движок, то XML - это не идеал, а просто толстый вариант, а мне важен тоже (пусть и не отличный) но, более быстрый вариант ;)

xwicked ★★ ()
Ответ на: комментарий от xwicked

xwicked

мне важен тоже (пусть и не отличный) но, более быстрый вариант

на сколько кило(мега/гига)кроссвордов в секунду ориентируешься?

unC0Rr ★★★★★ ()
Ответ на: комментарий от unC0Rr

И не забудь про endianess своих бинарных данных

unC0Rr ★★★★★ ()
Ответ на: комментарий от unC0Rr

В этом и фишка, я видел работу своей программы(на C++ которая) при стандартном наборе вирусов, антивируснике(KAV) и открытых пару документов - составление кроссворда было чрезвычайно дооооолгим.
То бишь я ориентируюсь не на идеал чистой машины, а на хомячковую реальность ;)

xwicked ★★ ()
Ответ на: комментарий от unC0Rr

Вот с этим я думаю проблем быть не должно. По крайней мере, буду за этим следить...

xwicked ★★ ()
Ответ на: комментарий от xwicked

Ты наркоман? Данные один раз загрузятся\выгрузятся из\в XML\JSON или что у тебя там, дальнейшая работа будет идти в памяти. При чём тут скорость работы с форматом хранения?

jessey ()
Ответ на: комментарий от jessey

Там будет пакетный генератор в будущем, переписанный с Клёст-кроссворда ;)

xwicked ★★ ()

Не нужно.

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

CrossFire ★★★★★ ()
Ответ на: Не нужно. от CrossFire

Там мне придёться ещё много неровностей Lazarus сглаживать. Пока два косяка только нашёл.

xwicked ★★ ()
Ответ на: Не нужно. от CrossFire

Получил, расписываюсь. Отсутствие интереса к собственному коду лучше всего научит автора писать его нормально. Ну и дальше ppa какого-нибудь не пройдёт все равно.

Всё в порядке. Просто lazarus - не идеал, но всё же эта среда сделала невозможное для многострадального шаблона линуксоидов. Меньше глюков и анализ стиля кода спасли бы её.

quiet_readonly ★★★★ ()
Ответ на: комментарий от quiet_readonly

... Отсутствие интереса к собственному коду лучше всего научит автора писать его нормально. Ну и дальше ppa какого-нибудь не пройдёт все равно. ...

Я начинал изучать Delphi, написал на нём >150 мелких примеров. Программы же начал писать потом сразу на C++, только с базовыми знаниями. На Lazarus переписывал то, что у меня на C++ получалось. В **11 году я ещё числился студентом универа. Так что это не отсутствие интереса, а приобретение боевого опыта на глазах у всех.

Такой вот я «нескромный» тип ;) Научусь правильной декомпозиции и все дистрябы будут моими.
ЗЫ: Такой код на первых порах будет отпугивать лентяев и фейкеров, а потом, уже будет поздно хвататься.
Как-то так...

xwicked ★★ ()

Благодарю за два байта и endianless!
В следующий раз буду ждать хотя бы столько же полезных советов
ЗЫ: А то, в обсуждении Клёст-кроссворда такой базар устроили, забаялись может чего? Ну да ладно пусть оффтопят на здоровье... :) :) :)

xwicked ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.