Смекни!
smekni.com

Сетевая игра на Delphi Морской бой

520100 ДФ 230102 КР 01 ПЗ


Содержание


Введение……………………………………………………………………..4

1. Техническое задание……………………………………………………..5

2. Программная документация.....................................................................10

2.1 Руководство программиста.....................................................................10

2.2 Руководство пользователя......................................................................14

Заключение…………………………………………………………………18

Литература …………………………………………………………………19

ПРИЛОЖЕНИЕ А Текст модуля Main……………………………………20


Введение


Главная цель данной работы, разработать приложение «Сетевой игры «Морской бой» в среде разработки Borland Delphi. Игра может применяться для развлечения. Для ее использования не требуется специальных знаний в области компьютерных технологий, достаточно лишь наличие начальных умений в использовании компьютера и знания правил игры «Морской бой», благодаря чему программой могут пользоваться представители различных возрастных категорий.

В представленной работе рассмотрена одна из популярных сетевых игр.

В данной пояснительной записки была рассмотрены такие разделы как программная документация, состоящая из руководства пользователя и программиста, представлен текст основного модуля Main. Данные пункты необходимые для разработки программы и дальнейшего её усовершенствования.

Раздел «Руководство пользователя» содержит краткие сведения по управлению игровым процессом. В разделе «Руководство программиста» кратко описаны основные подпрограммы главного модуля Main и все переменные, используемые в программе, краткое описание программы и внешнего вида приложения.


1. Техническое задание


1.1 Наименование, область применения


Полное наименование приложения: «Сетевая игра «Морской бой».


1.2 Основание для разработки


В соответствии с учебным планом необходимо выполнить курсовую работу по дисциплине «Сетевые технологии».


1.3 Назначение разработки


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


1.4 Технические требования к программе, программному изделию


1.4.1 Требование к функциональным характеристикам


Программа должна выполнять следующие функции:

работать как на одном компьютере, так и на различных;

осуществлять подсчёт очков;

выдавать подсказки для игры;

Меню программы содержит следующие пункты:

файл:

- новая игра;

- выход;

настройки;

- настройки клиента;

- настройки сервера;

- создать игру;

- подключиться к игре.

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

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


1.4.2 Требования к надёжности


Приложение поддерживает диалоговый режим и выдаёт сообщения при выигрыше или проигрыше игрока.


1.4.3 Условие эксплуатации


Данное приложение может использоваться для проведения свободного времени, т.е. развлечения, и рассматриваться как демонстрационный материал для учебных курсов по сетевым технологиям и сетевому программированию. Условие эксплуатации приложения совпадают с условиями эксплуатации ПЭВМ IBM PC.


1.4.4 Требования к параметрам и составу технических средств


Персональный компьютер, на котором может быть установлена система Borland Delphi 7, должен удовлетворять определенным требованиям.

Базовый комплект технических средств включает:

системный блок:

- процессор Pentium III с частотой 300 МГц или выше;

- оперативная память - 64 Мбайт (рекомендуется 128 Мбайт или больше);

- объем дискового пространства - 300 Мбайт (минимум);

- видеокарта - минимальное разрешение 800x600 при 256 цветах (рекомендуется разрешение 1024x768);

- сетевая карта - для сетевой версии AutoCAD 2000;

цветной монитор - диагональ 17" - 19", частота не менее 85 Гц;

алфавитно-цифровую клавиатуру (АЦК);

манипулятор типа «мышь» (рекомендуется Microsoft IntelliMouse).

Для получения твердой копии пояснительной записки необходим принтер.


1.4.5 Требования к информационной и программной совместимости


Для написания программы должен использоваться язык программирования Object Pascal среды разработки Borland Delphi.

Системные программные средства, используемые программой, должны быть представлены лицензионной локализованной версией одной из операционных систем Microsoft Windows 98/NT/2000/XP/Vista.


1.4.6 Требования к маркировке и упаковке, требованию и хранению


Приложения поставляются в электронном виде на переносном носителе.


1.4.7 Специальные требования


Специальные требования не предъявляются.


1.5 Технико-экономические показатели


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


1.6 Стадии и этапы разработки


1.6.1 Техническое задание


