Описание программного продукта - игра «Реверси»

Автор работы: Пользователь скрыл имя, 13 Июня 2014 в 14:32, курсовая работа

Описание работы

В данной работе описывается игра «Реверси», написанная в соответствии с постановкой задачи на курсовой проект по предмету «Теория создания программного продукта».
Всегда с момента появления первых ПЭВМ существовал интерес пользователей к каким-либо компьютерным играм. Существуют как сложные компьютерные игры, так и относительно простые. Реверси - относительно несложная логическая игра. Основанием для разработки явилось выполнение курсовой работы.

Содержание работы

Введение……………………………………………………………………………5
Техническое задание………………………………………………………………5
История игры………………………………………………………………………5
Сюжет игры………………………………………………………………………..5
Описание программы……………………………………………………………..6
Алгоритм…………………………………………………………………………...7
Руководство пользователя………………………………………………………...8
Описание компонент программы…………………………………………………9
Заключение………………………………………………………………….…….10
Список используемой литературы……………………………………………...11

Файлы: 1 файл

Одобреное описание на 5.doc

— 192.00 Кб (Скачать файл)

Виджет QPushButton представляет собой командную кнопку.

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

QMessageBox - предоставляет собой диалог для информирования пользователя о чем либо или для получения ответа на поставленные вопросы. Выделяют основные три группы сообщений:

  1. Информационные
  2. Вопросительные
  3. Предупреждающие

В данном случае выводит сообщение о победе или ничьей (“White win”, “Black win” и “draw”).

 

Состояния процессов

  1. Класс QAction отвечает за состояние процесса, посылая сигнал классу  Field (унаследованному от класса Qwidget), который проверяет состояние клетки и возможность постановки на нее новой фишки.
  2. Для изменения состояния цвета фишек используется класс QPainter. Класс QWidget запрашивает у класса Dot возможность постановки фишки на клетку с определенной координатой и при положительном ответе дает комманду Qpainter нарисовать на указанной клетке новую фишку.
  3. При постановке новой фишки производится запрос к классу Dot, который проверяет возможность “переворота” фишек противника, стоящих между новой поставленной фишкой и поставленными ранее фишками. После этого Dot дает комманду классу Qpainter, который изменяет цвет указанных фишек противника. 

 

 

Заголовочные файлы

dot.h отвечает за расстановку, состояние и отрисовку фишек на игровом поле. Вызывает другой заголовочный файл- state.h.

state.h отвечает за цвет фишек (черный и белый цвет).

table.h отвечает за построение, состояние игрового поля. Вызывает заголовочный файл state.h.

Исходные файлы

main.cpp отвечает за работу окна программы, создания меню для кнопки “New game”. Вызывает заголовочный файл table.h. для создания игрового поля.

dot.срр отвечает за возможность постановки фишки на выбранную клетку. Вызывает заголовочный файл dot.h

Заключение

В результате выполнения работы была разработана программа реализующая алгоритм игры «Реверси». Были получены навыки реализации алгоритма.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Список используемой литературы:
  1. Википедия-  Свободная энциклопедия [электронный ресурс]. Режим доступа: ru.wikipedia.org
  2. Герберт Шилдт, С++ Базовый курс
  3. Хабрахабр- энциклопедия [электронный ресурс]. Режим доступа: habrahabr.ru

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Приложение

Код программы

dot.h

#ifndef DOT_H

#define DOT_H

#include <QPushButton>

#include "state.h"

 

class Dot : public QPushButton {

  Q_OBJECT

public:

  Dot(int i, int j, QWidget *parent = 0);

  void value(State state);        

  State value();

  int i();

  int j();

public slots:

  void on_gameReset();      

protected:

  virtual void paintEvent(QPaintEvent *);       

  State m_value;

  int i_, j_;

};

#endif

 

state.h

#ifndef STATE_H

#define STATE_H

enum State {

  Black

  , White

  , Empty

};

#endif

 

table.h

#ifndef FIELD_H

#define FIELD_H

