Pull to refresh

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

Reading time2 min
Views8.9K
Недавно с целью изучения bash написал на нем игру в «морской бой» для игры по сети. Игра получила название «Sink 'em all».

image

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

Исходный код можно посмотреть здесь, а вот скачать его лучше тут или вот тут, потому что 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».
Tags:
Hubs:
Total votes 175: ↑161 and ↓14+147
Comments53

Articles