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";
Как Вам словесное описание и сам формат? Что нужно добавить или изменить? Жду комментариев.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей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:43) *
моё мнение прежнее - XML.


Абсолютно согласен.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 3.11.2011, 8:08
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


я тут ради правого дела не поленился накидать структуру )
<!--ля-ля-тополя кроссворд-->
<crossword filever="OpenKlest-1.0~">

    <!--общая конфигурация ячейки-->
    <cellconfig wid="30" hig="30" white="w" black="b"/>

    <!--массив строк-->
    <rows_array rows="10" cols="10">
        <row val="bbwbwwbwwb"/><!--row 0-->
        <row val="bbwbwwbwwb"/>
        <row val="bbwbwwbwwb"/>
        <row val="bbwbwwbwwb"/>
        <row val="bbwbwwbwwb"/>
        <row val="bbwbwwbwwb"/>
        <row val="bbwbwwbwwb"/>
        <row val="bbwbwwbwwb"/>
        <row val="bbwbwwbwwb"/>
        <row val="bbwbwwbwwb"/><!--row 9-->
    </rows_array>
    
    <!--массив слов, вариант 1-->
    <words_array count="3">
        <word x="61" y="13" xdir="0" ydir="-1" val="слово1" question="вопрос1"/>
        <word x="41" y="33" xdir="1" ydir="0" val="слово2" question="вопрос2"/>
        <word x="12" y="23" xdir="-1" ydir="0" val="слово3" question="вопрос3"/>
    </words_array>

    <!--массив слов, вариант 2-->
    <words_array count="3">
        <word x="61" y="13" xdir="0" ydir="-1">
            <q val="вопрос1"/>
            <a val="слово1"/>
        </word>
        <word x="41" y="33" xdir="1" ydir="0">
            <q val="вопрос2"/>
            <a val="слово2"/>
        </word>
        <word x="12" y="23" xdir="-1" ydir="0">
            <q val="вопрос3"/>
            <a val="слово3"/>
        </word>
    </words_array>
</crossword>


Сообщение отредактировал Алексей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';
Пока такой вариант - потом буду дорабатывать, со словесным указанием занимаемой памяти и диапазона принимаемых значений. :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
xwicked
  опции профиля:
сообщение 6.6.2012, 20:52
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 66
Регистрация: 2.8.2011
Из: Старый Оскол
Пользователь №: 2781

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

В новой версии есть улучшения работы и интерфейса. TBitBtn
tbExit: TBitBtn;//Кнопка панели "Выход из программы"
заменён на TSpeedButton
tbExit: TSpeedButton;
Убрано раздражающее мерцание, вызванное неправильной и двойной перерисовкой сетки кроссворда. До:
    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;//Перерисовка таблицы кроссворда, чтобы введённый в ячейках текст не был стёрт
После:
GridOpenKlest.Repaint;//Очистка сетки от зелёного
Дополнительные изменения:
Цитата
- Устранена ошибка неправильного отображения текста в списке вопросов;
- Добавлена поддержка 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-букву. Чтобы это исправить я сделал так:
    //Для 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 в кроссворде;
- Добавлена проверка версии файла кроссворда. Тем самым устранена фатальная ошибка;
- Добавлена справка;
- Добавлена возможность ввода ника;
- Добавлены новые кнопки на стандартную панель инструментов;
- Добавлена возможность проверки правильности разгадывания кроссворда;
- Добавлена статистика игроков;
- В строку состояния добавлены новые элементы;
- Добавлены подсказки для элементов интерфейса;
- Добавлен диалог, позволяющий продолжить разгадывание, при случайной попытке выхода из игры;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 25.9.2012, 12:41
Сообщение #8


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


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

ну вот и начались радости и лишения, которые ты сам и хотел :) С XML, который априори кросс-языковый и кроссплатформенный, ничего этого выдумывать бы не пришлось. Тупо берём парсер (которых для любого языка навалом 100 пудов) и вытаскиваем содержимое в нужные переменные нужного типа
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 27.11.2024, 10:06