Данная стадия разработки содержит в себе следующие этапы работ:

a) обоснование необходимости разработки приложения, в этот этап входят следующие работы:

- постановка задачи;

- сбор исходных материалов;

- выбор и обоснование критериев эффективности и качества разрабатываемого приложения;

- обоснование необходимости проведения научно-исследовательских работ.

b) научно-исследовательские работы, в данный этап входят работы:

- предварительный выбор методов решения задач;

- обоснование целесообразности применения ранее разработанных программ;

- определение требований к техническим средствам;

- обоснование принципиальной возможности решения поставленной задачи.

c) разработка и утверждение технического задания, в этом этапе присутствуют следующие работы:

- определение требований к изделию;

- разработка технико-экономического обоснования разработки приложения;

- определение стадий, этапов и сроков разработки пояснительной записки;

- выбор среды разработки;

- определение необходимости проведения научно-исследовательских работ на последующих стадиях;

- согласование и утверждение технического задания.


1.6.2 Эскизный проект


Эта стадия разработки содержит в себе следующие этапы работ:

a) разработка эскизного проекта, в данный этап входят следующие работы:

- уточнение методов решения задачи;

- разработка общего описания алгоритма решения задачи;

- разработка технико-экономического обоснования.

b) утверждение эскизного проекта, в этом этапе необходимы следующие работы:

- разработка пояснительной записки;

- согласование и утверждение эскизного проекта.


1.6.3 Технический проект


В этой стадии разработки присутствуют следующие этапы работ:

a) разработка технического проекта, в этот этап входят следующие работы:

- определение формы представления выходных данных;

- разработка структуры изделия;

- окончательное определение конфигурации технических средств.

b) утверждение технического проекта, в этом этапе имеются следующие работы:

- разработка плана мероприятий по разработке и внедрению приложения;

- разработка пояснительной записки;

- согласование и утверждение технического проекта.


1.6.4 Рабочий проект


На этом этапе необходимы следующие этапы работ:

a) разработка приложения, на этом этапе содержатся следующие работы:

- работы по созданию приложения;

- тестирование и отладка программы.

b) разработка программных документов

- разработка пояснительной записки.


1.7 Порядок контроля приёмки


Поставляется на переносном носителе в срок до 10.04.08, вместе с пояснительной запиской.


2. Программная документация


2.1 Руководство программиста


Для создания сетевой игры «Морской бой» была использована интегрированная среда разработки Borland Delphi 2007. Приложение реализовано на основе одного не блокирующегося сокета UDP. В программе клиент является и сервером, т.е. он сам обрабатывает события.

Внешний вид программы после ее запуска представлен на рисунке 1.



Рисунок 1 – Внешний вид программы «Сетевая игра «Морской бой»


Для удобства управления работой программы было создано главное меню, содержащее два пункта: «Файл» и «Настройки».

Пункт меню «Файл» содержит два подпункта:

a) новая игра;

b) выход.

Пункт меню «Настройки» содержит четыре подпункта:

настройки клиента;

настройки сервера;

создать игру;

подключиться к игре.

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

Для настройки клиента необходим адрес и порт, а для сервера – порт. Окна настроек появляются посередине игрового окна.

Поле игрока и соперника создаются с помощью объектов типа Shape, размером 25 на 25.

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

В игре предусмотрен подсчёт счёт. Счёт ведётся как количество убитых вами кораблей и количество убитых у вас кораблей. При проигрыше или выигрыше игрока выводятся сообщения об этом.

Приложение «Сетевая игра «Морской бой» состоит из одного программного модуля Main. Main – основная функциональная часть программы, в котором реализуются основные функции приложения.

Модуль Main содержит подпрограммы для конфигурирования формы приложения и ее элементов, организации игрового процесса, обработки нажатий клавиш и вызовов пунктов меню.

В главном модуле были реализованы следующие процедуры:

Procedure TForm1.LoadGame;

Procedure TForm1.SetColorOnShape1;

Procedure TForm1.SetColorOnShape2;

Procedure TForm1.EndGame;

Procedure TForm1.RecvSock;

Procedure TForm1.SendSock;

Procedure TForm1.N6Click;

Procedure TForm1.N7Click;

