Автор работы: Пользователь скрыл имя, 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
При запуске игры появляется главное меню (Рис.2.7.1), в нем пользователь может либо начать игру, либо перейти в меню, в котором есть пункты «Об авторе», «Справка» и «Назад» (Рис.2.7.2).
При нажатии в главном меню кнопки «Начать игру» начинается матч между Красной и Синей командой. Во время матча закрыть программу можно кликнув левой кнопкой мыши по красному крестику в правом верхнем углу. После того как одна из команд забивает пять мячей на экране появляется окно, в его заголовке написано какая команда победила. В центре окна располагается кнопка выхода из программы.
Помещения
для занятий оборудуются
Конструкция одноместного стола для работы с ПЭВМ должна предусматривать:
- две раздельные поверхности: одна горизонтальная для размещения ПЭВМ с плавной регулировкой по высоте в пределах 520 - 760 мм и вторая - для клавиатуры с плавной регулировкой по высоте и углу наклона от 0 до 15 градусов с надежной фиксацией в оптимальном рабочем положении (12 - 15 градусов);
- ширину
поверхностей для ВДТ и
- опору поверхностей для ПЭВМ или ВДТ и для клавиатуры на стояк, в котором должны находится провода электропитания и кабель локальной сети. Основание стояка следует совмещать с подставкой для ног;
- отсутствие ящиков;
- увеличение ширины поверхностей до 1200 мм при оснащении рабочего места принтером.
Высота края стола, обращенного к работающему с ПЭВМ, и высота пространства для ног должны соответствовать росту обучающихся в обуви.
При наличии высокого стола и стула, несоответствующего росту обучающихся, следует использовать регулируемую по высоте подставку для ног.
Линия взора должна быть перпендикулярна центру экрана и оптимальное ее отклонение от перпендикуляра, проходящего через центр экрана в вертикальной плоскости, не должно превышать +-5 градусов, допустимое +-10 градусов.
Рабочее место с ПЭВМ оборудуют стулом, основные размеры которого должны соответствовать росту обучающихся в обуви.
Упражнения выполняются сидя или стоя, отвернувшись от экрана при ритмичном дыхании, с максимальной амплитудой движения глаз.
Закрыть глаза, сильно напрягая глазные мышцы, на счет 1-4, затем раскрыть глаза, расслабив мышцы глаз, посмотреть вдаль на счет 1-6. Повторить 4-5 раз.
Посмотреть на переносицу и задержать взор на счет 1-4. До усталости глаза не доводить. Затем открыть глаза, посмотреть вдаль на счет 1-6. Повторить 4-5 раз.
Не поворачивая головы, посмотреть направо и зафиксировать взгляд на счет 1-4, затем посмотреть вдаль прямо на счет 1-6. Аналогичным образом проводятся упражнения, но с фиксацией взгляда влево, вверх и вниз. Повторить 3-4 раза.
Перенести взгляд быстро по диагонали: направо вверх - налево вниз, потом прямо вдаль на счет 1-6; затем налево вверх направо вниз и посмотреть вдаль на счет 1-6. Повторить 4-5 раз.
На рабочем месте запрещается иметь огнеопасные вещества.
В помещениях запрещается:
а) зажигать огонь;
б) включать электрооборудование, если в помещении пахнет газом;
в) курить;
г) сушить что-либо на отопительных приборах;
д) закрывать вентиляционные отверстия в электроаппаратуре
Источниками воспламенения являются:
а) искра при разряде статического электричества
б) искры от электрооборудования
в) искры от удара и трения
г) открытое пламя
При возникновении пожароопасной ситуации или пожара персонал должен немедленно принять необходимые меры для его ликвидации, одновременно оповестить о пожаре администрацию.
Помещения с электрооборудованием должны быть оснащены огнетушителями типа ОУ-2 или ОУБ-3.
В ходе дипломной работы была разработана программа, которая показывает логическую структуру футбола, с визуализацией движения игроков. В нем были реализованы все функции заявленные в техническом задании, а именно:
Программа исправно работает. В ней присутствует понятный пользовательский интерфейс. Приложение носит чисто развлекательный характер. Можно собраться компанией друзей и болеть за одну из команд.
В программе есть некоторые недостатки: нет визуализации движения мяча, защита действует примитивно, иногда игроки нарушают границы и выходят за пределы поля.
Программу можно доработать. В дальнейших версиях появится такие возможности:
В конечном итоге из данной программы может получиться тактический тренерский симулятор.
Листинг программного кода файла «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(
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::
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->
game->getBlue()->getPlayer1()-
pt->drawPoint(QPointF(game->
game->getBlue()->getPlayer2()-
pt->drawPoint(QPointF(game->
game->getBlue()->getGoalkeeper
pt->setPen(QPen(Qt::red, del));
pt->drawPoint(QPointF(game->
game->getRed()->getPlayer1()->
pt->drawPoint(QPointF(game->
game->getRed()->getGoalkeeper(
pt->drawPoint(QPointF(game->
game->getRed()->getPlayer2()->
pt->setPen(QPen(Qt::green, del/2));
pt->drawPoint(QPointF(game->
game->getBall()->getY()*del+
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(
{
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()/
}
}
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()/
}
}
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())
Информация о работе Разработка приложения: футбольный симулятор