Форум программистов, компьютерный форум, киберфорум
Бета-тестирование
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.74/27: Рейтинг темы: голосов - 27, средняя оценка - 4.74
1230 / 66 / 16
Регистрация: 23.04.2007
Сообщений: 127
1

Сетевой Морской Бой на BAT

31.10.2011, 19:54. Просмотров 5583. Ответов 18

Сетевой Морской Бой на BAT

В своей работе я часто сталкиваюсь с написанием пакетных файлов и мне стало интересно, на что способны BAT. Сначала написал несколько функций для математических расчетов (Lib\ExtFunc.bat). Позже пришла мне в голову мысль сделать игру - Морской Бой. В первой версии игры ввод координат и управление было организовано через "Set /P ...", а текст выводился на экран очень большими блоками, что затрудняло понимание и написание кода. Написание игры было отложено на неопределенное время. Через полгода собравшись с силами, было решено доделать игру. Тогда и был написан модуль (Lib\ScreenBufferFunc.bat) значительно упростивший работу по выводу текста в окно CMD. Появилась необходимость обработки команд по нажатию кнопок клавиатуры. Данная задача была организована через временную программку, автоматически создаваемую через debug.exe и считывающую скан-код нажатой клавиши. Позже был написан алгоритм автоматической расстановки кораблей (устал расставлять корабли при каждом тестировании) и загрузка/сохранение параметров в конфигурационном файле. Поддержка сетевой игры была добавлена в завершении разработки (Lib\NetWorkFunc.bat).

А вот и сама игра…

Сетевой Морской Бой на BAT


Я не буду приводить тут всего кода, так как это порядка 2000 строк в основном файле игры (SeaBattle.bat) и порядка 1500 строк кода в дополнительных файлах.

Ниже приведен основной блок игры:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
@Echo Off
SetLocal ENABLEDELAYEDEXPANSION
Color 0f
    Title Њ®абЄ®© Ў®©
 
    Set GetKeyFileName=GetKey
    Set ConfigFileName=Config.ini
    Set CurDir=%CD%
    Set TempDir=%TEMP%
 
    Cls
 
    Rem Проверка существования библиотек
    Set const_LibNotFound=ЌҐ **©¤Ґ** ЎЁЎ«Ё®вҐЄ*:
    Set var_Lib=%CD%\Lib\ExtFunc.bat
    Set var_sbLib=%CD%\Lib\ScreenBufferFunc.bat
    Set var_nwLib=%CD%\Lib\NetWorkFunc.bat
    If Not Exist "%var_Lib%" (
        Cls
        Echo Error: %const_LibNotFound% "%var_Lib%"
        Pause>nul
        Exit & Rem На выход
    )
    Call "%var_Lib%" InitFunc
    If Not Exist "%var_sbLib%" (
        Cls
        Echo Error: %const_LibNotFound% "%var_sbLib%"
        Pause>nul
        Exit & Rem На выход
    )
    Call "%var_sbLib%" InitFunc
    If Not Exist "%var_nwLib%" (
        Cls
        Echo Error: %const_LibNotFound% "%var_nwLib%"
        Pause>nul
        Exit & Rem На выход
    )
    Call "%var_nwLib%" InitFunc
 
    Call :Create
    
    PUSHD %TempDir%
    Rem Создаем файл для считывания кода клавиш во временном каталоге
    If Exist %GetKeyFileName%.com Del %GetKeyFileName%.com
    Call :MakeProgramGetKey %GetKeyFileName%
 
    Rem Обнуляем лог
    Echo. > Log.txt
 
    Call :Application
:ExitApp
    Call :Destroy
 
    Del %GetKeyFileName%.com
    Del Log.txt
    POPD
EndLocal
Exit
 
Rem --- cut ---
 
Rem Основное тело программы
:Application
    :ReStart
 
        Rem --- cut ---
 
        If %UserMove% EQU 1 (
            Call :GetKeyCode %GetKeyFileName%
            Call :KeyPress !Result1! "!Result2!"
        )
    Goto ReStart
Exit /b
 
Rem --- cut ---
 
