crossplatform.ru

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

> Программа для создания кроссвордов, Обсуждение программы и кода
xwicked
  опции профиля:
сообщение 2.8.2011, 14:50
Сообщение #1


Студент
*

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

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




Репутация:   0  




Здравствуйте! Есть одна программа для создания кроссвордов. Она состоит из двух частей: создание и отгадывание.

Прошу её код хорошо покритиковать. Для остальных, чтобы могли посмотреть на её работу, дам ссылки на бинарники 32-бит: создание, отгадывание. Qt-4.5.3.

Проекты OpenSource под GPLv2. Ссылки на SourceForge.net - создание, отгадывание.
Это мой первый код на C++(Qt). Жду комментариев :)

Добавлю небольшое описание: Сетка кроссворда представлена обычной таблицей TableCrosswordEdit(QTableWidget), слова загружаются в список слов ListWord(QStringList), толкования(вопросы) находятся в списке вопросов ListQuestions(QListWidget).

Структура файла - динамическая. Когда писал программы на Delphi - использовал статику - расходовалось лишнее дисковое пространство .
XWC: Пароль, количество строк, количество столбцов, ширина(высота) ячейки таблицы, шрифт, структура таблицы(w + 1(x) - белая ячейка, b + 1( c ) - чёрная), строка с данными CrosswordData(QString).
      ... if(file.open(QIODevice::WriteOnly))
                         {
                             QBrush BrushBlack = QBrush(Qt::black, Qt::SolidPattern);
                             QDataStream sfile(&file);
                             QChar sdata;
                             ushort idata;
      
                                 if(State == false) sfile << strPassword;
      
                             sfile << TableCrosswordEdit->rowCount();
                             sfile << TableCrosswordEdit->columnCount();
                             sfile << TableCrosswordEdit->rowHeight(0);
                             sfile << TableCrosswordEdit->font();
      
                                 for(int i = 0; i < TableCrosswordEdit->rowCount(); i++)
                                     for(int j = 0; j < TableCrosswordEdit->columnCount(); j++)
                                         {
                                                 if(TableCrosswordEdit->item(i,j)->background() == BrushBlack)
                                                     {
                                                         sdata = 'b';
                                                         idata = sdata.unicode() + 1;
                                                         sfile << idata;
                                                     }
                                                 else
                                                     {
                                                         sdata = 'w';
                                                         idata = sdata.unicode() + 1;
                                                         sfile << idata;
                                                     }
      
                                             sdata = 0;
                                         }
      
                                 if(State == false) CrosswordToData(2);
                                 if(State == false) sfile << CrosswordData;
      
                             file.close();
      
                                 if(State == false) SaveStateCross = true;
                                 else SaveStateTemplate = true;
                         } ...

CrosswordData: цикл по количеству слов(q, QChar(номер слова), QChar(координата строки в сетке), QChar(координата столбца в сетке), направление слова в сетке), цикл по количеству слов(W, QChar(номер слова), QChar(длина слова), само слово), цикл по количеству вопросов(Q, QChar(номер вопроса), QChar(длина вопроса), сам вопрос).
      ...
                             for(int i = 0; i < ListWord.count(); i++)
                                 {
                                     CrosswordData.append(QChar('W'));
                                     CrosswordData.append(QChar(ushort(i)));
                                     CurrentString.clear();
                                     CurrentString.append(ListWord.at(i));
                                     CrosswordData.append(QChar(ushort(CurrentString.length())));
                                     CrosswordData.append(ListWord.at(i));
                                 }
      
                             for(int i = 0; i < ListQuestions->count(); i++)
                                 {
                                     CrosswordData.append(QChar('Q'));
                                     CrosswordData.append(QChar(ushort(i)));
                                     CrosswordData.append(QChar(ushort(ListQuestions->item(i)->text().length())));
                                     CrosswordData.append(ListQuestions->item(i)->text());
                                 } ...

Шаблон кроссворда(XWTPL) таже структура, но без пароля и без CrosswordData.

Состояние сохранения(tmpcross): цикл по количеству слов(W, QChar(номер слова), QChar(длина слова), само слово).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
xwicked
  опции профиля:
сообщение 11.6.2012, 16:14
Сообщение #2


