crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Программа для создания кросвордов - 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). Пока только латиница :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";
Как Вам словесное описание и сам формат? Что нужно добавить или изменить? Жду комментариев.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
xwicked
  опции профиля:
сообщение 24.9.2012, 20:12
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 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-букву. Чтобы это исправить я сделал так:
    //Для Windows
//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;

Есть ещё это:
                            //Для Windows
//Если язык русский
                            {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 в кроссворде;
- Добавлена проверка версии файла кроссворда. Тем самым устранена фатальная ошибка;
- Добавлена справка;
- Добавлена возможность ввода ника;
- Добавлены новые кнопки на стандартную панель инструментов;
- Добавлена возможность проверки правильности разгадывания кроссворда;
- Добавлена статистика игроков;
- В строку состояния добавлены новые элементы;
- Добавлены подсказки для элементов интерфейса;
- Добавлен диалог, позволяющий продолжить разгадывание, при случайной попытке выхода из игры;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 23.11.2024, 20:46