Russian Qt Forum
Август 07, 2020, 16:15 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Программа для создания кросвордов - Lazarus[Delphi]-версия. [Обсуждение программ  (Прочитано 5558 раз)
xwicked
Гость
« : Ноябрь 02, 2011, 22:49 »

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

Вот и созрел четвёртый проект для глаз общественности. Пока выпущено 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";
Как Вам словесное описание и сам формат? Что нужно добавить или изменить? Жду комментариев.
Записан
xwicked
Гость
« Ответ #1 : Ноябрь 07, 2011, 19:13 »

Мне уже указали на некоторые ошибки:
Цитировать
Описание формата 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
Гость
« Ответ #2 : Июнь 06, 2012, 20:43 »

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

В новой версии есть улучшения работы и интерфейса. TBitBtn
Код
Delphi
tbExit: TBitBtn;//Кнопка панели "Выход из программы"
заменён на TSpeedButton
Код
Delphi
tbExit: TSpeedButton;
Убрано раздражающее мерцание, вызванное неправильной и двойной перерисовкой сетки кроссворда. До:
Код
Delphi
   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;//Перерисовка таблицы кроссворда, чтобы введённый в ячейках текст не был стёрт
После:
Код
Delphi
GridOpenKlest.Repaint;//Очистка сетки от зелёного
Дополнительные изменения:
Цитировать
- Устранена ошибка неправильного отображения текста в списке  вопросов;
- Добавлена поддержка Windows-тем, используя файл *.manifest;
- Оптимизирована часть кода;
- Добавлена возможность выбора слова из сетки кроссворда;
- Добавлены ссылки программы в разделе "Автор", окна  "О программе" на сайт SourceForge.net: Основная ссылка, Bug-трекер и Git;
Скачать
Записан
xwicked
Гость
« Ответ #3 : Сентябрь 24, 2012, 20:09 »

Здравствуйте!
Чуть изменил формат уже 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-букву. Чтобы это исправить я сделал так:
Код
Delphi
   //Для 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;
 
Есть ещё это:
Код
Delphi
                          //Для 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]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.14 секунд. Запросов: 20.