Разработка приложения: футбольный симулятор

Автор работы: Пользователь скрыл имя, 18 Ноября 2013 в 21:14, дипломная работа

Краткое описание

Темой своей работы я выбрал реализацию футбольного симулятора, так как люблю этот вид спорта, а так же считаю его наиболее популярным. В мои задачи входит:
Создать интерфейс, реализующий передвижения игроков
Написать логическую структуру игры (движение игроков, пас, удар)
Реализовать атаку и защиту команд
Для реализации проекта я выбрал язык С++ и кроссплатформенную среду разработки Qt5.0.2

Содержание

ВВЕДЕНИЕ 7
1. ПРЕДВАРИТЕЛЬНЫЙ АНАЛИЗ 4
2. ОСНОВНЫЕ ПРОЕКТНЫЕ РЕШЕНИЯ 6
2.1. Постановка задачи 6
2.2. Требования к программе 6
2.2.1. Требования к функциональным характеристикам 6
2.2.2. Требования к надежности 6
2.2.3. Требования к составу технических средств 7
2.2.4. Требования к программной совместимости 7
2.3. Обоснование выбора среды разработки 7
2.4. Организация входных и выходных данных 8
2.4.1. Выходные данные 8
2.5. Разработка пользовательского интерфейса 8
2.6. Словесное описание алгоритма 9
2.6.1. Описание логики игры 9
2.6.2. Описание структуры классов 11
2.7. Тестирование 11
2.8. Руководство пользователя 14
2.8.1. Общие сведения о программном продукте 14
2.8.2. Описание запуска 15
2.8.3. Инструкция по работе 15
3. ОРГАНИЗАЦИОННЫЙ РАЗДЕЛ 16
3.1. Требования к рабочему месту 16
3.2. Зрительная гимнастика 17
3.3. Требования пожаробезопасности при работе на вычислительной технике 17
ЗАКЛЮЧЕНИЕ 18
Список используемой литературы 19

Прикрепленные файлы: 1 файл

ДипломПЗ.doc

— 969.50 Кб (Скачать документ)
      1. Инструкция по работе

При запуске игры появляется главное  меню (Рис.2.7.1), в нем пользователь может либо начать игру, либо перейти в меню, в котором есть пункты «Об авторе», «Справка» и «Назад» (Рис.2.7.2).

При нажатии в главном меню кнопки  «Начать игру» начинается матч между Красной и Синей командой. Во время матча закрыть программу можно кликнув левой кнопкой мыши по красному крестику в правом верхнем углу. После того как одна из команд забивает пять мячей на экране появляется окно, в его заголовке написано какая команда победила. В центре окна располагается кнопка выхода из программы.

  1. Организационный раздел

    1. Требования к рабочему месту

 

Помещения для занятий оборудуются одноместными столами, предназначенными для работы с ПЭВМ.

Конструкция одноместного стола для работы с ПЭВМ должна предусматривать:

- две  раздельные поверхности: одна  горизонтальная для размещения  ПЭВМ с плавной регулировкой  по высоте в пределах 520 - 760 мм  и вторая - для клавиатуры с  плавной регулировкой по высоте и углу наклона от 0 до 15 градусов с надежной фиксацией в оптимальном рабочем положении (12 - 15 градусов);

- ширину  поверхностей для ВДТ и клавиатуры  не менее 750 мм (ширина обеих  поверхностей должна быть одинаковой) и глубину не менее 550 мм;

- опору  поверхностей для ПЭВМ или ВДТ и для клавиатуры на стояк, в котором должны находится провода электропитания и кабель локальной сети. Основание стояка следует совмещать с подставкой для ног;

- отсутствие  ящиков;

- увеличение  ширины поверхностей до 1200 мм  при оснащении рабочего места принтером.

Высота  края стола, обращенного к работающему  с ПЭВМ, и высота пространства для  ног должны соответствовать росту  обучающихся в обуви.

При наличии  высокого стола и стула, несоответствующего росту обучающихся, следует использовать регулируемую по высоте подставку для ног.

