Разработка объектно–ориентированной программы с пользовательским интерфейсом

Разработка игры "Танчики" в операционной системе 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.