Rem Создание программы по определению скан кода клавиши
Rem Типа асм вставки (они же не запрещены в других языках, так почему же тут не воспользоваться...) :)))
:MakeProgramGetKey
    If Not Exist %WinDir%\System32\Debug.exe (
        Echo ЌҐ **©¤Ґ* д*©«: "%WinDir%\System32\Debug.exe"
        Pause>nul
        Exit
    )
 
    Echo n %1.com>%1.dat
    Echo r cx>>%1.dat
    Echo 3E>>%1.dat
    Echo a 100>>%1.dat
    Echo xor dx,dx>>%1.dat
    Echo mov dl,24>>%1.dat
    Echo push dx>>%1.dat
    Echo mov ah,^0>>%1.dat
    Echo int 16>>%1.dat
    Echo push cs>>%1.dat
    Echo pop ds>>%1.dat
    Echo mov dl,al>>%1.dat
    Echo push dx>>%1.dat
    Echo mov dl,20>>%1.dat
    Echo push dx>>%1.dat
    Echo mov cl,08>>%1.dat
    Echo shr ax,cl>>%1.dat
    Echo mov bl,0A>>%1.dat
    Echo mov cx,03>>%1.dat
    Echo div bl>>%1.dat
    Echo add ah,30>>%1.dat
    Echo mov dl,ah>>%1.dat
    Echo push dx>>%1.dat
    Echo xor ah,ah>>%1.dat
    Echo add cx,01>>%1.dat
    Echo test al,al>>%1.dat
    Echo jnz 11A>>%1.dat
    Echo mov di,150>>%1.dat
    Echo mov dx,di>>%1.dat
    Echo pop ax>>%1.dat
    Echo mov [di],al>>%1.dat
    Echo add di,^1>>%1.dat
    Echo loop 130>>%1.dat
    Echo mov ah,^9>>%1.dat
    Echo int 21>>%1.dat
    Echo int 20>>%1.dat
    Echo.>>%1.dat
    Echo w>>%1.dat
    Echo q>>%1.dat
    Echo.>>%1.dat
    debug < %1.dat > nul
    Del %1.dat
Exit /b

Я понимаю что программа на assembler - это не BAT, но по другому не получилось, так что будем считать что игра написана на BAT+ASM.

Пакетный файл начинается с команды SetLocal с аргументом ENABLEDELAYEDEXPANSION. Далее идет проверка на существование библиотек ExtFunc.bat, ScreenBufferFunc.bat, NetWorkFunc.bat, которые должны находиться в каталоге "Lib". После этого выполняется процедура "Create" в которой читается конфигурационный файл и идет подготовка к запуску игры. Создается программа по считыванию скан-кода клавиши во временном каталоге и управление передается на процедуру "Application". Эта процедура есть не что иное как бесконечный цикл с последовательным выводом текста на экран, расчетами и передачей управления пользователю. Выход из программы осуществляется переходом на метку "ExitApp".

- Так как файл работает не очень быстро, возможны небольшие задержки перерисовки экрана при управлении с клавиатуры и при выводе диалоговых окон.
- Навигация по меню осуществляется с помощью стрелок "Up", "Down" и кнопок "Enter", "Escape". В диалоговом окне: "Enter" - ОК, "Escape" - Отмена.

И на закуску, вращающийся 3D куб (Add\Cube3D.bat):

Сетевой Морской Бой на BAT


В модуле Lib\ExtFunc.bat меются функции для выполнения простых арифметических операций с большими числами, а так же еще несколько интересных функций, работа которых представлена в файлах: Add\AROP.bat, Add\TRFC.bat, Add\Others.bat

Сетевой Морской Бой на BAT


Все файлы собраны в 1 архив. Содержание архива SeaBattle.rar:
  • [FOLDER] SeaBattle
    • [FOLDER] Add
      • AROP.bat (2 468 байт)
      • CreateDosText.bat (497 байт)
      • Cube3D.bat (17 755 байт)
      • GraphicsSymbol.bat (1 920 байт)
      • Others.bat (2 715 байт)
      • TRFC.bat (1 427 байт)
    • [FOLDER] Lib
      • ExtFunc.bat (37 414 байт)
      • NetWorkFunc.bat (8 531 байт)
      • ScreenBufferFunc.bat (6 265 байт)
    • [FOLDER] ScreenShot
      • ScreenShotViewer.bat (315 байт)
    • SeaBattle.bat (66 199 байт)
    • Config.ini (318 байт)

BAT-файлы тестировались на Windows XP x86 и на Windows 7 x64 (Кроме игры, так как отсутствует debug.exe).
Вот в принципе и все.
Возможно, кто-то найдет во всем этом что-то новое и полезное для себя.

Спасибо за внимание!
С Уважением Delphiist.
28
Вложения
Тип файла: rar SeaBattle.rar (36.0 Кб, 320 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.10.2011, 19:54
Ответы с готовыми решениями:

Морской бой
Здравствуйте! Начинаю изучать программирование с помощью создания игры Морской бой. Ничего не...

Морской Бой
Люди прошу помогите....курсовую надо сдавать, а как решить задачу я не знаю... Вот такое...

Морской бой
var sea = , , , , ]; // Оригинальный массив,...