#include <QWidget>

#include "state.h"

 

class Dot;

class Field :public QWidget {

  Q_OBJECT

public:

  Field(QWidget *parent = 0);

protected:

  const static int m_n = 10;     

  Dot* m_field[m_n][m_n];      

  State m_state;

  QVector<Dot*>* getDep(int i, int j);

protected slots:

  void on_DotClicked();

  void on_gameReset();

};

 

#endif

 

 

dot.cpp

#include "dot.h"

#include <QPainter>

 

Dot::Dot(int i, int j, QWidget *parent)

  : QPushButton(parent), m_value(Empty), i_(i), j_(j) {

  setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

}

void Dot::on_gameReset() {

  m_value = Empty;

  repaint();

}

int Dot::i() {

  return i_;

}

int Dot::j() {

  return j_;

}

State Dot::value() {

  return m_value;

}

void Dot::value(State c) {

  m_value = c;

  repaint();

}

void Dot::paintEvent(QPaintEvent *event) {

  QPushButton::paintEvent(event);

  QPainter p(this);

  if (White == m_value)

    p.setBrush(QBrush(Qt::white, Qt::SolidPattern));

  if (Black == m_value)

    p.setBrush(QBrush(Qt::black, Qt::SolidPattern));

  if (Empty != m_value)

    p.drawEllipse(2, 2, width() - 4, height() - 4);

 

}

 

main.cpp

#include <QApplication>

#include <QMainWindow>

#include <QAction>

#include <QMenuBar>

#include "table.h"

 

int main(int argc, char *argv[]) {

    QApplication a(argc, argv);

    QMainWindow mainWindow;

    Field field;

    QMenuBar *menuBar;

 

    mainWindow.setCentralWidget(&field);

    menuBar = mainWindow.menuBar();

 

    QAction *newAct = new QAction(QObject::tr("&New game"), &mainWindow);

    QObject::connect(newAct, SIGNAL(triggered()), &field, SLOT(on_gameReset()));

    menuBar->addAction(newAct);

    mainWindow.show();

 

    return a.exec();

}

 

table.cpp

#include "table.h"

#include "dot.h"

#include <QGridLayout>

#include <QMessageBox>

 

void Field::on_DotClicked() {

  Dot *t = reinterpret_cast<Dot*>(sender());

  if (Empty == m_state) //

    return;

  if (Empty != t->value())

    return;

  QVector<Dot*> *lines = getDep(t->i(), t->j());

  bool fl;

  if (lines->isEmpty()) {

    delete lines;

    return;

  }

  foreach(Dot* dot, *lines) {

    dot->value(m_state);

  }

  delete lines;

 

  t->value(m_state);

  if (Black == m_state)

    m_state = White;

  else

    m_state = Black;

  fl = true;

  for (int i = 0; i < m_n; ++i)

    for (int j = 0; j < m_n; ++j)

      if (m_field[i][j]->value() == Empty) {

        fl = false;

        break;

      }

  if (fl) {

    int tmp = 0;

    for (int i = 0; i < m_n; ++i)

      for (int j = 0; j < m_n; ++j)

        tmp += m_field[i][j]->value() == White ? 1 : -1;

    if (tmp > 0)

      QMessageBox::information(0, "Information", "White win");

    if (tmp < 0)

      QMessageBox::information(0, "Information", "Black win");

    if (0 == tmp)

      QMessageBox::information(0, "Information", "draw");

    m_state = Empty;

    return;

  }

  fl = true;

  for (int i = 0; i < m_n; ++i) {

    for (int j = 0; j < m_n; ++j) {

        lines = getDep(i, j);

        if (false == lines->isEmpty()) {

          fl = false;

          delete lines;

          break;

        }

        delete lines;

    }

  }

  if (true == fl) {

    if (m_state == White)

      QMessageBox::information(0, "Information", "Black win");

    if (m_state == Black)

      QMessageBox::information(0, "Information", "White win");

  }

 

}

 

