1 (изменено: Arigato, 2013-10-28 13:02:17)

Тема: CMD/BAT: Игра "Морской бой"

Игра "Морской бой" на BAT-файлах

Ссылка для скачивания: http://yadi.sk/d/zGkSTyIPBheWm

Системные требования: Microsoft Windows XP или 7, на других версиях не тестировалось, но должно работать.

Описание:
Реализация классической игры для двоих игроков "Морской бой" на BAT-файлах. Расставляйте свои корабли и попробуйте шансы в игре против мега-интеллекта компьютера - уничтожьте вражеские корабли первым!

Скриншоты:

http://s005.radikal.ru/i212/1310/f2/ff47ae5572c8.png

http://s56.radikal.ru/i152/1310/7f/b82ac2651084.png

http://i022.radikal.ru/1310/69/0a867ba0f81e.png

P.S. О замеченных ошибках сообщайте в этой теме.

2

Re: CMD/BAT: Игра "Морской бой"

Основательная работа! Ещё раз обращаю внимание руководства и сообщества.


Воплощение «Морского боя» более чем уместно в виде консольного приложения, а для написания консольного приложения вполне достаточно Batch-языка (вторая часть утверждения, признаю, немного спорная). Признаюсь, была у меня такая мечта, но «тем, кем я хотел бы быть, стал уже кто-то другой». Впрочем, ещё остаётся возможность сделать что-то своё в направлении разработки стратегии…

В коде не очень-то разбирался, пока спрошу о третьестепенной вещи: разве что-то даёт

call :randomize

:randomize
:: Регенерация счетчика случайных чисел
  setlocal
  set rndTemp=%random%
endlocal & exit /b

? (равносильно

rem %random%

)
В любом случае, вероятно, не «счётчика», а «датчика» (или, хотя бы «генератора»).

Из первых впечатлений: в заставке перед появлением корабля и после его исчезновения проходит какое-то время — это преднамеренный выбор?

Более важное впечатление:

Arigato пишет:

Реализация классической игры

— разве в классических правилах не различаются «ранил» и «убил»?

3

Re: CMD/BAT: Игра "Морской бой"

Ещё раз обращаю внимание руководства и сообщества.

Спасибо за поддержку!

равносильно
rem %random%

А вот интересно, в данной строке ведь все равно произойдет обращение к переменной %random%? Если так, то да, можно код функции и так записать.

В любом случае, вероятно, не «счётчика», а «датчика» (или, хотя бы «генератора»).

Обычно в генераторах ПСЧ есть некоторое значение, которое используется для генерации очередного числа и, заодно, меняется на новое для последующей генерации. Это как бы счетчик, от которого зависит генерируемое число.

в заставке перед появлением корабля и после его исчезновения проходит какое-то время — это преднамеренный выбор?

Отображением двигающихся кораблей занимается функция :scene, давно ее делал, но, как помню, были там какие-то проблемы, чтобы строки не съезжали.

разве в классических правилах не различаются «ранил» и «убил»?

Никогда не признавал версию игры с указанием на убийство. Более того, когда еще в детстве меня обучили этой игре, то никаких "убил" там не было, про такую версию узнал позже и долго плевался. Пусть игрок сам определяет, убил или нет, тем более, что это не такая и сложная задача. Единственное, что иногда надо сделать лишний выстрел, чтобы убедиться. Эта неопределенность только добавляет азарта и немного усложняет игру.

4

Re: CMD/BAT: Игра "Морской бой"

А вот интересно, в данной строке ведь все равно произойдет обращение к переменной %random%?

Произойдёт:

echo on
for %%i in (1) do rem %random%

Если так, то да, можно код функции и так записать.

Ну, сугубо мне кажется, что оформлять такое обращение в виде функции избыточно,
но больше интересует, что меняет такое однократное обращение к %random%?

5 (изменено: Arigato, 2013-10-28 20:12:55)

Re: CMD/BAT: Игра "Морской бой"

Простой код для теста:

echo off
echo %random%
echo %random%
echo %random%
pause

Запускаю 3 раза с небольшим промежутком времени. Результат (Win XP SP3):

14333
32346
23511

14340
21075
26471

14346
9803
29431

Как видите, первое число совсем не случайное, оно растет с каждым запуском, скорее всего, некоторая привязка ко времени. При последующих же вызовах получается вполне себе последовательность ПСЧ. Вот для того, чтобы пропустить это первое неслучайное число и делается дополнительный вызов.