Студент
*

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

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




Репутация:   0  


Оптимизация констант:
enum eTypeCrossword {TYPE_PDF, TYPE_POST_SCRIPT, TYPE_RTF, TYPE_HTML, TYPE_TXT, TYPE_JPG, TYPE_JPEG, TYPE_BMP,
                    TYPE_TIFF, TYPE_PNG, TYPE_XPM, TYPE_XBM, TYPE_PPM, TYPE_OPEN_KLEST};
Экспорт в RTF вместе с изображением:
QString TCrosswordGrid::wordToUnicode(QString sWord)
{
    QString sTemp;

    for (int i = 0; i < sWord.length(); i++)
//Добавляет один символ Unicode, если этого не получается сделать, то отображается знак вопроса
        sTemp.append("\\u" + QString::number(sWord.at(i).unicode()) + "?");

    return sTemp;
}

//Формирование RTF-документа и сохранение
void TCrosswordGrid::saveToRTF(QString sExportName, QString strRTF, QImage imgExport)
{
    QByteArray baImage;
    QBuffer buffer(&baImage);
    buffer.open(QIODevice::WriteOnly);
    imgExport.save(&buffer, "BMP");//BMP как обязательный формат изображения
    baImage = baImage.toHex();//Побайтовое преобразование изображения в шестнадцатеричную форму
    QFile ifile(sExportName);
    QTextStream istream(&ifile);
    istream.setCodec("UTF-8");//UTF-8 кодировка документа
    ifile.open(QIODevice::WriteOnly);
//Добавление информации об изображении с сохранением изначального размера
    istream << "{\\rtf1\n{\\pict\\wmetafile8\\picw" + QString::number(columnCount() * rowHeight(0) * 27) + "\\pich"
            + QString::number(rowCount() * rowHeight(0) * 27) + "\n";
    
    int j = 0;

    for (int i = 0; i < baImage.size(); i++)
    {
        if (j == 128)//Если количество символов в строке == 128
        {
            istream << "\n";//То перевод строки; Избавляет от ошибок, при чтении документа.
            j = 0;
        }

        istream << baImage.at(i);
        j++;
    }
    istream << "}\\par\\par\n";
    istream << strRTF;
    istream << "}";
    ifile.close();
}