Линия взора должна быть перпендикулярна  центру экрана и оптимальное ее отклонение от перпендикуляра, проходящего через  центр экрана в вертикальной плоскости, не должно превышать +-5 градусов, допустимое +-10 градусов.

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

 

 

    1. Зрительная гимнастика

Упражнения выполняются сидя или  стоя, отвернувшись от экрана при ритмичном  дыхании, с максимальной амплитудой движения глаз.

Закрыть глаза, сильно напрягая глазные мышцы, на счет 1-4, затем раскрыть глаза, расслабив  мышцы глаз, посмотреть вдаль на счет 1-6. Повторить 4-5 раз.

Посмотреть  на переносицу и задержать взор на счет 1-4. До усталости глаза не доводить. Затем открыть глаза, посмотреть вдаль на счет 1-6. Повторить 4-5 раз.

Не  поворачивая головы, посмотреть направо  и зафиксировать взгляд на счет 1-4, затем посмотреть вдаль прямо  на счет 1-6. Аналогичным образом проводятся упражнения, но с фиксацией взгляда влево, вверх и вниз. Повторить 3-4 раза.

Перенести взгляд быстро по диагонали: направо  вверх - налево вниз, потом прямо  вдаль на счет 1-6; затем налево вверх  направо вниз и посмотреть вдаль  на счет 1-6. Повторить 4-5 раз.

    1. Требования пожаробезопасности при работе на вычислительной технике 

На рабочем месте запрещается  иметь огнеопасные вещества.

В помещениях запрещается:

а) зажигать огонь;

б) включать электрооборудование, если в помещении  пахнет газом;

в) курить;

г) сушить что-либо на отопительных приборах;

д) закрывать  вентиляционные отверстия в электроаппаратуре

Источниками воспламенения являются:

а) искра  при разряде статического электричества

б) искры  от электрооборудования

в) искры  от удара и трения

г) открытое пламя

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

Помещения с электрооборудованием должны быть оснащены огнетушителями типа ОУ-2 или ОУБ-3.

Заключение

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

      • Разработать приложение Футбольный симулятор.

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

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

Программу можно доработать. В дальнейших версиях появится такие возможности:

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

В конечном итоге из данной программы  может получиться тактический тренерский симулятор.

 

Список используемой литературы

      1. Жасмин Бланшет, Марк Саммерфилд. QT4 программирование GUI на C++. - М.:КУДИЦ-ПРЕСС, 2008. – 738 с.
      2. Макс Шлее. Профессиональное программирование на C++. - Спб.: БХВ-Петербург, 2010. – 896 с.
      3. Стивен Прата. Язык программирования C++. Лекции и упражнения. – М.: Вильямс, 2012. – 1248 с.
      4. Джесс Либерти. Освой самостоятельно C++ за 21 день. – М.: Вильямс, 2009. – 820 с.
      5. Стенли Б. Липпман, Жози Лажойе. Язык программирования C++. Вводный курс. – Спб.: Невский Диалект, 2001. – 1104 с.

Интернет ресурсы

      1. Справочная информация по Qt. [Электронный ресурс] – Режим доступа: http://qt-project.org (Дата обращения 12.05.2013 г.)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Приложения

Приложение А

Листинг программного кода файла «MainWindow.cpp»

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include <QPainter>

#include <QTimer>

#include "QTime"

 

 

 

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)

{

    ui->setupUi(this);

    form = new start(this);

    form2 = new restart(this);

    form->show();

    box = new QMessageBox(this);

    form->setGeometry(this->width()+180,this->height(), 200, 200);

    form->num = 1;

    pole = new Pole();

    this->resize(pole->getWidth(), pole->getHeight());

    game = new Game();

    timer = new QTimer(this); // создается  таймер

    connect(timer, SIGNAL(timeout()), this , SLOT(update()));  // создается таймер

    timer->start(750); // запуск таймера

    QTime midnight(0,0,0);

    qsrand(midnight.secsTo(QTime::currentTime()));

    label = new QLabel(this);

    red = new QLabel(this);

    blue = new QLabel(this);

}

