Разработка объектно–ориентированной программы с пользовательским интерфейсом
Разработка игры "Танчики" в операционной системе MS Windows. Язык программирования: C++. Пользовательский интерфейс программы, которая будет работать в графическом режиме видеосистемы. Описание процесса разработкии и тестирования, листинг программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 22.02.2019 |
Размер файла | 792,2 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Министерство образования Российской Федерации
Пензенский государственный университет
Кафедра «Вычислительная техника»
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовой работе
по курсу «Технологии программирования»
на тему: Разработка объектно-ориентированной программы с пользовательским интерфейсом
Выполнил:
студент группы 15ВВ2
Брусникин Е.С.
Принял:
Дорошенко И.Н.
Пенза 2018
Введение
На сегодняшний день существует множество различных средств вычислительной техники, позволяющих существенно повысить эффективность деятельности инженеров при решении различных задач. Знание основных методов и приемов программирования нужны не только будущему программисту, но и любому специалисту, использующему компьютер в своей профессиональной деятельности -- это способствует развитию строгого «алгоритмического» мышления, пониманию основных принципов устройства и работы компьютера, умению грамотно сформулировать задачу для разработчиков прикладного программного обеспечения. игра операционный интерфейс видеосистема
Язык С++ как средство обучения программированию обладает рядом несомненных достоинств. Он хорошо организован, строг, большинство его конструкций логичны и удобны. Развитые средства диагностики и редактирования кода делают процесс программирования приятным и эффективным.
Немаловажно, что С++ является не учебным, а профессиональным языком, предназначенным для решения широкого спектра задач, и в первую очередь - в быстро развивающейся области создания распределенных приложений.
Целью исследования, проводимого в рамках настоящей курсовой работы, является разработка объектно - ориентированной программы с пользовательским интерфейсом.
Данная программа является игрой «Танчики», созданной с применением свободной библиотеки SDL.
1. Постановка задачи
Необходимо разработать игру «Танчики». Она должна соответствовать следующим требованиям:
1. Пользователь управляет танком, который перемещается по полю и производит выстрелы.
2. Объекты получают урон от выстрелов.
3. Танк при перемещении не может проходит сквозь другие танки и стены.
4. Игра осуществляется по сети, транспортный протокол - TCP.
5. Пользователь может переподключится к серверу даже во время партии.
6. Программа должна быть разработана в операционной системе MSWindows.
7. Среда разработки: MSVisualStudio 2013. Язык программирования: C++.
Программа должна иметь пользовательский интерфейс и работать в графическом режиме работы видеосистемы. Необходимо определиться с элементами управления.
Устройство ввода - вывода - клавиатура, компьютерная мышь. Необходимо научиться анализировать события, возникающие от работы с клавиатурой или мышью. Нужно однозначно идентифицировать и выполнять те или иные действия в зависимости от действий пользователя. Это необходимо для легкого использования программы.
2. Выбор решения
Для написания данной игры будет использован язык программирования С++.
В качестве библиотеки обеспечивающий пользовательский ввод, отображение поля и обмен данными по сети используется библиотека SDL. Она бесплатна и имеет открытые исходные коды.
Рисунок 1 - UML диаграмма состояний
Рисунок 2 - UML диаграмма активностей
3. Описание разработки программы
В первую очередь необходимо было определить, какие объекты могут быть на игровом поле, их свойства и методы. Для представление схожих параметров объектов, был выделен абстрактный класс CGameObject, который хранит в себе положение объекта, его «здоровье» и уникальный номер, необходимый для стыковки клиента и сервера. Поле хранится в виде набора объектов внутри ассоциированного массива из STL. Выбор такого контейнера - не случайный, его реализация основана на красно-черных деревьях, что положительно сказывается на скорости вставки объектов, например, при стрельбе, удалении при уничтожении объектов и поиске во всех операциях обработки.
После этого были созданы класс для представления соединения, класс пакетной передачи и приема, а также класс реализующий сервер.
Сервер после проведения инициализации в виде загрузки уровня и создания промежуточных хранилищ, запускает отдельный поток. Поэтому код сервера и локального клиента выполняются параллельно.
После написания основной части программы были также доработаны мелочи в виде загрузки уровня из файла, автоматической смены уровня при конце раунда и тп.
4. Отладка и тестирование
В качестве среды разработки была выбрана программа MSVisualStudio. Программа предоставляет обширные средства, необходимые при разработке игры и отладке модулей и программ. Для отладки использовался, анализ содержимого локальных и глобальных переменных, анализ содержимого памяти.
Тестирование проводилось в рабочем порядке в процессе разработки, после завершения написания программы. В ходе тестирования были выявлены синтаксические и логические ошибки, исправленыпроблемы, связанные с подсчетом и выводом на экран набранного количества очков и др.
Рассмотрим некоторые виды тестирования программ.
По объекту тестирования:
· Функциональное тестирование
· Нагрузочное тестирование
· Тестирование производительности
· Тестирование стабильности
· Тестирование удобства использования
· Тестирование интерфейса пользователя
· Тестирование безопасности
· Тестирование локализации
· Тестирование совместимости
По знанию системы:
· Тестирование чёрного ящика
· Тестирование белого ящика
· Тестирование серого ящика
По степени автоматизированности:
· Ручное тестирование
· Автоматизированное тестирование
· Полуавтоматизированное тестирование
5. Описание программы
После запуска программа находится в состоянии ожидания. Если нажать в этот момент «1», то программа запустит локальный сервер и подключится к нему. После этого остальные клиенты также могут подключиться. Сервер будет принимать соединения, до тех пор, пока количество клиентов не превысит определенное число. После подключения клиент получает актуальное состояния игрового поля, а также ему назначается объект Player, которым он будет управлять. Начальное положение игроков задается в файле с игровым уровнем.
На экране, во время игры, пользователь видит игровое поле. На нем синим цветов обозначены препятствия, красным - другие игроки, зеленым - он сам, а желтым снаряды. После получения достаточного для уничтожения количества урона объект удаляется с игрового поля. Если уничтожили пользователя, то до конца раунда он видит надпись “Youlose=(“, при этом остальное поле продолжает синхронизироваться с сервером, что позволяет досмотреть игру до конца.
Рисунок 3 - основной игровой процесс
Рисунок 4 - UML диаграмма последовательностей
Разработанная программа состоит из следующих файлов:
Группа классов игры:
1. Game- класс описывающий состояние игры и ее поведение.
2. GameField- класс, который хранит игровое поле в виде набора объектов. Имеет методы для сериализации для отправки по сети, а также загрузки уровня из файла.
3. GameObject - абстрактный класс, объединяющий общие параметры игровых объектов.
4. Obstacle - игровой объект - препятствие.
5. Player - игровой объект - этим объектом управляет игрок.
6. Projectile - игровой объект - снаряд.
7. Server - класс хранящий состояние сервера и обрабатывающий приходящую информацию от клиентов.
8. Globals - класс «синглтон», который хранит все глобальные переменные игры, такие как размер экрана.
Группа классов для работы с сетью:
1. Connection- класс «обертка» для более удобной работы с подключениями.
2. PacketStream - класс для пакетной обработки информации, передаваемой по сети. Нужен в виду использования TCP соединений.
Группа классов необходимых для отображения визуальной составляющей:
1. Renderer - класс «обертка» для управления рендером SDL.
2. Window - класс «обертка» для управления окнамиSDL.
3. TextWriter - класс, реализующий вывод текста на экран, с использованием внешних шрифтов.
Общие файлы:
1. Types.h - файл, с представлениями типов и перечислений, используемых в программе.
2. TankWars.cpp - файл, с которого начинается выполнение программы. В нем инициализируются подключенные библиотеки, а затем запускается игра.
Каждый из вышеперечисленных классов хранится в отдельной паре файлов, файл с расширением h-хранит описание класса, а cpp-реализацию его методов.
Рисунок 5 - UML диаграмма классов
6. Руководство пользователя
Для начала игры необходимо чтобы оба пользователя запустили программу у себя на компьютере. После запуска один из пользователей нажимает у себя клавишу «1», а остальные любую другую на клавиатуре. После соединения игра начинается.
Рисунок 6 - игровой процесс
Танк игрока отмечен зеленым цветом, для перемещения необходимо использовать клавиши со стрелками. Для выстрела, необходимо нажать клавишу «пробел». После выстрела начинается перезарядка. Танк стреляет в направлении последнего движения. Выход из игры производится закрытием окна.
Если игрок по той или иной причине отключился от сервера, он может заново запустить программу и подключится прямо в процессе игры, при условии что сервер не прекратил свою работу.
Рисунок 7 - UML диаграмма прецедентов
Заключение
При выполнении данной курсовой работы были получены навыки разработки объектно - ориентированной программы с пользовательским интерфейсом. Были освоены способы обработки событий от клавиатуры и компьютерной мыши, усвоены механизмы реализации меню через работу с кнопками. Получены навыки разработки программ на языке программирования C++.
В рамках выполнения курсовой работы была разработана игра «Танчики». В ходе работы был реализован пользовательский графический интерфейс.
В дальнейшем программу можно улучшить, добавив новые функции, такие как бонусы и текстуры для объектов.
Список используемых источников
1. Бьёрн Страуструп. Язык программирования С++. 1986 г.
2. Цикл статей «Мультиплеер в быстрых играх». https://habrahabr.ru/post/302394/
3. Оффициальная документация SDL на сайте wiki.libsdl.org
4. MSDN
Приложение
Листинг программы
Приложение А. 1 - Файл «Game.h»
#pragmaonce
#include"stdafx.h"
#include"GameField.h"
#include"Player.h"
#include"Globals.h"
#include"Projectile.h"
#include"Types.h"
classCGame
{
public:
CGame();
~CGame();
voidStart();
voidRender(intTimeDelta);
private:
boolLoadConfig(wstringpath);
voidInitGlobals();
intKeyHandler(SDL_Event&e, intprev);
CGameFieldfield;
};
CGameObject* CheckCollision(CGameField&gf, CGameObject *obj);
Файл «Game.cpp»
#include"Game.h"
#include"Server.h"
#include"Connection.h"
usingnamespacestd;
CGame::CGame()
{
}
CGame::~CGame()
{
}
voidCGame::InitGlobals(){
CGlobals&glob = CGlobals::Instance();
glob.scr.window = newCWindow(
"TankWars",
glob.scr.width,
glob.scr.height,
glob.scr.fullscreen);
glob.scr.ren = newCRenderer(glob.scr.window);
}
voidCGame::Start()
{
if (!LoadConfig(L"config.cfg"))
return;
InitGlobals();
CGlobals&glob = CGlobals::Instance();
glob.client_id = -1;
CServer *server = nullptr;
SDL_Evente;
while (true)
{
SDL_WaitEvent(&e);
if (e.type == SDL_QUIT)
return;
if (e.type == SDL_KEYDOWN)
{
if (e.key.keysym.scancode == SDL_SCANCODE_1)
{
server = newCServer(1234);
#ifdef _DEBUG
SDL_SetWindowPosition(*glob.scr.window, 1940, 50);
system("start ..\\Debug\\TankWars.exe");
#endif// _DEBUG
break;
}
elseif (e.key.keysym.scancode == SDL_SCANCODE_ESCAPE)
return;
else
break;
}
}
char *buffer = newchar[1024];
SPacket *pack = (SPacket*)buffer;
SPacketPayload *payload = (SPacketPayload*)pack->data;
CConectioncon;
if (server)
{
server->LoadLevel("resources\\levels\\3.txt");
server->Start();
}
while (!con.Open("localhost", 1234));
CPacketStreamps(&con);
intresult;
SDL_Log("Connected to server");
SDL_Log("Waiting for level");
do{
ps.Recieve();
} while (ps.PacketCount() < 2);
ps>>pack;
glob.client_id = payload->client;
ps>>pack;
field.Deserialize(pack->size, pack->data);
SDL_Log("Level loaded");
boolskip = true;
for (autoit = field.store.begin(); it != field.store.end(); ++it)
{
autoitem = it->second;
if (item->client == glob.client_id&&item->GetType() == Player)
{
glob.ply = (CPlayer*)item;
break;
}
}
Uint32Ticks, RenderTick, CalcTick;
CalcTick = RenderTick = SDL_GetTicks();
intman = 0;
SDL_Recttest = { 0, 0, 0, 0 };
boolshoot = false;
while (true)
{
result = SDL_PollEvent(&e);
if (result)
{
if (e.type == SDL_QUIT)
break;
if (e.type == SDL_KEYDOWN || e.type == SDL_KEYUP)
{
if (glob.ply)
glob.ply->manipulator = KeyHandler(e, glob.ply->manipulator);
}
}
if (con.Check())
{
result = ps.Recieve();
if (!result)
{
gotocleanup;
}
result = ps.PacketCount();
if (result> 0)
{
intcursor = 0;
while (cursor<result)
{
ps>>pack;
if (pack->size>sizeof(SPacketPayload))
{
field.Deserialize(pack->size, pack->data);
for (autoit = field.store.begin(); it != field.store.end(); ++it)
{
autoitem = it->second;
if (item->client == glob.client_id&&item->GetType() == Player)
{
glob.ply = (CPlayer*)item;
break;
}
}
}
else
{
if (field.store.count(payload->id) > 0)
{
autoitem = field.store[payload->id];
if (payload->hp<= 0)
{
if (glob.ply&&item->id == glob.ply->id)
glob.ply = nullptr;
intposition = item->id;
deleteitem;
field.store.erase(position);
}
else
{
item->x = payload->x;
item->y = payload->y;
}
}
elseif (payload->type == Projectile)
{
CProjectile *proj = newCProjectile(payload->x, payload->y, payload->direction);
proj->hp = payload->hp;
proj->id = payload->id;
field.store[proj->id] = proj;
}
}
cursor++;
}
}
}
if (glob.ply)
{
Ticks = SDL_GetTicks();
shoot |= (glob.ply->manipulator&EM_SHOOT) && (glob.ply->reload == 0);
if (Ticks - CalcTick> 30)
{
glob.ply->Calc(Ticks - CalcTick);
CGameObject *target = CheckCollision(field, glob.ply);
if (target)
{
switch(glob.ply->direction){
caseEM_UP: glob.ply->y = target->y + 80; break;
caseEM_DOWN: glob.ply->y = target->y - 80; break;
caseEM_LEFT: glob.ply->x = target->x + 80; break;
caseEM_RIGHT: glob.ply->x = target->x - 80; break;
default: break;
}
}
pack->size = sizeof(SPacketPayload);
FillPacketData(payload, glob.ply);
payload->client = glob.client_id;
if (test.x != glob.ply->x || test.y != glob.ply->y)
{
test.x = glob.ply->x;
test.y = glob.ply->y;
ps<<pack;
}
if (shoot&&glob.ply->reload == 0)
{
payload->type = Projectile;
payload->direction = glob.ply->direction;
ps<<pack;
glob.ply->reload = 1000;
shoot = false;
}
ps.Send();
CalcTick = SDL_GetTicks();
}
}
else
{
if (server)
server->LoadLevel("resources\\levels\\2.txt");
}
Ticks = SDL_GetTicks();
if (Ticks - RenderTick> 15)
{
Render(Ticks - CalcTick);
RenderTick = SDL_GetTicks();
}
else
SDL_Delay(1);
}
cleanup:
deleteserver;
deleteglob.scr.ren;
deleteglob.scr.window;
}
voidCGame::Render(intTimeDelta)
{
CGlobals&glob = CGlobals::Instance();
SDL_Rectpos;
staticCTextWritertext("resources\\font.ttf");
SDL_SetRenderDrawColor(*glob.scr.ren, 0, 0, 0, SDL_ALPHA_OPAQUE);
SDL_RenderClear(*glob.scr.ren);
SDL_Rectrect;
SDL_SetRenderDrawColor(*glob.scr.ren, 0, 0, 255, SDL_ALPHA_OPAQUE);
intcell = 80;
for (autoit = field.store.begin(); it != field.store.end(); ++it)
{
autoitem = it->second;
rect = { item->x, item->y, cell, cell };
if (item->GetType() == Player)
{
if (((CPlayer*)(item))->client == glob.client_id)
SDL_SetRenderDrawColor(*glob.scr.ren, 0, 255, 0, 255);
else
SDL_SetRenderDrawColor(*glob.scr.ren, 255, 0, 0, 255);
}
elseif (item->GetType() == Projectile)
{
rect.w /= 2;
rect.h /= 2;
SDL_SetRenderDrawColor(*glob.scr.ren, 255, 255, 0, 255);
}
else
SDL_SetRenderDrawColor(*glob.scr.ren, 0, 0, 255, 255);
SDL_RenderFillRect(*glob.scr.ren, &rect);
}
if (!glob.ply&&text.success)
{
text.WriteText(glob.scr.ren, L"You lose =(", 255, 0, 0, glob.scr.width / 2, glob.scr.height / 2, true);
}
SDL_RenderPresent(*glob.scr.ren);
}
boolCGame::LoadConfig(wstringpath)
{
ifstream in;
in.open(path);
if (!in)
returnfalse;
CGlobals&glob = CGlobals::Instance();
in>>glob.scr.width>>glob.scr.height>>glob.scr.fullscreen;
in.close();
returntrue;
}
intCGame::KeyHandler(SDL_Event&e, intprev)
{
autokey = e.key.keysym.scancode;
intresult = prev;
if (e.type == SDL_KEYDOWN)
{
result |= key == SDL_SCANCODE_UP ? EM_UP : 0;
result |= key == SDL_SCANCODE_DOWN ? EM_DOWN : 0;
result |= key == SDL_SCANCODE_LEFT ? EM_LEFT : 0;
result |= key == SDL_SCANCODE_RIGHT ? EM_RIGHT : 0;
result |= key == SDL_SCANCODE_SPACE ? EM_SHOOT : 0;
}
elseif (e.type == SDL_KEYUP)
{
result&= key == SDL_SCANCODE_UP ? ~EM_UP : 0xff;
result&= key == SDL_SCANCODE_DOWN ? ~EM_DOWN : 0xff;
result&= key == SDL_SCANCODE_LEFT ? ~EM_LEFT : 0xff;
result&= key == SDL_SCANCODE_RIGHT ? ~EM_RIGHT : 0xff;
result&= key == SDL_SCANCODE_SPACE ? ~EM_SHOOT : 0xff;
}
returnresult;
}
CGameObject* CheckCollision(CGameField&gf, CGameObject *obj)
{
SDL_Rectourrect, targetrect, result;
ourrect = { obj->x, obj->y, 80, 80 };
if (obj->GetType() == Projectile)
ourrect.w = ourrect.h = 40;
for (autoit = gf.store.begin(); it != gf.store.end(); ++it)
{
autoitem = it->second;
if (item->GetType() == Projectile)
continue;
if (item->id == obj->id)
continue;
targetrect = { item->x, item->y, 80, 80 };
if (SDL_IntersectRect(&ourrect, &targetrect, &result)){
returnitem;
}
}
returnnullptr;
}
Приложение А. 3 - Файл «Server.h»
#pragmaonce
#include"stdafx.h"
#include"types.h"
#include"GameField.h"
#include"Connection.h"
#include"PacketStream.h"
classCServer
{
public:
CServer(intport);
~CServer();
voidLoadLevel(stringpath);
voidStart();
boolGetState();
voidProcess(intTimeDelta, CPacketStream **ps, intcnt);
private:
staticintCServer::HandlerThread(void *ptr);
SDL_SpinLockrestart[2];
char *buffer;
CConectionserver;
SDL_Thread *handler = NULL;
CGameFieldgf;
boolstop;
};
ПриложениеА. 4 - Файл «Server.cpp»
#include"stdafx.h"
#include"Server.h"
#include"Projectile.h"
#include"Player.h"
#include"Game.h"
CServer::CServer(intport)
{
stop = true;
buffer = newchar[1024];
restart[0] = restart[1] = 0;
server.Open("", port);
}
CServer::~CServer()
{
delete[] buffer;
stop = true;
if (handler)
SDL_WaitThread(handler, NULL);
}
voidCServer::LoadLevel(stringpath)
{
SDL_AtomicLock(&restart[0]);
SDL_AtomicLock(&restart[1]);
if (!gf.LoadLevel(path))
SDL_Log("Can't open file %s", path.c_str());
SDL_AtomicUnlock(&restart[0]);
SDL_AtomicUnlock(&restart[1]);
}
voidCServer::Start()
{
if (gf.store.empty())
{
SDL_Log("Should load level first!");
return;
}
if (handler == NULL)
{
stop = false;
handler = SDL_CreateThread(HandlerThread, "Handler", this);
if (handler == NULL)
{
SDL_Log("Can't create handler thread: %s", SDL_GetError());
return;
}
}
else
{
SDL_Log("Server already started");
}
}
boolCServer::GetState()
{
return !stop;
}
voidCServer::Process(intTimeDelta, CPacketStream **ps, intcnt)
{
intpacketCount[16];
staticintindex = 10000;
SPacket *pack = (SPacket*)buffer;
SPacketPayload *payload = (SPacketPayload*)pack->data;
queue<int>todelete;
for (inti = 0; i<cnt; i++)
packetCount[i] = ps[i]->PacketCount();
for (inti = 0; i<cnt; i++)
{
for (intj = 0; j<packetCount[i]; j++)
{
*ps[i] >>pack;
if (payload->type == Player)
{
autoply = gf.store[payload->id];
ply->x = payload->x;
ply->y = payload->y;
FillPacketData(payload, ply);
for (intk = 0; k<cnt; k++)
{
if (i != k)
*ps[k] <<pack;
}
}
if (payload->type == Projectile)
{
CProjectile *proj = newCProjectile(payload->x, payload->y, payload->direction);
proj->hp = 1;
switch (proj->direction)
{
caseEM_UP: proj->y -= 40; proj->x += 20; break;
caseEM_DOWN: proj->y += 80; proj->x += 20; break;
caseEM_LEFT: proj->y += 20; proj->x -= 40; break;
caseEM_RIGHT: proj->y += 20; proj->x += 80; break;
default:
break;
}
proj->id = payload->id = index++;
gf.store[proj->id] = proj;
payload->hp = proj->hp;
for (intk = 0; k<cnt; k++)
*ps[k] <<pack;
}
}
}
pack->size = sizeof(SPacketPayload);
for (autoit = gf.store.begin(); it != gf.store.end(); ++it)
{
autoitem = it->second;
if (item->GetType() == Projectile)
{
item->Calc(TimeDelta);
if (abs(item->x) > 2000 || abs(item->y) > 2000)
{
item->hp = -1;
todelete.push(item->id);
}
else
{
CGameObject *target = CheckCollision(gf, item);
if (target)
{
target->hp -= 50;
if (target->hp<= 0)
todelete.push(target->id);
FillPacketData(payload, target);
for (intk = 0; k<cnt; k++)
*ps[k] <<pack;
item->hp = -1;
todelete.push(item->id);
}
}
FillPacketData(payload, item);
for (intk = 0; k<cnt; k++)
*ps[k] <<pack;
}
}
while (!todelete.empty())
{
intpos = todelete.front();
deletegf.store[pos];
gf.store.erase(pos);
todelete.pop();
}
}
intCServer::HandlerThread(void *ptr)
{
srand((int)time(NULL));
CServer *obj = (CServer*)ptr;
SPacket *pack = (SPacket*)obj->buffer;
SPacketPayload *payload = (SPacketPayload*)(pack->data);
constintmaxclients = 3;
SDLNet_SocketSetclientset;
CConection *clients[maxclients];
CPacketStream *ps[maxclients];
intclientid[maxclients];
clientset = SDLNet_AllocSocketSet(maxclients);
intresult;
intcnt = 0;
intTicks, CalcTicks;
Ticks = CalcTicks = SDL_GetTicks();
boolrestarted = false;
while (!obj->stop)
{
if (!SDL_AtomicTryLock(&obj->restart[0]))
{
for (inti = 0; i<cnt; i++)
ps[i]->DropAll();
restarted = true;
SDL_AtomicLock(&obj->restart[0]);
}
SDL_AtomicLock(&obj->restart[1]);
SDL_AtomicUnlock(&obj->restart[0]);
if (restarted)
{
restarted = false;
intindex = 0;
for (autoit = obj->gf.store.begin(); it != obj->gf.store.end(); ++it)
{
autoitem = it->second;
if (item->GetType() == Player&&item->client == -1)
{
item->client = clientid[index++];
if (index>= cnt)
break;
}
}
pack->size = obj->gf.Serialize(pack->data);
for (intj = 0; j<cnt; j++){
*ps[j] <<pack;
ps[j]->Send();
}
}
if (cnt<maxclients)
{
clients[cnt] = obj->server.Accept(&clientset);
if (clients[cnt])
{
ps[cnt] = newCPacketStream(clients[cnt]);
pack->size = sizeof(SPacketPayload);
payload->client = clientid[cnt] = rand();
*ps[cnt] <<pack;
for (autoit = obj->gf.store.begin(); it != obj->gf.store.end(); ++it)
{
autoitem = it->second;
if (item->GetType() == Player&&item->client == -1)
{
item->client = clientid[cnt];
break;
}
}
pack->size = obj->gf.Serialize(pack->data);
*ps[cnt] <<pack;
Uint32addr = clients[cnt]->GetIp();
SDL_Log("Client %d connected: %d.%d.%d.%d", cnt,
(addr>> 0) & 0xff,
(addr>> 8) & 0xff,
(addr>> 16) & 0xff,
(addr>> 24) & 0xff);
ps[cnt]->Send();
cnt++;
}
}
if (cnt> 0 &&clients[0]->Check())
{
for (inti = 0; i<cnt; i++)
{
if (clients[i]->Ready())
{
result = ps[i]->Recieve();
if (!result)
{
deleteclients[i];
deleteps[i];
for (autoit = obj->gf.store.begin(); it != obj->gf.store.end(); ++it)
{
autoitem = it->second;
if (item->GetType() == Player&&item->client == clientid[i])
{
item->client = -1;
break;
}
}
for (intj = i; j<cnt - 1; j++)
{
clients[j] = clients[j + 1];
clientid[j] = clientid[j + 1];
ps[j] = ps[j + 1];
}
cnt--;
}
}
}
}
Ticks = SDL_GetTicks();
if (Ticks - CalcTicks> 10)
{
obj->Process(Ticks - CalcTicks, ps, cnt);
for (intj = 0; j<cnt; j++)
ps[j]->Send();
CalcTicks = SDL_GetTicks();
}
else
SDL_Delay(1);
SDL_AtomicUnlock(&obj->restart[1]);
}
SDLNet_FreeSocketSet(clientset);
obj->stop = true;
return 0;
}
Размещено на Allbest.ru
...Подобные документы
Особенности разработки приложений для операционной системы с помощью императивного, структурированного, объектно-ориентированного языка программирования Delphi. Формальное начало программы. Выделение конца программного блока. Листинг и описание программы.
курсовая работа [1,2 M], добавлен 04.08.2014Особенности программирования аркадных игр в среде Python. Краткая характеристика языка программирования Python, его особенности и синтаксис. Описание компьютерной игры "Танчики" - правила игры, пояснение ключевых строк кода. Демонстрация работы программы.
курсовая работа [160,3 K], добавлен 03.12.2014Основы программирования на 32-битном Ассемблере, разработка с его помощью программы, демонстрирующей работу одного из разделов ОС Windоws. Описание используемых АРI-функций как интерфейса программирования приложений. Листинг программы, результаты работы.
курсовая работа [164,5 K], добавлен 18.05.2014Проектирование структуры программы, принцип ее работы, сферы практического использования и оценка возможностей. Выбор и обоснование среды программирования. Разработка пользовательского интерфейса и модулей приложения. Проведение тестирования программы.
курсовая работа [637,7 K], добавлен 14.01.2015Разработка программы для поиска пути в лабиринте с возможностью задания входа и выхода, наглядное представление решений. Использование языка логического программирования Prolog. Данные и методы решения. Пользовательский интерфейс, листинг программы.
реферат [14,3 K], добавлен 15.10.2012Написание программы, которая позволяет пользователю играть в графическом режиме в игру "Тетрис". Разработка функционала с возможностью выбора скорости. Обзор требований к аппаратному и программному обеспечению. Интерфейс, описание данных и тестирование.
курсовая работа [506,3 K], добавлен 17.12.2014Приемы программирования в Delphi. Алгоритм поиска альфа-бета отсечения, преимущества. Описание программного средства. Разработка программы, реализующая алгоритм игры "реверси". Руководство пользователя. Листинг программы. Навыки реализации алгоритмов.
курсовая работа [357,1 K], добавлен 28.02.2011Использование языка программирования Delphi для записи программ, представляющих собой последовательность инструкций. Классы и директивы в объектно-ориентированном программировании. Разработка демонстрационной программы. Процесс настройки Windows XP.
дипломная работа [917,4 K], добавлен 15.01.2014Структура математической модели линейной задачи, алгоритм симплекс-метода. Разработка программы: выбор языка программирования, входные и выходные данные, пользовательский интерфейс. Описание программы по листингу, тестирование, инструкция по применению.
курсовая работа [1,2 M], добавлен 31.05.2013Описание принципа развивающей игры в слова "Виселица". Разработка программы, реализующей задачу данной игры на языке Delphi. Обоснование выбора среды программирования, листинг файла, результаты отладки и тестирования, руководство для пользователя.
курсовая работа [572,7 K], добавлен 14.07.2012Структурная схема получения гороскопа по дате рождения. Листинг исходных кодов программы и руководство пользователя. Ввод данных с помощью объекта класса QDateEdit. Разработка пользовательского интерфейса. Выбор стратегии тестирования и отладка программы.
курсовая работа [1,0 M], добавлен 31.05.2015Разработка программы логической игры в "крестики-нолики" пять в ряд на поле размера 15х15 клеток с применением графики на языке Pascal с использованием объектно-ориентированного программирования. Структура алгоритма программы и описание ее работы.
курсовая работа [821,5 K], добавлен 13.02.2012Разработка игры "Экзамен" с применением объектно-ориентированного программирования и языка Java (в среде Eclipse Helios). Структура программы и алгоритм решения задачи. Описание методов и переменных. Экспериментальное тестирование и оценка программы.
курсовая работа [122,5 K], добавлен 19.05.2011Создание программы на языке программирования С#, которая проверяет наличие в матрице хотя бы одного столбца, содержащего положительный элемент, поиск его номера. Упорядочивание его элементов по возрастанию. Листинг программы и инструкция по работе с ней.
курсовая работа [1,9 M], добавлен 28.05.2014Характеристика используемой операционной системы, языка программирования. Структура программы на языке Turbo Pascal 7.1. Операторы языка Turbo Pascal. Проведение сортировки записей. Алгоритмы программы и подпрограмм. Причины возникновения ошибок.
курсовая работа [454,1 K], добавлен 13.06.2014Аналоги текстовых редакторов с русскоязычным интерфейсом. Разработка и тестирование программного продукта, позволяющего работать с текстом и файлами в редакторе на языке программирования, основанным на русском языке. Алгоритм функционала программы.
дипломная работа [2,8 M], добавлен 21.07.2013Постановка задачи и математическое описание ее решения. Назначение программного обеспечения. Описание принятых идентификаторов. Выбор языка программирования и написание программы на входном языке. Методика отладки программы и проведение ее тестирования.
курсовая работа [96,1 K], добавлен 25.06.2013Особенности разработки и отладки программы на языке Pascal (Delphi), в операционной системе Windows 7 Ultimate. Описание, назначение, функции, оборудование, программное обеспечение, алгоритмы, математическая основа, тесты и интерфейс программы DMC.exe.
курсовая работа [422,7 K], добавлен 28.05.2010Разработка программы на языке VBA, которая вводит исходные данные, выполняет расчеты и выводит на экран заданную информацию. Типы блок-схем и их использование при написании программы. Описание входных данных и результат вычислений, листинг программы.
курсовая работа [680,3 K], добавлен 03.08.2009Разработка программы с использованием языка программирования Pascal для выполнения алгебраических действий с действительными числами без знака в шестнадцатеричной системе счисления. Описание хода выполнения, схема алгоритма, листинг программы, ее функции.
реферат [687,5 K], добавлен 28.10.2011