Procedure TForm1.FormDestroy;

Procedure TForm1.N8Click;

Procedure TForm1.FormCreate;

Procedure TForm1.N2Click;

Procedure TForm1.N4Click;

Procedure TForm1.N5Click.

Спецификация подпрограмм главного модуля программы приведена в таблице 1.


Таблица 1 – Спецификация функций модуля Main


Процедура Назначение
Procedure TForm1.LoadGame

Процедура необходима, для создания

новой игры, для создания поля игрока и

соперника

Procedure TForm1.SetColorOnShape1

Процедура нужна для расстановки

кораблей на поле игрока

Procedure TForm1.SetColorOnShape2 Процедура выстрела
Procedure TForm1.EndGame Процедура для завершения игры
Procedure TForm1.RecvSock Процедура для приёма и обработки данных из сокета

Продолжение таблицы 1


Процедура Назначение
Procedure TForm1.SendSock

Процедура для отправки данных через

сокет

Procedure TForm1.N6Click Процедура создания сокета и привязки его к порту, делает сокет не блокирующимся
Procedure TForm1.N7Click Процедура создания сокета и перевода его в не блокирующееся состояние
Procedure TForm1.FormDestroy Процедура для уничтожения сокета после выхода из игры
Procedure TForm1.N8Click Процедура создания новой игры
Procedure TForm1.FormCreate

Настройка переменных для работы

приложения по сети

Procedure TForm1.N2Click Процедура выхода
Procedure TForm1.N4Click Процедура настройки клиента
Procedure TForm1.N5Click Процедура настройки сервера

Все используемые, в главном модуле Main, переменные описаны в таблице 2.


Таблица 2 – Спецификация переменных


Имя Назначение Тип

Главная программа Main


InetAddr Структура адреса, соединение сервера SOCKADDR_IN
InetAddrOut

Структура адреса, адрес куда

необходимо ответить

SOCKADDR_IN
sock Сокет TSocket
bPriem

Переменная для распознавания

следующих приходящих данных

(может принимать следующие

значения: данные не нужны, их

обрабатывать не надо, переменная

готова для приёма данных, переменная готова для передачи данных)

(prnot, prinout, proutin)
Pole1 Массив для создания поля игрока TShape
Pole2 Массив для создания поля противника TShape
bShips

Переменная, ограничивающая

количество кораблей, которые

можно расставить на игровом поле

Byte
bShipsPlaced

Переменная для подсчёта

расставленных кораблей

Byte

Продолжение таблицы 2


Имя Назначение Тип

Главная программа Main


bShipsYouKilled

Переменная для подсчёта убитых

игроком кораблей

Byte
bShipsHeKilled

Переменная для подсчёта убитых у

игрока кораблей

Byte
vx Позиция по X, в какую точку стреляли Byte
vy Позиция по Y, в какую точку стреляли Byte
blVystrel Переменная выстрела Boolean
blGameStatus Статус игры Boolean
iLocalPort Сервера порт Integer
sServerAddr: Адрес компьютера String
iServerPort Соединение клиента с сервером Integer
Procedure TForm1.LoadGame
i Переменная счётчик Integer
j Переменная счётчик Integer
h Переменная для смещения поля сверху Integer
w Переменная для смещения поля слева Integer
Procedure TForm1.SetColorOnShape1
i Переменная счётчик Integer
j Переменная счётчик Integer
f Переменная для проверки кораблей, при расстановке, чтобы они не стояли по диагонали Boolean
Procedure TForm1.SetColorOnShape2
i Переменная счётчик Integer
j Переменная счётчик Integer
Procedure TForm1.EndGame
on_off_sock Переменная для перевода сокета в блокирующее состояние Longint
i Переменная счётчик Integer
j Переменная счётчик Integer
Procedure TForm1.RecvSock
Buffer Переменная для записи данных Str
iStruckSize Размер структуры адреса Integer
i Переменная счётчик Integer
j Переменная счётчик Integer
Procedure TForm1.SendSock
Buffer Переменная для записи данных Str

Продолжение таблицы 2


Имя Назначение Тип
Procedure TForm1.N6Click
ws Данные для версии библиотеки TWSADATA
on_off_sock