MainWindow::~MainWindow()

{

    delete ui;

}

 

void MainWindow::matrix(int fieldW, int fieldH, int marginW, int marginH)

{

    int x = 0; // координата х

    int del = fieldW/pole->getMasI(); // вычисляется размер участка поля

    label->setMargin(10);

    label->setFixedSize(200,50);

    QFont font = label->font();

    font.setPixelSize(20);

    label->setFont(font);

    red->setFont(font);

    blue->setFont(font);

    label->setText("Blue   :   Red");

    red->setFixedSize(200,50);

    red->setMargin(75);

    blue->setFixedSize(200,50);

    blue->setMargin(55);

    red->setNum(game->redGool);

    blue->setNum(game->blueGool);

 

 

 

    pt->setPen(QPen(Qt::green, 3));

    pt->drawLine(fieldW/2 + marginW, marginH, fieldW/2+marginW, fieldH+marginH); // центральная линия

    pt->setPen(QPen(Qt::green, 5));

 

    pt->drawLine(marginW, fieldH/2+del,marginW, fieldH/2-del);

    pt->drawLine(fieldW+marginW, fieldH/2+del, fieldW+marginW, fieldH/2-del);

 

    pt->setPen(QPen(Qt::blue, del));

    pt->drawPoint(QPointF(game->getBlue()->getPlayer1()->getX()*del+marginW,

                          game->getBlue()->getPlayer1()->getY()*del+marginH));

    pt->drawPoint(QPointF(game->getBlue()->getPlayer2()->getX()*del+marginW,

                          game->getBlue()->getPlayer2()->getY()*del+marginH));

    pt->drawPoint(QPointF(game->getBlue()->getGoalkeeper()->getX()*del+marginW,

                          game->getBlue()->getGoalkeeper()->getY()*del+marginH));

    pt->setPen(QPen(Qt::red, del));

    pt->drawPoint(QPointF(game->getRed()->getPlayer1()->getX()*del+marginW,

                          game->getRed()->getPlayer1()->getY()*del+marginH));

    pt->drawPoint(QPointF(game->getRed()->getGoalkeeper()->getX()*del+marginW,

                          game->getRed()->getGoalkeeper()->getY()*del+marginH));

    pt->drawPoint(QPointF(game->getRed()->getPlayer2()->getX()*del+marginW,

                          game->getRed()->getPlayer2()->getY()*del+marginH));

    pt->setPen(QPen(Qt::green, del/2));

    pt->drawPoint(QPointF(game->getBall()->getX()*del+marginW,

                          game->getBall()->getY()*del+marginH));

    pt->setPen(QPen(Qt::gray, 1));

    while(x<=fieldW) // вертикаль

    {

        pt->drawLine(marginW+x, marginH, marginW+x, fieldH+marginH); // рисуется вертикальная  линия

        x+=del; // к х прибавляется растояние до следующего квадрата

    }

    int y = 0; // координата y

    while(y<=fieldH) // горизонталь

    {

        pt->drawLine(marginW, marginH+y, fieldW+marginW, marginH+y); // рисуется горизонтальная линия

        y+=del; // к у прибавляется растояние до следующего квадрата

    }

}

void MainWindow::proportion()

{

    int height = 0; //высота поля

    int width = 0; // ширина поля

    height = this->height(); // получить реальную высоту

    width = this->width(); // получить реальную ширину

    int marginW = 0; // отступ по вертикали

    int marginH = 0; // отступ по горизонтали

    int fieldH; // размер поля

    int fieldW;

    if (width/height >= 2) // если большая ширина

    {

        fieldH = height;

        fieldW = height*2;

        marginW = (width - fieldW)/2; // отступ по вертикали с каждой стороны

        matrix(fieldW, fieldH, marginW);

    }

    else

    {

        fieldW = width;

        fieldH = fieldW/2;

        marginH = (height-fieldH)/2; // отступ по горизонтали с каждой  стороны

        matrix(fieldW, fieldH, 0, marginH);

    }

}

 