void Field::on_gameReset() {

  m_state = White;

  for (int i = 0; i < m_n; ++i)

    for (int j = 0; j < m_n; ++j)

      m_field[i][j]->value(Empty);

 

  m_field[4][4]->value(White);

  m_field[5][5]->value(White);

  m_field[4][5]->value(Black);

  m_field[5][4]->value(Black);

}

 

Field::Field(QWidget *parent)

  : QWidget(parent), m_state(White) {

  QGridLayout *layout = new QGridLayout(this);

  this->setFixedSize(600, 600);

  for (int i = 0; i < m_n; ++i)

    for (int j = 0; j < m_n; ++j) {

      m_field[i][j] = new Dot(i, j, this);

      layout->addWidget(m_field[i][j], i, j, 1, 1);

      connect(m_field[i][j], SIGNAL(clicked()), this, SLOT(on_DotClicked()));

    }

  on_gameReset();

}

 

QVector<Dot *> *Field::getDep(int i, int j) {

  bool fl;

  int k, g;

  QVector<Dot*> tmp;

  QVector<Dot*> *lines = new QVector<Dot*>;

 

  tmp.clear();

  for (fl = false, k = j - 1; k >= 0 && Empty != m_field[i][k]->value(); --k) {

    if (m_field[i][k]->value() == m_state) {

      fl = true;

      break;

    }

    else

      tmp.push_back(m_field[i][k]);

  }

  if (fl)

    *lines += tmp;

 

  tmp.clear();

  for (fl = false, k = j + 1; k < m_n && Empty != m_field[i][k]->value(); ++k) {

    if (m_field[i][k]->value() == m_state) {

      fl = true;

      break;

    }

    else

      tmp.push_back(m_field[i][k]);

  }

  if (fl)

    *lines += tmp;

 

  tmp.clear();

  for (fl = false, k = i - 1; k >= 0 && Empty != m_field[k][j]->value(); --k) {

    if (m_field[k][j]->value() == m_state) {

      fl = true;

      break;

    }

    else

      tmp.push_back(m_field[k][j]);

  }

  if (fl)

    *lines += tmp;

  tmp.clear();

  for (fl = false, k = i + 1; k < m_n && Empty != m_field[k][j]->value(); ++k) {

    if (m_field[k][j]->value() == m_state) {

      fl = true;

      break;

    }

    else

      tmp.push_back(m_field[k][j]);

  }

  if (fl)

    *lines += tmp;

 

  tmp.clear();

  for (fl = false, g = i - 1, k = j - 1

       ; k >= 0 && g >= 0 && Empty != m_field[g][k]->value()

       ; --g, --k)

    if (m_field[g][k]->value() == m_state) {

      fl = true;

      break;

    }

    else

      tmp.push_back(m_field[g][k]);

  if (fl)

    *lines += tmp;

  tmp.clear();

  for (fl = false, g = i + 1, k = j + 1

       ; k < m_n && g < m_n && Empty != m_field[g][k]->value()

       ; ++g, ++k)

    if (m_field[g][k]->value() == m_state) {

      fl = true;

      break;

    }

    else

      tmp.push_back(m_field[g][k]);

  if (fl)

    *lines += tmp;

 

  tmp.clear();

  for (fl = false, g = i - 1, k = j + 1

       ; k < m_n && g >= 0 && Empty != m_field[g][k]->value()

       ; --g, ++k)

    if (m_field[g][k]->value() == m_state) {

      fl = true;

      break;

    }

    else

      tmp.push_back(m_field[g][k]);

  if (fl)

    *lines += tmp;

 

  tmp.clear();

  for (fl = false, g = i + 1, k = j - 1

       ; k >= 0 && g < m_n && Empty != m_field[g][k]->value()

       ; ++g, --k)

    if (m_field[g][k]->value() == m_state) {

      fl = true;

      break;

    }

    else

      tmp.push_back(m_field[g][k]);

  if (fl)

    *lines += tmp;

 

  return lines;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Информация о работе Описание программного продукта - игра «Реверси»