//Формирование RTF-текста вопросов и ответов
QString TCrosswordGrid::makeRTFText(QString ListWordH, QString ListWordV, QStringList ListOutV, QStringList ListOutH)
{
    QString strRTF;
    QString strText1;
    QString strText2;
    QString strText3;

    for(int i = 0; i < ListOutH.count(); i++)
    {
        strText1.append(wordToUnicode(ListOutH.at(i)) + "\\par\n");
    }

    strText2.clear();

    for(int i = 0; i < ListOutV.count(); i++)
    {
        strText2.append(wordToUnicode(ListOutV.at(i)) + "\\par\n");
    }

    strText3.clear();
    strText3 = "{\\b " + wordToUnicode(tr("Horizontal")) + "}:\\par\n" + wordToUnicode(ListWordH) + "\\par\n" + "{\\b " + wordToUnicode(tr("Vertical"))
               +"}:\\par\n" + wordToUnicode(ListWordV) + "\\par\n";

    strRTF.append("{\\b " + wordToUnicode(tr("Horizontal")) + "}:\\par\n"
                   + strText1 + "\\par\n"
                   "{\\b " + wordToUnicode(tr("Vertical")) + "}:\\par\n"
                   + strText2 + "\\par\n"
                   "{\\b\\i " + wordToUnicode(tr("Answers")) + "}:\\par\n"
                   + strText3 + "\\par\n");
    return strRTF;
}
Использовался материал Википедии. Скачать 1.0.0.
Цитата
Список изменений:
- Повышена безопасность работы игры;
- Добавлен экспорт кроссворда в RTF;
- Исправлена нумерация вопросов кроссворда при печати и экспорте;
- Оптимизирована скорость отображения статистики;
- Изменён цветовой стиль сетки кроссворда, уменьшен контраст цветов;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- xwicked   Программа для создания кроссвордов   2.8.2011, 14:50
- - ViGOur   у нас на сайте, есть раздел исходники, можешь доба...   2.8.2011, 15:43
|- - xwicked   Цитата(ViGOur @ 2.8.2011, 16:43) у нас на...   2.8.2011, 18:17
- - xwicked   Продолжаем знакомиться с исходником. Профессиональ...   4.8.2011, 16:40
- - xwicked   Следующая версия программы - 0.1.5. Исходный код +...   6.8.2011, 12:08
- - registr   Попробуй рассказать об игре на http://www.gamedev....   7.8.2011, 11:26
|- - xwicked   Цитата(registr @ 7.8.2011, 12:26) Попробу...   7.8.2011, 21:01
- - xwicked   А вот и новая версия 0.1.7. Изучаем исходный код +...   15.8.2011, 6:26
- - xwicked   Если у кого-нибудь будет желание свою изменённую в...   17.8.2011, 21:33
- - xwicked   Продолжение: 0.1.8. Исходник + сборки. Изменения:...   18.8.2011, 21:03
- - xwicked   Здравствуйте! Хочу порадовать Вас тем, что я ...   21.8.2011, 19:57
- - xwicked   Следующая версия = 0.2.0. Исходный код + сборки: ...   22.8.2011, 17:12
- - Алексей1153   xwicked, ЦитатаСтруктура файла - динамическая. ...   23.8.2011, 6:36
|- - xwicked   Цитата(Алексей1153 @ 23.8.2011, 7:36) ......   23.8.2011, 8:25
- - Алексей1153   xwicked, громоздкость ? Да ерунда. Имена неосновны...   23.8.2011, 9:03
|- - xwicked   Цитата(Алексей1153 @ 23.8.2011, 10:03) xw...   23.8.2011, 10:15
- - Litkevich Yuriy   Цитата(Алексей1153 @ 23.8.2011, 12:03) 1....   23.8.2011, 9:42
- - Алексей1153   Цитатаэто элементарно, по сравнению с XML сравнимо...   23.8.2011, 9:46
- - Алексей1153   xwicked, я прекрасно осведомлён о содержимом и уст...   23.8.2011, 11:15
|- - xwicked   Цитата(Алексей1153 @ 23.8.2011, 12:08) .....   23.8.2011, 11:20
- - Алексей1153   xwicked, осторожно! Кроссворды тебя погубят   23.8.2011, 11:28
- - xwicked   Программа доведена до стабильности. Релиз 0.2.1. И...   25.8.2011, 18:19
- - xwicked   А в новой версии 0.2.2 я реализовал импорт кроссво...   3.9.2011, 22:53
- - xwicked   Здравствуйте! Цитата- Добавлена возможность по...   8.11.2011, 1:39
|- - Sokoloff   Цитата(xwicked @ 8.11.2011, 2:39) Появила...   29.11.2011, 12:05
- - xwicked   В версии 0.2.8 я добавил функции горизонтального и...   26.11.2011, 23:55
- - Алексей1153   ЦитатаНо... я не смог быстро придумать функцию обр...   28.11.2011, 6:12
- - xwicked   Цитата(Sokoloff @ 29.11.2011, 12:05) ... ...   1.12.2011, 5:52
- - xwicked   Следующая версия программы 0.2.9. В ней я походу в...   28.1.2012, 16:04
- - xwicked   Здравствуйте! Как я избавился от переполнения ...   8.2.2012, 22:48
- - Алексей1153   можно немного встряну )) предлагаю более ООП вари...   9.2.2012, 7:37
|- - xwicked   Цитата(Алексей1153 @ 9.2.2012, 8:37) можн...   9.2.2012, 15:34
- - Алексей1153   >>Насчёт остального мне пока квалификации не...   9.2.2012, 19:52
|- - xwicked   Цитата(Алексей1153 @ 9.2.2012, 20:52) ......   9.2.2012, 21:52
- - Алексей1153   свич - это великолепная штука, когда нужно выбрать...   10.2.2012, 6:45
- - xwicked   Оптимизация констант: enum eTypeCrossword {TYPE_PD...   11.6.2012, 16:14
- - xwicked   Все изменения:Цитата- Добавлена возможность создат...   6.5.2013, 21:36


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


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




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