Здравствуйте! Есть одна программа для создания кроссвордов. Она состоит из двух частей: создание и отгадывание.
Прошу её код хорошо покритиковать. Для остальных, чтобы могли посмотреть на её работу, дам ссылки на бинарники 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(длина слова), само слово).