LinuxForum.Fans
Тема

Программа для создания кросвордов - Lazarus[Delphi]-версия

Автор: xwicked 7 сообщений 5119 просмотров
#202619

Здравствуйте!

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

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

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


Ссылка на SourceForge.net. Код под GNU GPL v2 - OpenSource.

Описание формата OpenKlest 1.0:
Это двоичный формат файла кроссворда, разработанный так, чтобы было максимально просто сделать его поддержку в других языках программирования, отличных от C++. Он экспортируется средствами чистого C++, без расширяющих возможностей библиотеки Qt.
---
//Версия файла
char cFileBegin[14] = "OpenKlest-1.0~";

//Количество строк кроссворда
uint uiRowCount;

//Количество столбцов кроссворда
uint uiColumnCount;

//Ширина(Высота) ячейки
uint uiRowHeight;

// Если ячейка чёрная
;QChar qcCell = 'b';

// Если ячейка белая
;QChar qcCell = 'w';

// Цикл от uiRowCount до uiColumnCount
ushort usCell = qcCell.unicode() + 1;

//Количество слов
uint uiWordCount;

//Координата строки расположения слова в сетке кроссворда;
//Цикл от 0 до uiWordCount
ushort usWordRow;

//Координата столбца расположения слова в сетке кроссворда;
//Цикл от 0 до uiWordCount
ushort usWordColumn;

// Если слово вертикальное
;QChar qcDirection = 'v';

// Если слово горизонтальное
;QChar qcDirection = 'h';

//Направление слова в сетке кроссворда;
//Цикл от 0 до uiWordCount
ushort usWordDirection = qcDirection.unicode();

//Длина слова в сетке кроссворда;
//Цикл от 0 до uiWordCount
ushort usWordLength;

//Слово
;string sWord;

//Цикл от 0 до uiWordCount
char cWord[sWord.length()];

//Длина вопроса; Цикл от 0 до uiWordCount
ushort usQuestionLength;

//Вопрос
;string sQuestion;

//Цикл от 0 до uiWordCount
char cQuestion[sQuestion.length()];

//Метка конца файла
char cFileEnd[10] = "~OpenKlest";
Как Вам словесное описание и сам формат? Что нужно добавить или изменить? Жду комментариев.
#202750
xwicked написал:
Смысл его заключается в создании открытого стандарта файла кроссвордов для всех компиляторов, независимо от платформы или языка.

Просто ИМХО. На мой взгляд формат какого бы то ни было файла ни как не связан с выбором компилятора или языка. Если есть желание разработать некий формат - хорошенько и подробно его документируйте (сам формат - программа тут играет второстепенную роль). Это для начала.

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

PS Когда вы сообщили первый раз об этой программе она вызвала у меня интерес. Когда вы стаи выпускать еще какой то продукт - стали возникать сомнения. То, что вы переписали на другой язык..... Не знаю. не знаю. не серьезно как то все.

Без обид, это просто мысль в слух. Буду рад если проект реально обретет популярность.

#203741

Мне уже указали на некоторые ошибки:

Описание формата 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';
Пока такой вариант - потом буду дорабатывать, со словесным указанием занимаемой памяти и диапазона принимаемых значений. :rolleyes:

voral
EiskaltDC++ — свободный кроссплатформенный клиент файлообменной сети Direct Connect с интерфейсами на основе Qt и GTK+.
Этим ребятам тоже делать нечего или поясни, ЧЯДНТ??? :o
#203785
xwicked написал:
Этим ребятам тоже делать нечего или поясни, ЧЯДНТ??? huh

Может я не совсем этот вопрос понял. Это про то, что зря еще один язык?
Если так, то тут разные вещи. То, что они пишут с возможностью использования разных фреймворков - это плюс. Значит основному функционалу побарабану - Qt, GTK+ или вообще MFC. Они заботятся о вкусах пользователей. Мне, например, нравится Qt и очень не нравится GTK чисто внешне. Кому то наоборот.

Ну, а язык на котором написана программа - фиолетово. Пользователю - ну абсолютно все равно, он не будет выбирать по данному критерию. Для обучения это да кому то будет интересно. Но вот, как мне кажется, вы сами считаете свой код далеким от идеала. ;)

