Реферат

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

Работа добавлена на сайт bukvasha.net: 2015-10-28

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 11.11.2024



Содержание
Введение……………………………………………………………………..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 Требование к функциональным характеристикам
Программа должна выполнять следующие функции:

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

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

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

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

a)     файл:

- новая игра;

- выход;

b)    настройки;

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

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

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

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

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

Выходными данными являются: результат выстрела, позиция выстрела, счёт игры.
1.4.2 Требования к надёжности
Приложение поддерживает диалоговый режим и выдаёт сообщения при выигрыше или проигрыше игрока.
1.4.3 Условие эксплуатации
Данное приложение может использоваться для проведения свободного времени, т.е. развлечения, и рассматриваться как демонстрационный материал для учебных курсов по сетевым технологиям и сетевому программированию. Условие эксплуатации приложения совпадают с условиями эксплуатации ПЭВМ IBM PC.
1.4.4 Требования к параметрам и составу технических средств
Персональный компьютер, на котором может быть установлена система Borland Delphi 7, должен удовлетворять определенным требованиям.

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

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

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

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

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

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

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

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

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

e)     манипулятор типа «мышь» (рекомендуется 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)   выход.

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

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

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

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

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

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

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

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

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

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

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

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

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

a)     Procedure TForm1.LoadGame;

b)    Procedure TForm1.SetColorOnShape1;

c)     Procedure TForm1.SetColorOnShape2;

d)    Procedure TForm1.EndGame;

e)     Procedure TForm1.RecvSock;

f)      Procedure TForm1.SendSock;

g)     Procedure TForm1.N6Click;

h)     Procedure TForm1.N7Click;

i)       Procedure TForm1.FormDestroy;

j)       Procedure TForm1.N8Click;

k)     Procedure TForm1.FormCreate;

l)       Procedure TForm1.N2Click;

m)  Procedure TForm1.N4Click;

n)     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).

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




Литература
1.        Дарахвелидзе П.Г., Марков Е.П. Программирование в 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.

1. Курсовая Зовнішньополітичні доктрини США і країни пострадянського простору ретроспективний аналіз
2. Реферат на тему Преобразования Петра I во внутренней политике
3. Реферат на тему Journal Of Short Stories Essay Research Paper
4. Реферат Теплоснабжение района г.Тихвина
5. Курсовая на тему Особенности питания иностранных туристов
6. Реферат на тему SameSex Marriage Essay Research Paper Samesex Marriage
7. Реферат Население Индии и государственное устройство
8. Реферат Судебная реформа успехи и неудачи
9. Статья на тему Динамика развития человечества
10. Курсовая на тему Приостановление предварительного расследования