Переменная для перевода сокета в

неблокирующее состояние

Longint
Procedure TForm1.N7Click
ws Данные для версии библиотеки TWSADATA
on_off_sock

Переменная для перевода сокета в

неблокирующее состояние

Longint
Procedure TForm1.FormDestroy
Не имеет переменных
Procedure TForm1.N8Click

Не имеет переменных

Procedure TForm1.FormCreate
Не имеет переменных
Procedure TForm1.N2Click
Не имеет переменных
Procedure TForm1.N4Click
Не имеет переменных
Procedure TForm1.N5Click
Не имеет переменных

Текст главного модуля Main приведен в приложении А.


2.2 Руководство пользователя


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

После того как пользователь запустит приложение «Project1.exe», появиться окно программа, представленное на рисунке 2.



Рисунок 2 – Вид окно при запуске


После запуска клиенту необходимо настроить клиента и сервера.

Для настройки клиента необходимо нажать подпункт «Настройки клиента» меню «Настройки», появиться окно представленное на рисунке 3.



Рисунок 3 – Вид окна настроек клиента


Необходимо ввести номер адреса для соединения и номер порта. После ввода нажмите «ОК».

Для настройки сервера необходимо нажать подпункт «Настройки сервера» меню «Настройки», появиться окно представленное на рисунке 4.



Рисунок 4 – Вид окна настроек сервера


Необходимо ввести номер порта для соединения. После ввода нажмите «ОК».

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

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

Внизу в строке состояния игроки могут видеть счёт игры и в строке состояния появляются подсказки, о том кто должен стрелять, а кто ждать. Это можно посмотреть на рисунках 5 и 6.



Рисунок 5 – Вид окна игрока стреляющего



Рисунок 6 –Вид окна игрока ждущего выстрел


При попадании в корабль соперника, корабль перекрашивается в красный цвет, и у игрока есть ещё один шанс выстрелить, а при промахе – в зелёный. Это представлено на рисунке 7.



Рисунок 7 – Вид окна при попадании и промахе игрока


Внизу ведётся счёт, это видно на рисунке 7, первое – количество убитых вами кораблей, а второе – количество убитых кораблей у вас.

После того как игрок убьёт у противника все корабли у него появится сообщение, показанное на рисунке 8.



Рисунок 8 – Сообщение при победе игрока


А у проигравшего игрока будет сообщение, расположенное на рисунке 9.



Рисунок 9 – Сообщение при проигрыше игрока


После нажатия кнопки «ОК» на появившемся сообщении, окно игры очиститься и для начала новой игры нужно будет нажать «Новая игра».

Для выхода игрока из игры можно нажать подпункт «Выход» меню «Файл» или нажать на «крестик» игрового окна.


Заключение


Пользуясь собственными знаниями и литературой, была проделана работа по созданию приложения «Сетевая игра «Морской бой», в среде разработки Borland Delphi. В результате получилась сетевая игра «Морской бой», в которой ведётся подсчёт потопленных кораблей.

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

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


Литература


Дарахвелидзе П.Г., Марков Е.П. Программирование в Delphi 7. – СПб.: БВХ-Петербург, 2003. – 784 с.: ил.


Приложение А


Текст модуля Main


unit main;


interface


uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, WinSock, StdCtrls, Menus, ExtCtrls, ComCtrls, dl1, dl2;


const

WM_MYSOCKET = WM_USER + 1;


type

str = array[0..255] of char;

TForm1 = class(TForm)

MainMenu1: TMainMenu;

N1: TMenuItem;

N2: TMenuItem;

N3: TMenuItem;

N4: TMenuItem;

N5: TMenuItem;

N6: TMenuItem;

N7: TMenuItem;

Shape1: TShape;

N8: TMenuItem;

StatusBar1: TStatusBar;

procedure N6Click(Sender: TObject);