оформлять такое обращение в виде функции избыточно,

Исключительно для улучшения читабельности. Даже такое простое действие лучше вынести в отдельную функцию, при чтении кода будет ясно, ради чего происходит вызов функции.

6 (изменено: trash50, 2014-01-05 01:54:10)

Re: CMD/BAT: Игра "Морской бой"

Градусник понравился:

::ГРАДУСНИК
@ECHO OFF
  0<nul set /p .=Расставляю корабли: ????????????????????????????????????????
  :: верхний предел цикла - количество расстановок (40)
  for /l %%n in (1, 1, 40) do (
    0<nul set /p .=?
    PING LOCALHOST >nul 2>&1
    )
PAUSE

7

Re: CMD/BAT: Игра "Морской бой"

Интересно реализовано)

8

Re: CMD/BAT: Игра "Морской бой"

trash50, только у меня там нет искусственной задержки, компьютер реально долго думает. При расстановке кораблей на самом деле он строит множество различных случайных расстановок, а среди них выбирает ту, в которой больше образовалось пустот, что усложняет задачу игроку.

9

Re: CMD/BAT: Игра "Морской бой"

Я так полагаю, задачу можно сразу упростить, если ограничить расстановку 2x3, 3x2 и 4x1 только краями поля — при этом пустоты будут максимальны.

10

Re: CMD/BAT: Игра "Морской бой"

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

11

Re: CMD/BAT: Игра "Морской бой"

«Как можно больше пустых клеток» — это единственный способ, который я указал выше. А вероятности было бы интересно посчитать.

12

Re: CMD/BAT: Игра "Морской бой"

alexii пишет:

это единственный способ, который я указал выше.

Эти расстановки у верхнего края

OOOO.OO.OO
..........
OOO.OOO.OO
..........


O.OO.O.O.O
O....O.O.O
O.OO.O. .O
....... .O
        ..

относятся к единственному способу?

13

Re: CMD/BAT: Игра "Морской бой"

Первая — да. Фактически сводится к перестановке. Вторая — нет: число оставшихся для расстановки полей на единицу меньше.

+ открыть спойлер

http://img37.imageshack.us/img37/5202/ohb6.png

14 (изменено: wisgest, 2014-02-27 08:16:08)

Re: CMD/BAT: Игра "Морской бой"

alexii пишет:

Первая — да. Фактически сводится к перестановке.

Такая, кажется, не сводится:


O.OOOO.OOO
O.........
O.OO.OO.OO
..........
alexii пишет:

Вторая — нет: число оставшихся для расстановки полей на единицу меньше.

Действительно. По ошибке показалось одинаково.

alexii, с помощью чего сделан рисунок: это всё вручную?
-------------------------------------

alexii пишет:

Я так полагаю, задачу можно сразу упростить, если ограничить расстановку 2x3, 3x2 и 4x1 только краями поля — при этом пустоты будут максимальны.

Строго говоря, пустоты будут максимальны, если краями поля ограничить расстановку и 1x1, но так число расстановок сокращается ещё сильнее, т.е. у края все корабли ставить всё-же не стоит. Почему в таком случае у края не поставить несколько 1x1, а какой-нибудь 2x1 не поместить в середину?

15

Re: CMD/BAT: Игра "Морской бой"

wisgest пишет:

Такая, кажется, не сводится:

Ага, верно. Я такую не пробовал даже.

wisgest пишет:

alexii, с помощью чего сделан рисунок: это всё вручную?

Вручную. Чтобы не считать сумму единиц. Microsoft Excel. Потом скриншот, и обводка, стрелки, цветной текст — в PicPic.

wisgest пишет:

Строго говоря, пустоты будут максимальны, если краями поля ограничить расстановку и 1x1, но так число расстановок сокращается ещё сильнее, т.е. у края все корабли ставить всё-же не стоит.

Чисто теоретически, имеет смысл оставить и 3 из 4 1x1 у края, а единственный оставшийся «затерять» в пустом пространстве. Но тогда совсем не интересно .

wisgest пишет:

Почему в таком случае у края не поставить несколько 1x1, а какой-нибудь 2x1 не поместить в середину?

Не считал, сколько выйдет пустых в этом случае.