6 января 2010 в 18:41

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

Недавно с целью изучения 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».
+147
2082
57
naething 45,4

Комментарии (53)

+12
SHK #
Круто!
0
expee #
Молодец. Честно :)
+2
SHK #
Один судоку на батниках, второй морской бой на bash, вот на таких людях и держится русь программерская :)
p.s. За исходники спасибо, очень интересно.
+2
AlanKochev #
А я вот вчера нашел тетрис на sed нашел был в шоке. Особенно поразило что автор — девушка.
+1
qmax #
а ссылку?
+1
worklez #
0
AlanKochev #
Прошу прощенья добавлял ссылку с помощью тегов по слово тетрис, но почему-то ссылки так и не добавилось, а я этого не заметил
–11
mrpsycho #
с удовольствием жду на бате.

+5
SMiX #
Сомневаюсь, что на чистом бате можно сделать сетевую игру.
–5
Aquahawk #
Пинги гонять можно. А можно зашарить стандартными средствами файл и через него гонять.
+5
mrpsycho #
чистый или не особо, но крестики-нолики есть
0
nsinreal #
На чистом бате вообще ничего сделать не можно. А вот с помощью сетевых папок можно с легкостью организовать обмен данными.
0
firstbyte #
Надо будет проверить, интересно.
PS сам использую New wave ;)
0
Chikey #
а как картинки делал? Вручную символы подбирал?
0
naething #
Ну да, просто в текстовом редакторе :)
0
naething #
Не подскажете нормальное место, куда можно залить код? Оказалось, что pastebay вставляет переносы строк в стиле Windows, из-за чего указание интерпретатора с помощью #! перестает работать.
0
dscmn #
paste.ubuntu.com
0
naething #
Там почему-то просят войти в систему, когда я хочу скачать файл.
В итоге залил код на «Народ».
0
dscmn #
Странно, не должно такого быть

Залил, на всякий случай
0
danilissimus #
+1
Iv8 #
github: github.com/
+1
akalend #
супер!
+1
hoxnox #
Действительно, наиболее эффективный метод изучения языка — писать на нем.
Интересно — много времени ушло на подобное изучение bash?
+1
naething #
Конкретно на написание игры ушла пара вечеров, но я относительно неплохо знал bash и до этого, так что оценить время на изучения с нуля сложно.
+1
Alken #
Отлично. Плюсанул был да нечем. Лимит на сегодня исчерпал.
+3
satori #
сделай завтра то, что не хочешь можешь сегодня :)
+1
Alken #
До полуночи подожду.
+1
vrmzar #
Полночь тут.))
+1
korkholeh #
Хардкорно. Очень понравилось.
+4
fsqcds #
Отлично. Сыграл сам с собой. Победил :)
+2
nsinreal #
У… Текущий скрин — чудо! Белым выглядит лучше, хотя не совсем в стиле консольного приложения.
+2
n3m0 #
Реально изверг! Респект тебе!
0
Kind #
Сурово)
0
Baofy #
ВЫ знаете только в извращениях!
+1
Dreadatour #
Нужно ещё управление сделать не «WSAD», а «HJKL», чтобы «тру» было ;) =)
Респект!
+1
lol2Fast4U #
Лучше настраиваемое. Для меня «тру» — это «PNBF» (:
+1
vrmzar #
А когда-то QA & OP )) Кстати, мне всегда было интересно, почему так?)
0
lol2Fast4U #
Почему PNBF?
Previous, Next, Back, Forward. Это Emacs'овское.
+1
vrmzar #
Неа, почему QAOP, это для меня спектрумовское.
0
yktoo #
Как сказал бы КО, так удобнее, если играть двумя руками.
0
flashvoid #
как почему?… что бы задействовать две руки… мышки то нету

хотя уже тогда для игры вдвоем на одном спектруме был изобретен WASD.
0
AlexeyK #
Все бы так с целью изучения писали :)
+2
KedaRasta #
Пост навеял милое воспоминание из «детства»! =)
Классе в 5ом на уроках информатики нам было откровенно скучно (286ые компы с DOS+VolkovComander, училка почтенного возраста и, конечно же, тема занятий — QBasic!). Чтобы хоть как-то убить время, написали «игрулину» на том самом ку-бэйсике, смысл которой заключался в бесконечном побеге белого прямоугольника от (такого же белого) кружочка, который двигался заведомо медленнее, но с жесткой привязкой к координатам преследуемого… Благодаря чьему-то кривому почерку, сие безобразие именовалось «СТАЧ» (хотя, на самом-то деле, подразумевалось «GTA4»:)).
«Тяжелое детство, 8-битные игрушки, прибитые к полу...»©
0
Gorthauer87 #
А мне вот тетрис на sed'е больше понравился. Кому интересно, можете погуглить
0
afiskon #
Видел-видел. Реально крутая штука. uuner.livejournal.com/55238.html
0
Peregrinus #
Смерть свободному времени. Благодарю, реально круто!
0
NektoDev #
убил на нее полночи перед экзаменом >.<
Ну зачем я начал играть…

А автору спасибо, буду ждать сетевые крестики-нолики и камень-ножницы-бумагу =)
0
mcdebugger #
Ух! Это ж чудесно!!!
/me побёг за сорцами…
0
renya #
Спасибо за игру, поиграли с другом
PS: Нужно добавить цвет в игру =)
–2
Alexandr_Kucher #
С такими темпами скоро всё на bash писаться будет!
За сорцы спасибо!
0
3al #
Из внешних программ используются только nc (для организации взаимодействия по TCP)

Зачем оно если есть /dev/tcp?
0
naething #
Я так понял, с помощью /dev/tcp можно только соединиться с удаленным сервером, а открыть порт, принимающий соединения, нельзя. Netcat прекрасно справляется с этой задачей (ключ -l).
0
mishunika #
Очень круто! Молодец!
ЗЫ. Сапасибо за исходники, приятно посмотреть как всё работает.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.