Qt::Шахматы. Часть 2
Во второй части цикла статей, посвященного написанию шахмат, будет рассмотрена организация ходов по доске. Для начала введем два класса: QPiece – фигура и QGame – игра.
QPiece
Вообще далее фигура будет абстрактным классом, а работать мы будем с ее наследниками, но сейчас, для организации ходов по доске можно будет обойтись без них.
Фигура будет наследником от QSvgWidget, виджета, для отображения svg картинок.
Свойства фигуры
- State- состояние. Фигуры будет иметь два основных состояния: Simple (обычная фигура) и Deleted (уже срубленная). Доступно для записи и для чтения.
- Color– цвет фигуры (белая или черная). Свойство доступно только для чтения. Тип bool.
- Position– позиция фигуры на доске. Доступно для записи и чтения.
- Board – доска. Тип QBoard, доступна только для чтения.
Объявление:
- class QPiece : public QSvgWidget
- {
- Q_OBJECT
- public:
- enum State { Simple, Deleted };
- QPoint position();
- void setPosition( QPoint value );
- bool color();
- static QGame *game();
- void setState( State value );
- State state();
- QBoard *board();
- QPiece( QPoint position, QWidget *board );
- protected:
- QBoard *_board;
- QPoint _position;
- State _state;
- bool _color;
- };
паттерны, qt, cpp
Delphi::Система тестирования. Часть 2. Работа с данными
В первой части цикла статей, посвященного написанию системы тестирования, были описаны основные требования к программе и ее общая структура. Вопросы, как и основные настройки теста, было решено хранить в зашифрованном xml файле. В этой части цикла статей мы подробно рассмотрим механизм работы с этим файлом.
Структура XML файла
Рассмотрим структуру XML файла, в незашифрованном виде, на примере:
- <?xml version="1.0" encoding="UTF-8"?>
- <test text="Delphi" qcount="0">
- <question text="Delphi - объектно ориентированный язык?" active="true">
- <answer right="False" text="нет"/>
- <answer right="true" text="да"/>
- </question>
- <question text="Какая функция или процедура выполнит
- преобразование string в integer?" active="true">
- <answer right="true" text="StrToInt"/>
- <answer right="true" text="Val"/>
- <answer right="false" text="StringToInteger"/>
- </question>
- <question text="Есть ли в Delphi динамические массивы?" active="false">
- <answer right="false" text="Да, были в Delphi с самой первой версии"/>
- <answer right="false" text="Нет"/>
- <answer right="true" text="Да, появились с версии 4"/>
- </question>
- </test>
Как видно, test - корневая ветвь документа. Ее атрибуты:
- Text – название теста
- Qcount– количество используемых вопросов. Если 0, тогда используются все вопросы из файла.
Вопросом является ветвь question, которая является родительской для ветви answer – варианта ответа. Рассмотрим атрибуты вопроса:
- Text – сам текст вопроса.
- Active– флаг, определяющий является ли вопрос активным (будет ли использован в тесте)
Вариантов ответа может любое количество. Притом опять же любое количество из них может быть верным. Атрибуты:
- Right – флаг, определяющий является ли вариант ответа верным или нет.
- Text – текст варианта ответа.
Данные
Весь код, который мы будем использовать для работы с xml файлом и данными из него целесообразно определить в один unit. Назовем его StData и положим в папку lib, так как с данными должны работать и представление и администрирование.
Перед тем как начать писать код, разбирающий XML нужно понять, как мы будем представлять данные и, собственно, с какими данными будем работать. Исходя из структуры XML файла, можно выделить следующее: сам тест (название и количество вопросов), вопрос (текст и активность) и вариант ответа (правильность и текст). Все это можно представить в виде классов. То есть получить классы TStTest, TStQuestion и TStAnser для теста, вопроса, и варианта ответа соответственно.
Удобно будет, если вопрос будет хранить список вариантов ответа, а вариант ответа, знать какому вопросу он принадлежит.
Учитывая вышесказанное, получаем следующие классы:...читать дальше
delphi, тест, xml, паттерны