Морской бой
У меня программа должна когда взрываеться весь корабль обрисовывать его &quot;*&quot; подскажите как это...

18
178 / 29 / 3
Регистрация: 29.08.2010
Сообщений: 228
31.10.2011, 21:02 2
а можно получить debug.exe хочется протестировать игру )
0
CEO
Эксперт С++
2255 / 1245 / 57
Регистрация: 16.03.2009
Сообщений: 3,588
31.10.2011, 21:09 3
Delphiist, одно слово - уже сама реализация это круто
0
834 / 348 / 12
Регистрация: 04.10.2009
Сообщений: 589
31.10.2011, 21:09 4
debug.exe это стандартный отладчик и он входит в состав всех версий Windows. Должен быть в папке system32.
0
178 / 29 / 3
Регистрация: 29.08.2010
Сообщений: 228
31.10.2011, 21:18 5
Цитата Сообщение от atributz Посмотреть сообщение
debug.exe это стандартный отладчик и он входит в состав всех версий Windows. Должен быть в папке system32.
странно обыскал всю папку виндус но debug.exe не нашел (
0
0 / 1 / 1
Регистрация: 31.10.2011
Сообщений: 10
31.10.2011, 22:00 6
странно обыскал всю папку виндус но debug.exe не нашел (
Если ОС Windows XP, то он находися по адресу C:\WINDOWS\system32\debug.exe.
А если ОС Windows 7, то его там не будет. В описание написано, что игра только для ХР.
1
1230 / 66 / 16
Регистрация: 23.04.2007
Сообщений: 127
31.10.2011, 22:43  [ТС] 7
Как уже было сказано выше debug.exe есть в Windows XP. В Windows 7 x64 такого файла нет (про Windows 7 x86 ничего сказать не могу).
Данный BAT-файл игры разрабатывался с тем учетом, что никакие доп. файлы ему нужны (кроме тех, что имеются в Windows XP).
Так что для запуска игры в Windows XP должно хватить того, что лежит в архиве.
0
Эксперт JavaЭксперт С++
8357 / 3578 / 419
Регистрация: 03.07.2009
Сообщений: 10,708
01.11.2011, 18:15 8
Delphiist, после того как я выиграл и потопил последний одинарный корабль - в списке кораблей соперника отображается не 0, а 1.
И еще я не смог сделать скриншот - по F5, выдается сообщение
The system cannot find the path specified.
и тут же происходит cls
0
251 / 239 / 16
Регистрация: 31.12.2009
Сообщений: 324
01.11.2011, 18:25 9
Суперкруто! Масштабный для данного языка проект! только вроде "чистый" BAT закончился если не в dos622 то уж точно в win98-me а это уже CMD. Хотя безусловно выглядит впечатляюще, и эти "ассемблерные вставки" здесь весьма уместны!
0
Почетный модератор
21189 / 8924 / 1080
Регистрация: 11.04.2010
Сообщений: 11,015
01.11.2011, 18:25 10
Снимаю шляпу, мастер!
Но комент
0
1230 / 66 / 16
Регистрация: 23.04.2007
Сообщений: 127
01.11.2011, 20:31  [ТС] 11
Цитата Сообщение от M128K145 Посмотреть сообщение
Delphiist, после того как я выиграл и потопил последний одинарный корабль - в списке кораблей соперника отображается не 0, а 1.
И еще я не смог сделать скриншот - по F5, выдается сообщение
The system cannot find the path specified.
и тут же происходит cls
1. По поводу отображения в списке 1 корабля по завершении игры: условие проверки выигрыша или проигрыша стоит в самом начале цикла , поэтому не происходит последней перерисовки экрана, а выполнение передается сразу на вывод диалогового окна.
Данную проблему исправить можно, но я не стал (трудоемкий процесс отладки ), если есть необходимость я могу посмотреть.

2. По поводу скриншота, моя недоработка. Возможно игра запускается не с загрузочного раздела жесткого диска, а с другого или с сетевого диска.

Ошибка с строке 1901. Попробуйте изменить данный кусок кода:
Bash
1
2
3
4
5
    Rem F5
    If %1 EQU 63 (
        Set rnd=%date%%time::=%
        Call "%var_sbLib%" sb_BufferToFile "%CurDir%\ScreenShot\BS_ScreenShot_!rnd:~0,2!!rnd:~3,2!!rnd:~6,4!!rnd:~10,6!!rnd:~-2!.txt" 0
    )
на этот:
Bash
1
2
3
4
5
6
7
    Rem F5
    If %1 EQU 63 (
        Set rnd=%date%%time::=%
        PUSHD %CurDir%
        Call "%var_sbLib%" sb_BufferToFile "ScreenShot\BS_ScreenShot_!rnd:~0,2!!rnd:~3,2!!rnd:~6,4!!rnd:~10,6!!rnd:~-2!.txt" 0
        POPD
    )
0
794 / 176 / 9
Регистрация: 11.01.2011
Сообщений: 543
03.11.2011, 17:59 12
Мда, вот то работа в CMD. Не знаю, что сказать, кроме как:
Цитата Сообщение от Памирыч Посмотреть сообщение
Снимаю шляпу, мастер!
0
1230 / 66 / 16
Регистрация: 23.04.2007
Сообщений: 127
10.11.2011, 21:17  [ТС] 13
Спасибо всем за тестирование и оценку игры.
Прикрепил файл SeaBattle_bat.rar с измененной 1901 строкой (проблема со скриншотом).

И, кстати, у меня на виртуальной Win XP установленной под Win 7 батник работает быстрее, чем на реальной Win XP .
2
794 / 176 / 9
Регистрация: 11.01.2011
Сообщений: 543
22.12.2011, 02:00 14
Не работал ScreenShotViewer.bat, названия файлов в команде dir использовано без кавычек, хотя в названии есть пробел. Во-вторых с usebackq не работало.
А почему ты использовал copy /y "%%i" con>nul, а не type?

Вот рабочий вариант:
Bash
1
2
3
4
5
@Rem ---------------------------------------------------------
@Rem     Просмотр снимков экрана CMD. Delphiist (c) 2011
@Rem ---------------------------------------------------------
 
@Echo off&For /F "tokens=*" %%i In ('Dir /a /B "*ScreenShot*.txt"') Do (CLS&Title %%i - ScreenShotViewer&Copy /y "%%i" con >nul&Pause>nul)
0
1230 / 66 / 16
Регистрация: 23.04.2007
Сообщений: 127
23.12.2011, 18:20  [ТС] 15
Цитата Сообщение от Ris Посмотреть сообщение
Не работал ScreenShotViewer.bat, названия файлов в команде dir использовано без кавычек, хотя в названии есть пробел. Во-вторых с usebackq не работало.
Не помню чтобы там были пробелы. Возможно какая то ошибка при подстановке даты-времени в имя файла. Во всяком случае спасибо за корректировку.
Цитата Сообщение от Ris Посмотреть сообщение
А почему ты использовал copy /y "%%i" con>nul, а не type?
Не знай, это первое что пришло в голову. (Возможно из-за того, что постоянно работал с файлом CreateDosText.bat)
1
17 / 17 / 1
Регистрация: 14.11.2011
Сообщений: 94
27.12.2011, 19:41 16
...если честно мне очень понравилась реализация Жаль не смог найти чела что бы вдвоем испробовать игру.

Не по теме:

Я когда то сам хотел создавать игры на ВАТ.....пока не увидел их язык :D

0
0 / 0 / 0
Регистрация: 18.12.2018
Сообщений: 1
04.01.2019, 11:41 17
А как сыграть по сети? (я понятия не имею что за путь к расшаренному каталогу)
0
2573 / 1165 / 152
Регистрация: 28.10.2011
Сообщений: 4,125
Записей в блоге: 6
05.01.2019, 21:59 18
Цитата Сообщение от Delphiist Посмотреть сообщение
будем считать что игра написана на BAT+ASM.
Цитата Сообщение от Delphiist Посмотреть сообщение
Код
Echo int 21>>%1.dat
Echo int 20>>%1.dat
Из-за этого нужен DOS, а в современных ОС работать не будет.
0
0 / 0 / 0
Регистрация: 15.06.2019
Сообщений: 1
15.06.2019, 08:43 19
привет а у меня вопрос как играть по сети или пока нелзя посетке
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2019, 08:43

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Морской бой
Входные данные двумерный массив 10х10, заполненный нолями и единицами, где 0-пустая клетка, а...

Морской бой=)
Создать игру &quot; Морской бой&quot;

Морской бой в С
Прошу,что-бы он был максимально упрощенным .А то я ток начинающий программист)

Морской бой
Хочу написать игру морской бой средствами win api, но возник вопрос - каким образом определять в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.