Qt::Шахматы. Часть 2

Во второй части цикла статей, посвященного написанию шахмат, будет рассмотрена организация ходов по доске. Для начала введем два класса: QPiece – фигура и QGame – игра.

QPiece

Вообще далее фигура будет абстрактным классом, а работать мы будем с ее наследниками, но сейчас, для организации ходов по доске можно будет обойтись без них.

Фигура будет наследником от QSvgWidget, виджета, для отображения svg картинок.

Свойства фигуры

  • State- состояние. Фигуры будет иметь два основных состояния: Simple (обычная фигура) и Deleted (уже срубленная). Доступно для записи и для чтения.
  • Color– цвет фигуры (белая или черная). Свойство доступно только для чтения. Тип bool.
  • Position– позиция фигуры на доске. Доступно для записи и чтения.
  • Board – доска. Тип QBoard, доступна только для чтения.

Объявление:

  1. class QPiece : public QSvgWidget
  2. {
  3.     Q_OBJECT
  4. public:
  5.     enum State { Simple, Deleted };
  6.  
  7.     QPoint position();
  8.     void setPosition( QPoint value );
  9.  
  10.     bool color();
  11.     static QGame *game();
  12.  
  13.     void setState( State value );
  14.     State state();
  15.  
  16.     QBoard *board();
  17.     QPiece( QPoint position, QWidget *board );
  18.  
  19. protected:
  20.     QBoard *_board;
  21.     QPoint _position;
  22.     State _state;
  23.     bool _color;
  24. };


паттерны, qt, cpp

Delphi::Система тестирования. Часть 2. Работа с данными

В первой части цикла статей, посвященного написанию системы тестирования, были описаны основные требования к программе и ее общая структура. Вопросы, как и основные настройки теста, было решено хранить в зашифрованном xml файле. В этой части цикла статей мы подробно рассмотрим механизм работы с этим файлом.

Структура XML файла

Рассмотрим структуру XML файла, в незашифрованном виде, на примере:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <test text="Delphi" qcount="0">
  3.     <question text="Delphi - объектно ориентированный язык?" active="true">
  4.         <answer right="False" text="нет"/>
  5.         <answer right="true" text="да"/>
  6.     </question>
  7.     <question text="Какая функция или процедура выполнит
  8.                     преобразование string в integer?" active="true">
  9.         <answer right="true" text="StrToInt"/>
  10.         <answer right="true" text="Val"/>
  11.         <answer right="false" text="StringToInteger"/>
  12.     </question>
  13.     <question text="Есть ли в Delphi динамические массивы?" active="false">
  14.         <answer right="false" text="Да, были в Delphi с самой первой версии"/>
  15.         <answer right="false" text="Нет"/>
  16.         <answer right="true" text="Да, появились с версии 4"/>
  17.     </question>
  18. </test>

Как видно, test  - корневая ветвь документа. Ее атрибуты:

  • Text – название теста
  • Qcount– количество используемых вопросов. Если 0, тогда используются все вопросы из файла.

Вопросом является ветвь question, которая является родительской для ветви answer – варианта ответа. Рассмотрим атрибуты вопроса:

  • Text – сам текст вопроса.
  • Active– флаг, определяющий является ли вопрос активным (будет ли использован в тесте)

Вариантов ответа может любое количество. Притом опять же любое количество из них может быть верным. Атрибуты:

  • Right – флаг, определяющий является ли вариант ответа верным или нет.  
  • Text – текст варианта ответа.

Данные

Весь код, который мы будем использовать для работы с xml файлом и данными из него целесообразно определить в один unit. Назовем его StData и положим в папку lib, так как с данными должны работать и представление и администрирование.

Перед тем как начать писать код, разбирающий XML нужно понять, как мы будем представлять данные и, собственно, с какими данными будем работать. Исходя из структуры XML файла, можно выделить следующее: сам тест (название и количество вопросов), вопрос (текст и активность) и вариант ответа (правильность и текст). Все это можно представить в виде классов. То есть получить классы TStTest, TStQuestion и TStAnser для теста, вопроса, и варианта ответа соответственно.  

Удобно будет, если вопрос будет хранить список вариантов ответа, а вариант ответа, знать какому вопросу он принадлежит.

Учитывая вышесказанное, получаем следующие классы:...читать дальше

delphi, тест, xml, паттерны