Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Морской бой


Автор: IRQ 7.5.2006, 15:16
Мне надо написать морской бой. Желательно с поддержкой игры по сети. Необходимо использовать потоки и синхронизацию. Подскажите, какие компоненты нужно использовать для подобного рода программ и как использовать потоки в данном случае. 2 игрока. Я не вижу прямо таких напрашивающихся решеений по использованию потоков. 

Автор: Poseidon 7.5.2006, 15:51
Цитата(IRQ @  7.5.2006,  15:16 Найти цитируемый пост)
Подскажите, какие компоненты нужно использовать для подобного рода программ 
 Когда-то писал морской бой, используя только TImage. В принципе, нечего больше и не надо.

Цитата(IRQ @  7.5.2006,  15:16 Найти цитируемый пост)
и как использовать потоки в данном случае.
 Как и обычное использование потоков. Хотя я не понимаю, зачем потоки использовать. Марской бой - он же, по сути, на random строится. И только при попадании нужно включать вычисления, что бы "ударить" по другой палубе (это при игре с ИИ). Единственное, это можно применить патоки при сонхронизации по сети, т.к. сеть может глючить, и тогда будет ощущение, что зависла прога.
 

Автор: IRQ 7.5.2006, 16:22
Ну про потоки-как раз возможно при работе в сети. Но я всё равно не очень понимаю, как именно использовать. А компоненты я имел ввиду для работы в сети. Что надо? TTcpClient/TTcpServer? Где-то видел про Indy. Или может TClient Socket/TServerSocket. Но этих компонентов я почему-то не нашёл в палитре компонентов Delphi 7. Только если руками прописывать. В BCB 6 эти компоненты есть. 

Автор: Тьма 7.5.2006, 16:46
использовать потоки имеет смысл, если так стоит задание....... 

Автор: Poseidon 7.5.2006, 17:58
Цитата(IRQ @  7.5.2006,  16:22 Найти цитируемый пост)
Но этих компонентов я почему-то не нашёл в палитре компонентов Delphi 7

Цитата
Идёшь в пункт меню Component | Install Packages.
Жмёшь кнопку Add.
Находишь в папке Borland\Delphi7\Bin файл dclsockets70.bpl, тыкаешь на него, нахимаешь "Open".
Нажимаешь ОК.
Радуешься тому, что на вкладке Internet появились два новых компонента - TClientSocket и TServerSocket.



Цитата(IRQ @  7.5.2006,  16:22 Найти цитируемый пост)
А компоненты я имел ввиду для работы в сети. Что надо?
Вот как раз TClientSocket и TServerSocket подойдет
 

Автор: IRQ 7.5.2006, 18:30
Спасибо за информацию о добавлении компонентов smile Но хотел бы ещё узнать про потоки. Как их лучше использовать в этом Морском бое. Ведь играют только 2 игрока. 

Автор: Poseidon 7.5.2006, 18:35
Цитата(IRQ @  7.5.2006,  18:30 Найти цитируемый пост)
Как их лучше использовать в этом Морском бое.
 Зашить в отдельный поток только передачу по сети информацию о ходе.
 

Автор: IRQ 8.5.2006, 14:39
А не подскажите, как юзать ClientSocket/ServerSocket. Я пробовал. Вроде всё соединятеся, но сообщения не отсылаются. 

Автор: Poseidon 8.5.2006, 15:33
Главное, не забывать, что сторона, каторая посылает - это ClientSocket, а сторона, каторая принимает - это ServerSocket. Т.е. в программе должен быть и ServerSocket (для приема) и ClientSocket (для посылки).

