Автор работы: Пользователь скрыл имя, 13 Июня 2014 в 14:32, курсовая работа
В данной работе описывается игра «Реверси», написанная в соответствии с постановкой задачи на курсовой проект по предмету «Теория создания программного продукта».
Всегда с момента появления первых ПЭВМ существовал интерес пользователей к каким-либо компьютерным играм. Существуют как сложные компьютерные игры, так и относительно простые. Реверси - относительно несложная логическая игра. Основанием для разработки явилось выполнение курсовой работы.
Введение……………………………………………………………………………5
Техническое задание………………………………………………………………5
История игры………………………………………………………………………5
Сюжет игры………………………………………………………………………..5
Описание программы……………………………………………………………..6
Алгоритм…………………………………………………………………………...7
Руководство пользователя………………………………………………………...8
Описание компонент программы…………………………………………………9
Заключение………………………………………………………………….…….10
Список используемой литературы……………………………………………...11
Виджет QPushButton представляет собой командную кнопку.
Кнопка, или командная кнопка, является, по всей видимости, наиболее часто используемым виджетом в любом графическом пользовательском интерфейсе. Нажатие (щелчок) кнопки указывает компьютеру, что необходимо выполнить действие или ответить на вопрос. В данном случае за опционную кнопку New game.
QMessageBox - предоставляет собой диалог для информирования пользователя о чем либо или для получения ответа на поставленные вопросы. Выделяют основные три группы сообщений:
В данном случае выводит сообщение о победе или ничьей (“White win”, “Black win” и “draw”).
Состояния процессов
Заголовочные файлы
dot.h отвечает за расстановку, состояние и отрисовку фишек на игровом поле. Вызывает другой заголовочный файл- state.h.
state.h отвечает за цвет фишек (черный и белый цвет).
table.h отвечает за построение, состояние игрового поля. Вызывает заголовочный файл state.h.
Исходные файлы
main.cpp отвечает за работу окна программы, создания меню для кнопки “New game”. Вызывает заголовочный файл table.h. для создания игрового поля.
dot.срр отвечает за возможность постановки фишки на выбранную клетку. Вызывает заголовочный файл 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::
}
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(&
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][
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;
}
Информация о работе Описание программного продукта - игра «Реверси»