Опять же, что эти ребята еще создают и продвигают?


А так в общем и целом мое ИМХО на ваш вопрос:

xwicked написал:
ЧЯДНТ???

Я вроде отвечал: слишком распыляете свои силы. Двигайте один хороший интересный продукт. Причешите код. Ну сами посудите найти "мелкий" недочет не проблема (на разных форумах ответили вам не очень много - но картина складывается). А это может привести однажды к лавине багов в которой просто захлебнетесь.

Я не говорю, что вам делать не чего и не собираюсь вас как либо задеть. Подозреваю у вас просто идеи бурлят в голове :). Может лучше поставить их в очередь?

И еще наверное это не совсем по теме уже и лучше свалить в личку (если есть желание об этом дальше говорить) пока нам щелбанов не надавали. :)

ЗЫ Сосредотачивайтесь на кроссвордах на сях за нее не зря плюс вам док поставил. ;)

#257186

Здравствуйте!

В новой версии есть улучшения работы и интерфейса. TBitBtn

text
tbExit: TBitBtn;//Кнопка панели "Выход из программы"

заменён на TSpeedButton

text
tbExit: TSpeedButton;

Убрано раздражающее мерцание, вызванное неправильной и двойной перерисовкой сетки кроссворда. До:

text
    bmCell := TBitmap.Create();//Создание цветной ячейки
    bmCell.SetSize(GridOpenKlest.DefaultColWidth - 1,
                   GridOpenKlest.DefaultColWidth - 1);
    bmCell.Canvas.Brush.Style := bsSolid;
    bmCell.Canvas.Brush.Color := cl3DLight;//Установка цвета фона сетки кроссворда в ячейке
    bmCell.Canvas.FillRect(0,0, GridOpenKlest.DefaultColWidth - 1,
                           GridOpenKlest.DefaultColWidth - 1);

//Если прошлое направление слова было горизонтальным, то if LastGWL = 'h' then begin for i := LastCFCW to LastCFCW + LastLW - 1 do begin //Очистка выделенного слова в стеке кроссворда от зелёного(clLime) цвета //Замена на cl3DLight GridOpenKlest.Canvas.CopyRect(GridOpenKlest.CellRect( i, LastRFCW), bmCell.Canvas, Rect(0,0, bmCell.Height, bmCell.Width)); end; end;

//Если прошлое направление слова было вертикальным, то if LastGWL = 'v' then begin for i := LastRFCW to LastRFCW + LastLW - 1 do begin //Очистка выделенного слова в стеке кроссворда от зелёного(clLime) цвета //Замена на cl3DLight GridOpenKlest.Canvas.CopyRect(GridOpenKlest.CellRect( LastCFCW, i), bmCell.Canvas, Rect(0,0, bmCell.Height, bmCell.Width)); end; end;

GridOpenKlest.Repaint;//Перерисовка таблицы кроссворда, чтобы введённый в ячейках текст не был стёрт

После:

text
GridOpenKlest.Repaint;//Очистка сетки от зелёного 

Дополнительные изменения:

- Устранена ошибка неправильного отображения текста в списке вопросов;
- Добавлена поддержка Windows-тем, используя файл *.manifest;
- Оптимизирована часть кода;
- Добавлена возможность выбора слова из сетки кроссворда;
- Добавлены ссылки программы в разделе "Автор", окна "О программе" на сайт SourceForge.net: Основная ссылка, Bug-трекер и Git;
Скачать
#257225

Все это, конечно, очень здорово (мне до такого еще расти и расти), но вот есть такой клиент - ayttm. Заявлена, в том числе, и поддержка ICQ, выглядит симпатично, но ему не хватает программистов для реализации этого протокола. Кто бы мог помочь автору? Я мог бы взять на себя локализацию.
PS. Извиняюсь за оффтоп, модераторам просьба переместить в другую тему.

#276343

Здравствуйте!
Чуть изменил формат уже 1.1 и подправил описание:

Описание формата OpenKlest 1.1:

Это двоичный формат файла кроссворда, разработанный так, чтобы было максимально просто сделать его поддержку в других языках программирования, отличных от C++. Он экспортируется средствами чистого C++, без расширяющих возможностей библиотеки Qt.

