Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

отчет ВМ2

.doc
Скачиваний:
2
Добавлен:
21.11.2019
Размер:
1.37 Mб
Скачать

14

Министерство образования и науки Российской Федерации

Федеральное бюджетное образовательное учреждение высшего профессионального образования

«Ярославский государственный технический университет»

Кафедра «Кибернетика»

Отчет защищен

с оценкой

Преподаватель

( ) А. П. Харитонов

РАЗРАБОТКА ПРОТОКОЛА СЕАНСОВОГО УРОВНЯ ДЛЯ РЕШЕНИЯ ПРИКЛАДНОЙ

ЗАДАЧИ

Отчет о лабораторной работе

по курсу “Вычислительные машины, системы и сети”

ЯГТУ 220301.65 ЛР

Отчет выполнил

студент гр. МА-33

( ) Баталин А.В.

2012

Цели работы:

  • изучение на основе протоколов TCP/IP принципов сетевого взаимодействия,

  • знакомство с компонентами Delphi, предназначенными для поддержки сети, и работа с некоторыми из них,

  • разработка простейших сетевых программ.

Задание:

Разработать программу для игры по сети в крестики-нолики (ХО) поле 3х3. Для организации взаимодействия программ использовать протокол UDP (порт 1024). Программу разработать с использованием Delphi.

При разработке программы выделим три этапа:

1. программа для обмена сообщениями между компьютерами по IP-адресам,

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

3. программа для игры в ХО.

Этап 1. Программа должна давать пользователю возможность выбрать IP-адрес (из имеющихся) и послать по этому адресу текстовое сообщение, а также должна принимать сообщения от других компьютеров и отображать их с указанием IP-адреса отправителя.

Этап 2. Программа должна функционировать следующим образом.

1. Пользователь вводит имя и выбирает, будет он играть крестиками (ходит первым) или ноликами (ходит вторым).

2. Если пользователь выбрал «Играю Х».

2.1. Программа посылает по всем известным ей IP-адресам с интервалом 1 секунда команду: $01<имя>

2.2. Анализируются все приходящие данные, ожидается команда $02<имя>

2.3. После прихода такой команды прекращается посылка команды $01<имя> и пользователю предлагается согласиться на диалог с автором принятой команды (по его имени)

2.3.1. Если пользователь согласен, то считаем, диалог установлен:

2.3.1.1. Программа дает возможность ввести и послать сообщение

2.3.1.2. Осуществляется ожидание ответа до 1 минуты. Если ответ получен , то он отображается и переход к 2.3.1.1. Если нет, то диалог прекращен, пользователю выдается соответствующее сообщение и переход к 2.1.

2.3.2. Если пользователь не согласен – то переход к 2.1.

3. Пользователь выбрал «Играю О».

3.1. Программа анализирует все приходящие данные, ожидая команды $01<имя>.

3.2. После прихода такой команды анализ входных данных прекращается и пользователю предлагается согласиться на диалог с автором принятой команды (по имени)

3.2.1. Если пользователь согласен, то

3.2.1.1. автору принятой команды посылается команда $02<имя>

3.2.1.2. осуществляется ожидание ответа до 1 минуты. Если ответ получен, то он отображается, пользователь может вводить и отсылать свое сообщение. Далее переход на 3.2.1.2. Если ответа нет, то диалог прерван (или не начинался), пользователю выдается соответствующая информация, затем – переход 3.1.

3.2.2. Если пользователь не согласен, то переход к 3.1

Этап 3. На основе первых двух этапов разработать программу с графическим интерфейсом для игры в ХО. Реализовать контроль корректности хода и автоматическое определение, и выдачу результата игры.

Описание структуры программы

Компонент Memo1 служит для отображения принятых и отсылаемых сообщений.

Компонент Memo2 – служит для ввода сообщения.

Компонент Button1 (“Играть!”) – для начала игры.

Компонент Edit1 – для ввода имени пользователя.

Компонент CheckBox1 и CheckBox2 – для переключения выбор пользователем за кого играть.

Компонент Button2 (“Прервать”) – для сброса всех параметров.

Компонент Timer1 – для посекундной отправки приглашений и контроля ожидания ответного сигнала в течение минуты.

Компонент Timer2 – для контроля времени ожидания в размере одной минуты ответа в режиме диалога.

Компонент Button3 (“Отправить”) – для отправки сообщений.

Компоненты UDPClient1 и UDPServer1 для реализации обмена сообщениями по сети.

Инструкция по работе с программой

