Модераторы: Snowy, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программа для создания кросвордов - Lazarus[Delphi, [Обсуждение программы и кода] 
:(
    Опции темы
xwicked
  Дата 2.11.2011, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 9.4.2010
Где: Старый Оскол

Репутация: нет
Всего: 1



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

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

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

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

Ссылка на 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 - 2.11.2011, 22:57
PM MAIL WWW ICQ   Вверх
xwicked
  Дата 7.11.2011, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 9.4.2010
Где: Старый Оскол

Репутация: нет
Всего: 1



Мне уже указали на некоторые ошибки:
Цитата
Описание формата 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';
Пока такой вариант - потом буду дорабатывать, со словесным указанием занимаемой памяти и диапазона принимаемых значений.  smile 
PM MAIL WWW ICQ   Вверх
xwicked
  Дата 6.6.2012, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 9.4.2010
Где: Старый Оскол

Репутация: нет
Всего: 1



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

В новой версии есть улучшения работы и интерфейса. 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;
 Скачать
PM MAIL WWW ICQ   Вверх
xwicked
  Дата 24.9.2012, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 9.4.2010
Где: Старый Оскол

Репутация: нет
Всего: 1



Здравствуйте!
Чуть изменил формат уже 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 в кроссворде;
  - Добавлена проверка версии файла кроссворда. Тем самым устранена фатальная ошибка;
  - Добавлена справка;
  - Добавлена возможность ввода ника;
  - Добавлены новые кнопки на стандартную панель инструментов;
  - Добавлена возможность проверки правильности разгадывания кроссворда;
  - Добавлена статистика игроков;
  - В строку состояния добавлены новые элементы;
  - Добавлены подсказки для элементов интерфейса;
  - Добавлен диалог, позволяющий продолжить разгадывание, при случайной попытке выхода из игры; 

PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Совместные проекты/поиск партнёров"
Snowy
Poseidon

Внимание:
В этом форуме обсуждаются вопросы только по совместным проектам, когда Вы хотите найти партнёров или стать участником проекта.
Запрещается размещение заказов на написание программ, поиск работников (для этого есть раздел "Работа") и реклама своих сетевых ресурсов.

Этот раздел только для проектов в которых Вы будете выступать в качестве исполнителя!

Темы и сообщения, не удовлетворяющие данным правилам, будут удаляться на основании пункта 3 Правил форума!

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

  • Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, Poseidon

     
    0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
    0 Пользователей:
    « Предыдущая тема | Совместные проекты/поиск партнёров | Следующая тема »


     




    [ Время генерации скрипта: 0.1487 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


    Реклама на сайте     Информационное спонсорство

     
    По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
    Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.