procedure N7Click(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure SetColorOnShape1(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure SetColorOnShape2(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure N8Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure N2Click(Sender: TObject);

procedure N4Click(Sender: TObject);

procedure N5Click(Sender: TObject);

private

{ Private declarations }

procedure RecvSock(var Msg:TMessage); message WM_MYSOCKET;

procedure SendSock(Mes: string);

procedure LoadGame();

procedure EndGame();

public

{ Public declarations }

end;


var

Form1: TForm1;

InetAddr, InetAddrOut: SOCKADDR_IN;

sock: TSocket;

bPriem: (prnot, prinout, proutin);

Pole1: array[0..9, 0..9] of TShape;

Pole2: array[0..9, 0..9] of TShape;

bShips: byte;

bShipsPlaced: byte;

bShipsYouKilled: byte;

bShipsHeKilled: byte;

vx, vy : byte;

blVystrel: boolean;

blGameStatus: boolean;

iLocalPort: integer;

sServerAddr: string;

iServerPort: integer;


implementation


{$R *.dfm}

{Новая игра}

procedure TForm1.LoadGame();

var

i,j,h,w:integer;

begin

bShips := 7;

h:=10;

w:=10;

{Поле игрока}

for i:=0 to 9 do

begin

for j:=0 to 9 do

begin

Pole1[i,j]:=TShape.Create(Self);

Pole1[i,j].Parent:=Self;

Pole1[i,j].Left:=w+25*j;

Pole1[i,j].Top:=h+25*i;

Pole1[i,j].Height:=25;

Pole1[i,j].Width:=25;

Pole1[i,j].Brush.Color:=clSkyBlue;

Pole1[i,j].OnMouseUp:= SetColorOnShape1;

end;

end;

w:=266;

{Поле соперника}

for i:=0 to 9 do

begin

for j:=0 to 9 do

begin

Pole2[i,j]:=TShape.Create(Self);

Pole2[i,j].Parent:=Self;

Pole2[i,j].Left:=w+25*j;

Pole2[i,j].Top:=h+25*i;

Pole2[i,j].Height:=25;

Pole2[i,j].Width:=25;

Pole2[i,j].OnMouseUp:= SetColorOnShape2;

end;

end;

end;


procedure TForm1.SetColorOnShape1(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

var

i,j:integer;

f:Boolean;

begin

f:=false;

for i:=0 to 9 do

for j:=0 to 9 do

if Not blGameStatus then

if Sender = Pole1[i,j] then

if bShipsPlaced < bShips then

begin

if Pole1[i,j].Brush.Color = clBlack then f := true;

if Pole1[i-1,j+1].Brush.Color = clBlack then f := true;

if Pole1[i+1,j-1].Brush.Color = clBlack then f := true;

if Pole1[i+1,j+1].Brush.Color = clBlack then f := true;

if Pole1[i-1,j-1].Brush.Color = clBlack then f := true;

if Not f then

begin

Pole1[i,j].Brush.Color:=clBlack;

inc(bShipsPlaced);

end

end

else

begin

blGameStatus:=true;

N6.Enabled:=true;

N7.Enabled:=true;

end;

end;


procedure TForm1.SetColorOnShape2(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

var

i,j:integer;

begin

if blVystrel then

for i:=0 to 9 do

for j:=0 to 9 do

if Sender = Pole2[i,j] then

if Pole2[i,j].Brush.Color = clWhite then

begin

vx:=i; vy:=j;

SendSock(IntToStr(10*i+j));

bPriem := proutin;

end;

end;


{Конец игры}

procedure TForm1.EndGame();

var

on_off_sock: longint;

i, j: byte;

begin

for i:=0 to 9 do

for j:=0 to 9 do

begin

try

Pole1[i,j].Destroy;

Pole2[i,j].Destroy;

except

end;

end;

bShipsPlaced:=0;

bShipsYouKilled:=0;

bShipsHeKilled:=0;

blGameStatus:=false;

on_off_sock:=0;

ioctlsocket(sock, FIONBIO, on_off_sock);

closesocket(sock);

WSACleanup;

N8.Enabled:=true;

end;


{Прием данных из сокета}

procedure TForm1.RecvSock(var Msg:TMessage);

var

Buffer: str;

iStruckSize: integer;

i, j: byte;

begin

if ((Msg.Msg = WM_MYSOCKET) and (Msg.lParam = FD_READ)) then

begin {IF 1}

ZeroMemory(@Buffer, SizeOf(str));

if recvfrom(sock, Buffer, 256, 0, InetAddrOut, iStruckSize) > 0 then

begin {IF 2}

case bPriem of {CASE 1}

prinout:

begin {prinout}

i := StrToInt(Buffer) div 10;

j:= StrToInt(Buffer) mod 10;

if Pole1[i,j].Brush.Color = clBlack then

begin

SendSock('popal');

Pole1[i,j].Brush.Color := clRed;

blVystrel := false;

bPriem := prinout;

inc(bShipsHeKilled);

StatusBar1.Panels[1].Text := 'Ждите...';

end

else

begin

SendSock('nepopal');

Pole1[i,j].Brush.Color := clHighlight;

blVystrel := true;

bPriem := prnot;

StatusBar1.Panels[1].Text := 'Стреляйте...';

end;

StatusBar1.Panels[0].Text := 'Счет: ' + IntToStr(bShipsYouKilled) + '-' + IntToStr(bShipsHeKilled);

if bShipsYouKilled = bShips then

begin

ShowMessage('Вы выиграли!');

StatusBar1.Panels[1].Text := '';

EndGame();

end;

if bShipsHeKilled = bShips then

begin

ShowMessage('Вы проиграли!');

StatusBar1.Panels[1].Text := '';

EndGame();

end;

end; {END prinout}

proutin:

begin {proutin}

if StrComp(Buffer, PChar('popal')) = 0 then

begin

Pole2[vx,vy].Brush.Color := clRed;

inc(bShipsYouKilled);

StatusBar1.Panels[1].Text := 'Стреляйте...';

end;

if StrComp(Buffer, PChar('nepopal')) = 0 then

begin

Pole2[vx,vy].Brush.Color := clHighlight;

StatusBar1.Panels[1].Text := 'Ждите...';

end;

bPriem:= prinout;

StatusBar1.Panels[0].Text := 'Счет: ' + IntToStr(bShipsYouKilled) + '-' + IntToStr(bShipsHeKilled);

if bShipsYouKilled = bShips then

begin

ShowMessage('Вы выиграли!');

StatusBar1.Panels[1].Text := '';

EndGame();

end;

if bShipsHeKilled = bShips then

begin

ShowMessage('Вы проиграли!');

StatusBar1.Panels[1].Text := '';

EndGame();

end;

end; {END proutin}

prnot:

end; {END CASE 1}

end; {END IF 2}

end; {EDN IF 1}

end;


procedure TForm1.SendSock(Mes: string);

var

Buffer: str;

begin

ZeroMemory(@Buffer, SizeOf(str));

StrCopy(Buffer, PChar(Mes));

sendto(sock, Buffer, StrLen(Buffer) + 1, 0, InetAddrOut, SizeOf(InetAddrOut));

end;


//Сервер

procedure TForm1.N6Click(Sender: TObject);

var

ws: TWSADATA;

on_off_sock: longint;

begin

if WSAStartup($0202, ws)=0 then

begin

InetAddr.sin_family := AF_INET;

InetAddr.sin_addr.s_addr := INADDR_ANY;

InetAddr.sin_port := htons (iLocalPort);

sock := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

if (sock <> INVALID_SOCKET) then

begin

if bind(sock, InetAddr, sizeof(InetAddr)) <> SOCKET_ERROR then

begin

N7.Enabled:=false;

N6.Enabled:=false;

on_off_sock:=1;

ioctlsocket(sock, FIONBIO, on_off_sock);

WSAAsyncSelect(sock, Form1.Handle, WM_MYSOCKET, FD_READ);

bPriem := prinout;

blVystrel:=false;

StatusBar1.Panels[1].Text := 'Ждите...';

end

else

ShowMessage('bind () с ошибкой ' + IntToStr(GetLastError));

end

else

ShowMessage('Ошибка создания сокета ' + IntToStr(WSAGetLastError));

end

else

ShowMessage('Невозможно загрузить библиотеку WinSock2');

end;


//Клиент

procedure TForm1.N7Click(Sender: TObject);

var

ws: TWSADATA;

on_off_sock: longint;

begin

if WSAStartup($0202, ws)=0 then

begin

InetAddr.sin_family := AF_INET;

InetAddr.sin_addr.s_addr := inet_addr(PChar(sServerAddr));

InetAddr.sin_port := htons(iServerPort);

sock := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

//--

if (sock <> INVALID_SOCKET) then

begin

N7.Enabled:=false;

N6.Enabled:=false;

InetAddrOut := InetAddr;

on_off_sock :=1;

ioctlsocket(sock, FIONBIO, on_off_sock);

WSAAsyncSelect(sock, Form1.Handle, WM_MYSOCKET, FD_READ);

bPriem := prnot;

blVystrel:=true;

StatusBar1.Panels[1].Text := 'Стреляйте...';

end

else

ShowMessage('Oshibka sozdaniya soketa ' + IntToStr(WSAGetLastError));

end

else

ShowMessage('Невозможно загрузить библиотеку WinSock2');

end;


procedure TForm1.FormDestroy(Sender: TObject);

begin

EndGame();

end;


procedure TForm1.N8Click(Sender: TObject);

begin

LoadGame();

N8.Enabled:=false;

end;


procedure TForm1.FormCreate(Sender: TObject);

begin

iLocalPort:=50;

sServerAddr:='127.0.0.1';

iServerPort:=50;

end;


procedure TForm1.N2Click(Sender: TObject);

begin

Application.Terminate;

end;


procedure TForm1.N4Click(Sender: TObject);

begin

Form3.Left := Form1.Left + (Form1.Width - Form3.Width) div 2;

Form3.Top := Form1.Top + (Form1.Height - Form3.Height) div 2;

Form3.Edit1.Text := sServerAddr;

Form3.Edit2.Text := IntToStr(iServerPort);

if Form3.ShowModal = mrOK then

begin

sServerAddr:= Form3.Edit1.Text;

iServerPort := StrToInt(Form3.Edit2.Text);

end;

end;


procedure TForm1.N5Click(Sender: TObject);

begin

Form2.Left := Form1.Left + (Form1.Width - Form2.Width) div 2;

Form2.Top := Form1.Top + (Form1.Height - Form2.Height) div 2;

Form2.Edit1.Text:=IntToStr(iLocalPort);

if Form2.ShowModal = mrOK then

begin

iLocalPort:=StrToInt(Form2.Edit1.Text);

end;

end;


end.

28

520100 ДФ 230102 КР 18 ПЗ



ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

Государственное образовательное учреждение

высшего профессионального образования


СИБИРСКИЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ

Усть-Илимский филиал


Индустриальный факультет


Кафедра информатики


КУРСОВАЯ РАБОТА


По предмету: Сетевые технологии


Разработка приложения

«Сетевая игра «Морской бой».


Выполнил студент гр. АОИ-04 Филимонова А.В.
Оценка:
Проверил Кузнецов А.С.
Дата защиты:


2008 год


ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

Государственное образовательное учреждение

высшего профессионального образования


СИБИРСКИЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ

Усть-Илимский филиал


Индустриальный факультет

Кафедра информатики


ЗАДАНИЕ

на курсовую работу


По дисциплине: Сетевые технологии

Студенту Филимоновой Анны Витальевны гр. АОИ-04

Задание: Разработать приложение «Сетевая игра «Морской бой». Средством разработки является среда разработки Borland Delphi.


Дата выдачи: 28.01.08. Срок сдачи: 11.04.08.


Календарный план


Номер п/п Наименование разделов Сроки Процент выполнения Дата контроля


Начало Конец План Факт
1 Выбор темы 28.01.08 04.02.08 4

2 Составление плана работы 04.02.08 11.02.08. 20

3 Изучение теоретического материала 11.02.08 31.03.08. 30

4 Стадии и этапы разработки 11.02.08. 31.04.08 80

4.1 Техническое задание 11.02.08 25.02.08 +10

4.2 Разработка программы 25.02.08 24.04.08 +25

4.3 Тестирование и отладка 24.04.08 31.04.08 +15

5 Оформление отсчета 31.04.08 10.04.08 90

6 Норма контроль 10.04.08 11.04.08 93

7 Защита
11.04.08 100


Задание принял: Филимонова А.В. 28.01.08


Оценка ____Руководитель: _____________Кузнецов А.С. «__» _________ 200 __ г.