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(длина слова), само слово).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Алексей1153
  опции профиля:
сообщение 9.2.2012, 7:37
Сообщение #2


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

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

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




Репутация:   34  


можно немного встряну ))

предлагаю более ООП варианты:

с массивом лучше так
Раскрывающийся текст
//A - класс кроссвоода
#include <vector>
class A
{
   enum
   {
     e_W=50,
     e_H=50,
     e_init=0,
   };

   typedef ushort               td_elem;//тип элемента
   typedef std::vector<td_elem> td_row;//тип строки
   typedef std::vector<td_row>  td_table;//тип таблицы

   td_table m_usTable;

   A();
};


A::A()
:m_usTable(e_H,td_row(e_W,td_elem(e_init)))
{
}

//где-то в программе:
ushort current_row=4;
ushort current_col=7;
m_usTable[current_row][current_col]=td_elem('A');


по остальному - глобальные дефайны лучше объединять в класс

файл "mydefines.h"
Раскрывающийся текст
//Определение путей констант, в соответствии с системой
class mydefines
{
public:
    enum
    {
        MODE_VIEW        =true,
        MODE_EDIT        =false,

        ACROSS_ENABLE    =true,
        ACROSS_DISABLE   =false,

        LANGUAGE_RUSSIAN =true,
        LANGUAGE_ENGLISH =false,

        TOOLBAR_SHOW     =true,
        TOOLBAR_HIDE     =false,

        EXPORT_YES       =true,
        EXPORT_NO        =false,
    };

    enum ee_path_id
    {
        PATH_TMP_SET   ,
        PATH_SHARE_DOC ,
        PATH_SHARE_APP ,
        PATH_TMP_STAT  ,
    };

    enum ee_ext_id
    {
        TYPE_PDF         ,
        TYPE_POST_SCRIPT ,
        TYPE_HTML        ,
        TYPE_TXT         ,
        TYPE_JPG         ,
        TYPE_JPEG        ,
        TYPE_BMP         ,
        TYPE_TIFF        ,
        TYPE_PNG         ,
        TYPE_XPM         ,
        TYPE_XBM         ,
        TYPE_PPM         ,
        TYPE_OPEN_KLEST  ,
    };

    //Пути для разработки и отладки программы
    static QString GetPath(ee_path_id id);

    //расширение (без точки)
    static QString GetExt(ee_ext_id id);
};


файл "mydefines.cpp"
Раскрывающийся текст
#include <map>
QString mydefines::GetPath(ee_path_id id)
{
    typedef std::map<ee_path_id,QString> td_map;
    static td_map _map;

    if(_map.empty())
    {
        #if defined(Q_WS_WIN)
            _map[PATH_TMP_SET   ]=QApplication::applicationDirPath() + "/settings.xwsc";
            _map[PATH_SHARE_DOC ]=QApplication::applicationDirPath();
            _map[PATH_SHARE_APP ]=QApplication::applicationDirPath();
            _map[PATH_TMP_STAT  ]=QApplication::applicationDirPath() + "/cstat.html";
        #elif defined(Q_WS_X11)
            _map[PATH_TMP_SET   ]="/tmp/klest-crossword-0.3.7/settings.xwsc";
            _map[PATH_SHARE_DOC ]="/usr/share/doc/klest-crossword-0.3.7";
            _map[PATH_SHARE_APP ]="/usr/share/klest-crossword-0.3.7";
            _map[PATH_TMP_STAT  ]="/tmp/klest-crossword-0.3.7/cstat.html";
        #elif defined(Q_WS_MAC)
            _map[PATH_TMP_SET   ]=QApplication::applicationDirPath() + "/settings.xwsc";
            _map[PATH_SHARE_DOC ]=QApplication::applicationDirPath();
            _map[PATH_SHARE_APP ]=QApplication::applicationDirPath();
            _map[PATH_TMP_STAT  ]=QApplication::applicationDirPath() + "/cstat.html";
        #endif
    }

    td_map::const_iterator it=_map.find(id);
    if(it==_map.end())return "";
    return it->second;
}


QString mydefines::GetExt(ee_ext_id id)
{
    switch(id)
    {
        case TYPE_PDF         :return  "pdf";break;
        case TYPE_POST_SCRIPT :return  "ps" ;break;
        case TYPE_HTML        :return  "html";break;
        case TYPE_TXT         :return  "txt";break;
        case TYPE_JPG         :return  "jpg";break;
        case TYPE_JPEG        :return  "jpeg";break;
        case TYPE_BMP         :return  "bmp";break;
        case TYPE_TIFF        :return  "tiff";break;
        case TYPE_PNG         :return  "png";break;
        case TYPE_XPM         :return  "xpm";break;
        case TYPE_XBM         :return  "xbm";break;
        case TYPE_PPM         :return  "ppm";break;
        case TYPE_OPEN_KLEST  :return  "ok" ;break;
    }

    return "";
}


и где-то в прогремме:

QString filename=
    mydefines::GetPath(mydefines::PATH_SHARE_DOC)
    +"1234"
    +"."
    +mydefines::GetExt(mydefines::TYPE_BMP)
;



ну а по структуре TFileOptions - я уже говорил, что там не так

Сообщение отредактировал Алексей1153 - 9.2.2012, 7:44
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
xwicked
  опции профиля:
сообщение 9.2.2012, 15:34
Сообщение #3


Студент
*

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

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




Репутация:   0  


Цитата(Алексей1153 @ 9.2.2012, 8:37) *
можно немного встряну ))

предлагаю более ООП варианты: ...
Благодарю, вариант enum ee_path_id, enum ee_ext_id я уже сам собирался так оформить. Насчёт остального мне пока квалификации не хватает, чтобы понять, где что :blink: Вчера прочитал главу про классы(C++) - потихоньку буду разбираться.
А такой вариант покатит, чтобы switch заменить?
char Test[13][6] = {".pdf",".ps",".html",".txt",".jpg",".jpeg",".bmp",".tiff",".png",".xpm",".xbm",".ppm",".ok"};  // подготовка
.....
sFilter = Test[iTypeExport];  // замена свитча


Сообщение отредактировал xwicked - 9.2.2012, 21:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- 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


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


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




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