Сетевой морской бой на bash

Опубликовано admin в Пнд, 26/07/2010 - 11:15
Недавно с целью изучения bash написал на нем игру в «морской бой» для игры по сети. Игра получила название «Sink 'em all».

image

Из внешних программ используются только nc (для организации взаимодействия по TCP), stty (для выключения эха при нажатии клавиши) и clear (для очистки терминала).

Исходный код можно посмотреть здесь (_http://pastebay.com/80860), а вот скачать его лучше тут (_http://alexandr.sysoev.ru/uploads/sh/sink.sh.gz) или вот тут (_http://narod.ru/disk/16642806000/sink.sh.html), потому что PasteBay вставляет переносы строк в стиле Windows, из-за чего в свою очередь перестает работать указание интерпретатора с помощью hashbang (#!).

Как поиграть


Скачайте исходный код, переименуйте файл в sink.sh и поставьте на него исполняемый бит. После этого игру можно смело запускать (или не смело — вдруг в ней вредоносный код?). Чтобы запустить сервер, используйте ключ -serve:

./sink.sh -serve

Чтобы присоединиться к серверу, передайте в качестве параметра его IP-адрес или доменное имя, например:

./sink.sh localhost

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

Что полезного я узнал?


В процессе написания я открыл для себя некоторые неизвестные мне ранее возможности и особенности bash. Среди них, например, сопроцессы. С помощью встроенной команды coproc можно создать сопроцесс и общаться с ним через пару пайпов, чем я и воспользовался для общения с nc. Если интересуют подробности, наберите help coproc, или читайте раздел «Coprocesses» в man bash.

В bash есть встроенные средства для работы со строками. Необязательно использовать sed и т. п., чтобы заменить подстроку другой строкой, вычислить длину строки и т. д. Это тоже стало для меня полезным открытием. Если интересуют подробности, могу подсказать, как называется соответствующий раздел в man bash: «Parameter Expansion».

Статья взята с http://habrahabr.ru (_http://habrahabr.ru/blogs/crazydev/80122/)