Вот пример посылки текста (всю информацию о ходе можно запихнуть в текстовую переменную.


Код
{соеденяемся при запуске программы}

procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Port := 1026; // порт можно указать любой, главное, что бы он был свободен.
ServerSocket1.Open;  // запускаем сервер
ClientSocket1.Port:= 1026; // указываем тот же порт, что и у сервера
ClientSocket1.Host:= '127.0.0.1'; // указываем хост или IP сервера. Для тестирования можно указать localhost (127.0.0.1)
ClientSocket1.Open;  // запускаем клиент
end;

{посылаем текст, каторый у нас в Edit1}
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Socket.SendText(Edit1.Text);
end;

{принимаем текст и записываем его в Edit2}
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Edit2.Text:= Socket.ReceiveText;
end;

{закрываем сокеты при выходе}
procedure TForm1.FormDestroy(Sender: TObject);
begin
ClientSocket1.Close;
ServerSocket1.Close;
end;
 

Автор: IRQ 9.5.2006, 01:27
А. Теперь понятно. Просто я пытался юзать TServerSocket.ReceiveText. Но там этого не было smile Попробую так. А как юзать потоки. У меня есть идея как уже говорилось-на игрока по потоку. А синхронизировать как? Сделать например объект Ход и его синхронизировать? 

Автор: Poseidon 9.5.2006, 01:46
Цитата(IRQ @  9.5.2006,  01:27 Найти цитируемый пост)
А как юзать потоки.
 Я уже писал, запихни все работу с сетью в поток, что бы на случай сетевых глюков прога не зависала. Т.е. коннект и передачу сообщения лучше в поток. Так же не мешало бы прикрутить ответ на сообщения. Что-то вроди "сообщение получено". Так во многих сетевых чатах сделано и даже в ICQ-клиентах.
 

Автор: Mechanic 9.5.2006, 21:48
В потоках можно сделать анимацию моря, колец от взрывов, мониторинг сети (юзер ушел, пришел), чат между игроками.  А если использовать Indy, так тот синхронный по определению, тут как раз без потоков не обойтись. Например, сидит такой Indy сокет в потоке, и просто ждет очередного пакета, а по приему бросает сообщение в основное окно об очередном событии, а то уж пущай реагирует.
(Свой "Морской бой" делал на TClientSocket, TServerSocket) 

Автор: IRQ 16.5.2006, 18:30
Появилось ещё несколько вопросов.
1)Использование TClientSocket/TServerSocket упрошает и формализует работу по сети? Можно было бы использовать TTcpClient/TTcpServer? Или нет смысла. Достатчно первых.
2)Потоки. Я так подумал. На каждого игрока создаётся поток. И может получиться так, что игра идёт, а к серверу (тот, кто создал игру) начинает подключаться кто-то ещё. Игра втроём получается. Здесь видимо тоже надо использовать синхронизацию? Расскажите про эту штуку пожалуйста. Про всякие там синхронизации, приостановки потоков. 

Автор: Poseidon 16.5.2006, 18:54
Один топик - один вопрос!

Цитата(IRQ @  16.5.2006,  18:30 Найти цитируемый пост)
Можно было бы использовать TTcpClient/TTcpServer? Или нет смысла. Достатчно первых.
 Первых достаточно, зачем мудрить?

Цитата(IRQ @  16.5.2006,  18:30 Найти цитируемый пост)
И может получиться так, что игра идёт, а к серверу (тот, кто создал игру) начинает подключаться кто-то ещё.
 Может. И это нужно обрабатывать. Т.е. делать так, что бы к серверу мог подключится только один клиент.
 

Автор: VJVS 19.5.2006, 09:27
Poseidon, как мне поставить TClientSocket/TServerSocket в Delphi7, я никак не могу найти!  smile 

Автор: Romikgy 19.5.2006, 09:51
VJVS, DRKB почитай там есть 

Автор: Poseidon 20.5.2006, 11:52
Цитата(VJVS @  19.5.2006,  09:27 Найти цитируемый пост)
Poseidon, как мне поставить TClientSocket/TServerSocket в Delphi7, я никак не могу найти!
 Ё-моё! Зачем ДРКБ читать? В этой теме есть! Как вообще можно что-то узнать, если читать не умеем?

http://forum.vingrad.ru/index.php?showtopic=95023&view=findpost&p=724079
 

Автор: IRQ 21.5.2006, 18:40
Возник ещё один вопрос. Я смог отправить сообщение от клиента к серверу. А как отправить от сервера к клиенту? Возможно ли это? Я писал Server1.Socket.SendText('123')  и получал ошибку. 

Автор: Sunr1se 21.5.2006, 19:06
Код

Server1.Socket.Connections[0].SendText('123');
 

Автор: IRQ 21.5.2006, 19:33
Точно. Что-то я не прочитал про свойство Connections. Дальше Socket не пошёл smile Понятно. Спасибо. 

Автор: JaspeR 8.6.2007, 12:12
Подскажите, в чем проблема???
см рисунок

Автор: Sanchezzz 10.6.2007, 01:06
JaspeR ты две проги запустил?... или порт занет...
найди лутше дему CustomWinSocket 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)