Реферат Сетевая игра на Delphi Морской бой
Работа добавлена на сайт bukvasha.net: 2015-10-28Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
от 25%
договор
Содержание
Введение……………………………………………………………………..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.