Программа для создания кросвордов - Lazarus[Delphi]-версия., [Обсуждение программы и кода] |
Здравствуйте, гость ( Вход | Регистрация )
Программа для создания кросвордов - Lazarus[Delphi]-версия., [Обсуждение программы и кода] |
xwicked |
2.11.2011, 22:49
Сообщение
#1
|
Студент Группа: Участник Сообщений: 66 Регистрация: 2.8.2011 Из: Старый Оскол Пользователь №: 2781 Спасибо сказали: 0 раз(а) Репутация: 0 |
Здравствуйте!
Вот и созрел четвёртый проект для глаз общественности. Пока выпущено 2-е бетаверсии. В них я попытался исправиться с комментариями кода. Комментирую сразу, возможно есть лишнее. Он представляет собой Клёст-кроссворд переписанный на Lazarus так же, не используя ничего нестандартного, во избежании плохой межплатформенной переносимости. Носит кодовое название OpenKlest. Смысл его заключается в создании открытого стандарта файла кроссвордов для всех компиляторов, независимо от платформы или языка. Версия 0.1.1 - есть функция отгадывания кроссворда в формате OpenKlest 1.0(экспортируют Клёст-кроссворд 0.2.9, 0.3.7). Пока только латиница Скрин: Ссылка на 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"; |
|
|
Алексей1153 |
3.11.2011, 7:43
Сообщение
#2
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
моё мнение прежнее - XML. Абсолютная совместимость с любым языком, простая прозрачная структура, нет геморроя с совместимостью между версиями.
Но если уж хочется гемора, то парочка советов, как его упростить: 1) весь формат побить на структуры, длину каждой структуры хранить перед телом структуры (то есть всегда можно перешагнуть незнакомое место, зная его размер). Сами структуры опознаются по сигнатурам. 2) использовать типы, где явно указано количество бит (int8, int16, int32) |
|
|
ssoft |
3.11.2011, 7:48
Сообщение
#3
|
Участник Группа: Участник Сообщений: 130 Регистрация: 17.2.2010 Из: Москва Пользователь №: 1470 Спасибо сказали: 30 раз(а) Репутация: 3 |
|
|
|
Алексей1153 |
3.11.2011, 8:08
Сообщение
#4
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
я тут ради правого дела не поленился накидать структуру )
Сообщение отредактировал Алексей1153 - 3.11.2011, 8:18 |
|
|
xwicked |
7.11.2011, 19:16
Сообщение
#5
|
Студент Группа: Участник Сообщений: 66 Регистрация: 2.8.2011 Из: Старый Оскол Пользователь №: 2781 Спасибо сказали: 0 раз(а) Репутация: 0 |
Мне уже указали на некоторые ошибки:
Цитата Описание формата 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'; |
|
|
xwicked |
6.6.2012, 20:52
Сообщение
#6
|
Студент Группа: Участник Сообщений: 66 Регистрация: 2.8.2011 Из: Старый Оскол Пользователь №: 2781 Спасибо сказали: 0 раз(а) Репутация: 0 |
Здравствуйте!
В новой версии есть улучшения работы и интерфейса. TBitBtn заменён на TSpeedButton Убрано раздражающее мерцание, вызванное неправильной и двойной перерисовкой сетки кроссворда. До: После: Дополнительные изменения:Цитата - Устранена ошибка неправильного отображения текста в списке вопросов; Скачать
- Добавлена поддержка Windows-тем, используя файл *.manifest; - Оптимизирована часть кода; - Добавлена возможность выбора слова из сетки кроссворда; - Добавлены ссылки программы в разделе "Автор", окна "О программе" на сайт SourceForge.net: Основная ссылка, Bug-трекер и Git; |
|
|
xwicked |
24.9.2012, 20:12
Сообщение
#7
|
Студент Группа: Участник Сообщений: 66 Регистрация: 2.8.2011 Из: Старый Оскол Пользователь №: 2781 Спасибо сказали: 0 раз(а) Репутация: 0 |
Здравствуйте!
Чуть изменил формат уже 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 байт. Обращаю внимание на то, что в ОС Windows русский текст, записываемый в строку AnsiString, записывает Wide(unicode)-символы по одному байту в Ansi-букву. Чтобы это исправить я сделал так:
Есть ещё это: Скачать новую версию 1.0.0Изменения: Цитата - Добавлен перевод интерфейса игры на русский язык;
- Добавлена поддержка Unicode в кроссворде; - Добавлена проверка версии файла кроссворда. Тем самым устранена фатальная ошибка; - Добавлена справка; - Добавлена возможность ввода ника; - Добавлены новые кнопки на стандартную панель инструментов; - Добавлена возможность проверки правильности разгадывания кроссворда; - Добавлена статистика игроков; - В строку состояния добавлены новые элементы; - Добавлены подсказки для элементов интерфейса; - Добавлен диалог, позволяющий продолжить разгадывание, при случайной попытке выхода из игры; |
|
|
Алексей1153 |
25.9.2012, 12:41
Сообщение
#8
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
Цитата Описание формата OpenKlest 1.1: ну вот и начались радости и лишения, которые ты сам и хотел С XML, который априори кросс-языковый и кроссплатформенный, ничего этого выдумывать бы не пришлось. Тупо берём парсер (которых для любого языка навалом 100 пудов) и вытаскиваем содержимое в нужные переменные нужного типа |
|
|
Текстовая версия | Сейчас: 23.11.2024, 15:45 |