После запуска программа ждет, когда пользователь введет свое имя в поле Edit1, выберет за кого играть и нажмет кнопку «Начать». После чего начнется либо рассылка приглашений (за крестик), либо ожидание приглашения (за нолик). После получения приглашения нолик в праве решить, хочет он играть с этим игроком (имя отображено на панели) или нет, в случае отказа он продолжает получать приглашения от игроков. В случае согласия «нолик» входит в режим диалога и ожидает ответа от «крестика». «Крестик» в свою очередь решает, хочет он играть с этим игроком или нет. В случае отказа «крестик» продолжит рассылку, а нолик будет ждать до конца минуты ожидания ответа или в праве нажать «Прекратить диалог». Если крестик соглашается на диалог, то он получает право отправить первое сообщение «нолику», после чего диалог ведется в полудуплексном режиме до тех пор пока, кто-нибудь из пользователей не нажмет «Прекратить диалог» или не будет передано ни одного сообщения в течение минуты. Общий вид программы изображен на рисунке 1.

Рис 1 - Общий вид

Исходный код

var s:string;

time:integer;

bGame :boolean = false;

pName : string;

procedure restart;

begin

form1.CheckBox1.Enabled:=true;

form1.CheckBox2.Enabled:=true;

form1.CheckBox1.Checked:=false;

form1.CheckBox2.Checked:=false;

form1.Edit1.Enabled:=true;

form1.Edit1.Clear;

bGame:=false;

form1.ProgressBar1.Visible:=false;

form1.Button1.Visible:=true;

form1.Button1.Enabled:=true;

form1.Button2.Visible:=false;

form1.button3.Visible:=false;

form1.Memo2.Visible:=false;

form1.Timer1.Enabled:=false;

form1.Timer2.Enabled:=false;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

bGame := false;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

if edit1.Text='' then showmessage('Введите имя!') else

begin

if (checkbox1.Checked=false) and (checkbox2.checked=false) then showmessage('Крестик или Нолик?') else

begin

if checkbox1.checked=true then

timer1.Enabled:=true;

if checkbox2.Checked=true then

timer2.Enabled:=true;

time:=0;

idudpclient1.Host:='255.255.255.255'; idudpclient1.BroadcastEnabled:=true;

edit1.Enabled:=false;

button2.Visible:=true;

button1.Visible:=false;

checkbox1.Enabled:=false;

checkbox2.Enabled:=false;

progressbar1.Max:=60;

progressbar1.Visible:=true;

progressbar1.Position:=1;

end;

end;

end;

procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;

ABinding: TIdSocketHandle);

var ip:string;

ButtonSelected,n:integer;

begin

n:=adata.Size;

setlength(s,n);

adata.Read(s[1],n);

ip:=abinding.PeerIP;

if(bGame) then

begin

memo1.Lines.Add(pName +': '+s);

time := 0;

Button3.Enabled:= true;

end;

if(not bGame) then

if ((timer2.enabled=true) and (s[1]=chr($01))) or ((timer1.enabled=true) and (s[1]=chr($02))) then

begin

ButtonSelected:= messagedlg('Вы хотите сыграть с '+copy(s,2,n)+' '+'Вы согласны?',mtConfirmation,[mbYes, mbNo], 0);

if (ButtonSelected=mrYes) then

begin

IdUdpClient1.BroadcastEnabled:=false;

timer1.Enabled:=false;

idudpclient1.Host:=ip;

memo2.Visible:=true;

button3.Visible:=true;

button1.Enabled:=false;

button2.Visible:=true;

timer2.Enabled:=true;

bGame := true;

pName := copy(s,2,n);

time :=0;

if(CheckBox2.Checked) then

begin

IdUdpClient1.Send(chr($02) + Edit1.Text);

end;

end;

end;

end;

procedure TForm1.CheckBox1Click(Sender: TObject);

begin

if checkbox1.checked=true then checkbox2.Enabled:=false;

if checkbox1.checked=false then checkbox2.Enabled:=true;

end;

procedure TForm1.CheckBox2Click(Sender: TObject);

begin

if checkbox2.checked=true then checkbox1.Enabled:=false;

if checkbox2.checked=false then checkbox1.Enabled:=true;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

restart;

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

time:=time+1;

progressbar1.Position:=time+2;

IdUdpClient1.Send(chr($01)+edit1.text);

if time=60 then

begin

messagebeep(0);

showmessage('Игроков не найдено :( ');

restart;

timer1.Enabled:=false;

end;

end;

procedure TForm1.Timer2Timer(Sender: TObject);

begin

time:=time+1;

progressbar1.Position:=time+2;

if time=60 then

begin

messagebeep(0);

showmessage('Ответ не получен');

restart;

timer2.Enabled:=false;

end;

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

if(edit1.text <> '') then

begin

button3.Enabled:=false;

IdUdpClient1.Send(memo2.text);

memo1.Lines.Add(Edit1.Text+': '+ memo2.text);

memo2.Text := '';

time:=0;

end;

end; end.

Блок схемы

procedure TForm1.Button1Click

procedure TForm1.Button2Click

procedure TForm1.IdUDPServer1UDPRead

procedure TForm1.CheckBox1Click И procedure TForm1.CheckBox2Click

procedure restart

procedure TForm1.Timer1Timer

procedure TForm2.Timer1Timer

procedure TForm1.Button3Click

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]