Чтение файла начинается c 14-ти байт типа Char('OpenKlest-1.1~'), где 1.1 - это версия формата. 1 символ Char = 1 символу AnsiChar = знаковое 1 байт.
Далее идёт язык кроссворда логического типа, boolean, 1 байт.
Далее количество строк сетки кроссворда, LongWord, беззнаковое 4 байта.
Далее количество столбцов сетки кроссворда, LongWord, беззнаковое 4 байта.
Затем размер ячейки сетки кроссворда, LongWord, беззнаковое 4 байта.
Затем значение цвета ячейки, Word, беззнаковое 2 байта. От него отнимается цифра 1. Чтение происходит в 2-х циклах:
Основной от 0 до количества строк, вложенный цикл от 0 до количества столбцов.
Затем количество слов, LongWord, беззнаковое 4 байта.
Потом чтение координат первых букв слов(строки), Word, беззнаковое 2 байта. Цикл от 0 до количества слов.
Потом чтение координат первых букв слов(столбцы), Word, беззнаковое 2 байта. Цикл от 0 до количества слов.
Потом чтение направлений слов, Word, беззнаковое 2 байта. Цикл от 0 до количества слов.
Следующим будет чтение длин слов, Word, беззнаковое 2 байта. Цикл от 0 до количества слов.
Следующим будет чтение слов-ответов, состоящих из набора unicode-симоволов, типа Word, беззнаковое 2 байта. Основной цикл от 0 до количества слов, вложенный от 0 до количества букв текущего слова.
Следующим будет чтение длин вопросов, Word, беззнаковое 2 байта. Цикл от 0 до количества слов.
Далее идёт чтение предложений-вопросов, состоящих из набора unicode-симоволов, типа Word, беззнаковое 2 байта. Основной цикл от 0 до количества слов, вложенный от 0 до количества букв текущего вопроса.
Ну и в конце загружается флаг конца файла ('~OpenKlest'), 10 байт типа Char. 1 символ Char = 1 символу AnsiChar = знаковое 1 байт.

Обращаю внимание на то, что в ОС Оффтопик русский текст, записываемый в строку AnsiString, записывает Wide(unicode)-символы по одному байту в Ansi-букву. Чтобы это исправить я сделал так:

text
    //Для Оффтопика
//s: String;

{if gWordLine = 'h' then begin for i := ColumnFirstCellWord to ColumnFirstCellWord + LengthWord - 1 do begin //Если язык русский if bLanguageWords = true then begin s := sTemp[j - 1] + sTemp[j];//Собираю их вместе :) GridOpenKlest.Cells[i, RowFirstCellWord] := s;//Загрузка слова в сетку j := j + 2; end else begin GridOpenKlest.Cells[i, RowFirstCellWord] := sTemp[j];//Загрузка слова в сетку Inc(j); end; end; end;

Есть ещё это:

text
                            //Для Оффтопика
//Если язык русский
                            {if bLanguageWords = true then
                                begin
                                     slQuestionT.Add(AnsiToUtf8(sTemp));//Wide(!)-символы преобразую из Ansi(!) в Wide :)
                                     ListQuestions.Items.Add(AnsiToUtf8(sTemp));
                                end
                            else
                            begin
                                slQuestionT.Add(sTemp);
                                ListQuestions.Items.Add(sTemp);
                            end;}

Скачать новую версию 1.0.0
Изменения:

- Добавлен перевод интерфейса игры на русский язык;
- Добавлена поддержка Unicode в кроссворде;
- Добавлена проверка версии файла кроссворда. Тем самым устранена фатальная ошибка;
- Добавлена справка;
- Добавлена возможность ввода ника;
- Добавлены новые кнопки на стандартную панель инструментов;
- Добавлена возможность проверки правильности разгадывания кроссворда;
- Добавлена статистика игроков;
- В строку состояния добавлены новые элементы;
- Добавлены подсказки для элементов интерфейса;
- Добавлен диалог, позволяющий продолжить разгадывание, при случайной попытке выхода из игры;
Войдите или зарегистрируйтесь, чтобы ответить.