void MainWindow::paintEvent(QPaintEvent *pe)

{

    pt = new QPainter(this);

    proportion();

    if(form->num == 0)

        game->play();

    if(game->blueGool == 5)

    {

        timer->stop();

        form2->setWindowTitle("Победили  Синие");

        form2->show();

    }

    else if (game->redGool == 5)

    {

        timer->stop();

        form2->setWindowTitle("Победили  Красные");

        form2->show();

    }

    pt->end();

}

Приложение В

Листинг программного кода файла «Game.cpp»

#include "game.h"

#include <QDebug>

 

int Game::redGool = 3;

int Game::blueGool = 3;

Game::Game()

{

    red = new Comanda(1);

    blue = new Comanda();

    ball = new Ball(20, 12);

    ball->setStart(0);

}

Comanda * Game::getBlue() {return blue;}

Comanda * Game::getRed() {return red;}

Ball * Game::getBall() {return ball;}

void Game::striceRed(Player * player)

{

    int val = qrand() % 3; // случайное  число

    if(val == 0)

    {

        ball->coord(player); // мячу присваиваются координаты  вратаря

        red->whouBall++;

    }

    else if(val == 1)

    {

        goolBlue(); // метод  гол

        redGool++;

        ball->setX(red->getBorder()); // мяч в воротах

        ball->setY(blue->getBorder()/4);

    }

}

void Game::striceBlue(Player * player)

{

    int val = qrand() % 3; // случайное  число

    if(val == 0)

    {

        ball->coord(player); // мячу присваиваются координаты вратаря

        blue->whouBall++;

    }

    else if(val == 1)

    {

        goolRed(); // метод  гол

        blueGool++;

        ball->setX(blue->getBorder()); // мяч в воротах

        ball->setY(blue->getBorder()/4);

    }

}

void Game::lineOffset(Player * player)

{

    if (player->getLineBottom() == 1)

        player->setY(player->getY()-1);

    if (player->getLineTop() == 1)

        player->setY(player->getY()+1);

    if((player->getX() == blue->getPlayer1()->getX() && player->getY() == blue->getPlayer1()->getY())

      || (player->getX() == blue->getPlayer2()->getX() && player->getY() == blue->getPlayer2()->getY()))

        player->setX(player->getX()+1);

    else

        player->setX(player->getX()-1);

    if (player->getY() == blue->getBorder()/4 ||

            player->getY() == blue->getBorder()/4+1 || player->getY() == blue->getBorder()/4-1)

    {

        player->setLineBottom(0);

        player->setLineTop(0);

    }

    ball->coord(player);

}

void Game::redAt() // проверяет кто из игроков команды с мячем

{

        if (red->getPlayer1()->getX() == ball->getX() && red->getPlayer1()->getY() == ball->getY()) // проверка кто с мячом

        {

            plNotBallRed(red->getPlayer2());

            plBallRed(red->getPlayer1());

        }

        else

        {

            plNotBallRed(red->getPlayer1());

            plBallRed(red->getPlayer2());

        }

        def(blue->getPlayer1(), red->getPlayer1());

        def(blue->getPlayer2(), red->getPlayer2());

}

void Game::pas(Player * pl1, Player * pl2)

{

    if(ball->getPas() % 2 == 0) // отдать  пас

                   {

                       ball->coord(pl1); // перезаписать координаты мяча

                       ball->plusPas(); // поменять игрока с мячом

                   }

                   else

                   {

                       ball->coord(pl2);

                       ball->plusPas();

                   }

}

void Game::borderOffset(Player *player)

{

    if(player->getY() >= blue->getBorder()/2-5) // если пересечена граница по у

        player->setLineBottom(1);

    else if(player->getY() <= red->getBorder()+5)

        player->setLineTop(1);

}

void Game::blueAt()

{

    if (ball->getPas() % 2 != 0) // проверка кто с мячом

    {

        plNotBallBlue(blue->getPlayer2());

        plBallBlue(blue->getPlayer1());

Информация о работе Разработка приложения: футбольный симулятор