Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/485: Рейтинг темы: голосов - 485, средняя оценка - 4.90
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16

Игры на CMD и другие сложные проекты*

16.10.2012, 06:56. Показов 101853. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Игра "Сапер"
Игра "Морской бой" на BAT-файлах
написание игры змейки
BatchOS: Операционная система на Batch :)
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.10.2012, 06:56
Ответы с готовыми решениями:

Самые сложные проекты на C#
Где посмотреть и как выглядит самый сложный проект на C# имеющийся на наши дни!? Интересно посмотреть какие серьезные проекты подняты на...

Возможно ли на Ruby on Rails на данный момент писать сложные масштабные проекты?
Будучи девелопером ASP.NET MVC знаю что могу писать довольно сложные приложения. Сейчас хотел бы плавно перейти на разработку на Ruby on...

Ссылки на другие проекты и библиотеки
Моя программа использует несколько написанных мною же библиотек, по мере ее написания, дополняются функционалом и библиотеки. Пытаюсь...

20
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
07.08.2013, 01:52  [ТС]
Игра "Сапер"
Автор: nsinreal habrahabr

Код проверен на безопасность антивирусом "Мозг".
P.S. Комментарии в коде - отпад =) почитайте.

Кликните здесь для просмотра всего текста
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
@echo off
REM Author: nsinreal
REM Blog: [url]http://nsinreal.blogspot.com[/url]
REM E-Mail: [email]nsinreal+batch@gmail.com[/email]
REM XMPP: xmpp://nsinreal@jabber.ru
REM License: cc-by-sa 3.0
 
REM BETA-TEST!!!
REM Update №3
goto :init
 
:init
REM А мы такие замкнутые... cmd.exe -> setlocal /?
setlocal>nul
REM Меняем цвет. Честно, это не нужно, но оставил для приличия.
color 07 >nul
REM Устанавливаем заголовок
title Minesweeper by nsinreal
REM Очищаем экран. Да, в конце игры вам будет предложено сыграть заново. Ну не оставлять же это безобразие?
cls
REM Создаем поле. Максимальное кол-во бомб (maxbombs) - 20. Устанавливаем кол-во бомб в 0, кол-во проставленных флагов в 0.
call :logo
echo Generation field. Please, wait...
set maxbombs=17
set bombs=0
set flags=0
REM Не собираемся ни выходить, ни умирать не выиграывать в начале игры. Хотя, мы даже игру не стартанули
set die=0
set win=0
set quit=0
set started=0
set step=0
REM Собсно сам процес создания полей. mfield - поле, выводимое на экран; rfield - реальное поле
for /L %%x in (1,1,9) do for /L %%y in (1,1,9) do set mfield%%x%%y=?
for /L %%x in (1,1,9) do for /L %%y in (1,1,9) do set rfield%%x%%y=?
call :genbomb
call :genrfield
REM Переходим к игре.
goto :gamecycle
REM goto:eof - это что-то типа return или end в функции/процедуре.
goto:eof
 
:gamecycle
REM Так как это... батник глючит из-за особенностей cmd.exe и нежелания читать разработчиков (как и MS, так и меня) доку, то делаем финт ушами:
REM Если переменная quit не равна 0, то выходим из игры.
if not "%quit%"=="0" (
    endlocal>nul
    goto:eof
    )
REM Очистка экрана.
cls
REM Вывод поля и дополнительной информации.
set line0=:yx  1  2  3  4  5  6  7  8  9  yx:
for /L %%y in (1,1,9) do call set line%%y=:%%y:  %%mfield%%y1%%  %%mfield%%y2%%  %%mfield%%y3%%  %%mfield%%y4%%  %%mfield%%y5%%  %%mfield%%y6%%  %%mfield%%y7%%  %%mfield%%y8%%  %%mfield%%y9%%  :%%y:
REM Изменяем внешний вид: все нули меняем на ноль, а все воспросительные знаки (?) на точки (.).
for /L %%y in (1,1,9) do call set line%%y=%%line%%y:0= %%
for /L %%y in (1,1,9) do call set line%%y=%%line%%y:?=.%%
if %flags% GTR %maxbombs% (
    set line1=%line1%  !!! F
    ) else (
    set line1=%line1%      F
    )
REM Печатаем кол-во флагов.
set line1=%line1%lags: %flags%
set line3=%line3%      Step: %step%
REM Выписываем справку
if not "%die%"=="1" if not "%win%"=="1" (
    set line4=%line4%      Avaibled commands:
    set line5=%line5%      h      - Output this help.
    set line6=%line6%      o [yx] - Open point yx
    set line7=%line7%      f [yx] - Create flag on point yx
    set line8=%line8%      n      - Start new game
    set line9=%line9%      q      - Exit to Windows or console
    )
REM Считаем время. Странно, но если вызывать :checkstart отсюда, а не как правильно, то все работает правильно. Очень странно.
call :checkstart
if not "%started%"=="0" (
    call :endtime
    set line2=%line2%      Time: %gametime%
    ) else (
    set line2=%line2%  !!! Game not started yet.
    )
if "%die%"=="1" set line4=%line4%      BOMB!!! U died.
if "%win%"=="1" set line4=%line4%      WIN!!! WIN!!! WIN!!! WIN!!! WIN!!!
echo %line0%      Bombs: %bombs%
echo :---------------------------------:
for /L %%y in (1,1,8) do call :echofield line%%y
echo %line9%
echo :---------------------------------:
echo %line0%
echo.
REM Проверяем, выиграл ли пользователь.
if not "%die%"=="1" if not "%win%"=="1" call :wincheck
REM Некоторые идиотские проверочки: если мы умерли или выиграли, то выводим запрос на создание новой игры.
if "%die%"=="1" (
    goto:bombdie
    ) else if "%win%"=="1" (
        goto:dowin 
        ) else (
            REM Считываем и обрабатываем данные с клавиатуры.
            goto inputcycle
        )
goto:eof
 
:inputcycle
REM См. первый комент в :gamecycle.
if not "%quit%"=="0" (
    endlocal>nul
    goto:eof
    )
REM Заносим в input магическую строку. Так как переменная input может и не создатся (пользователь нажал Enter), то вводим в неё изначально такой бред. 
REM Так легче, чем использовать IF DEFINED, который, кстати, не всегда работает.
set input=0 00
set /p "input=Input: "
set input=%input: =%
REM Первая буква - необходимое действие.
set action=%input:~0,1%
REM Уходим отсюда.
if "%action%"=="q" (
    set quit=1
    echo Good Bye.
    goto:eof
    )
REM Выводим справку.
if "%action%"=="h" (
    cls
    call :help
    goto:gamecycle
    )
REM Выводим список выигранных игр.
if "%action%"=="r" if EXIST records.log (
    cls
    type records.log
    pause>nul
    goto:gamecycle
    ) else (
    call:errorIO2
    )
if "%action%"=="n" (
    endlocal>nul
    goto init
    )
REM См. первый комент в :gamecycle.
if not "%quit%"=="0" (
    endlocal>nul
    goto:eof
    )
REM Издеваемся над координатами.
REM Честно, мне лень переписывать.
set ix=0
set iy=0
for /L %%a in (1,1,9) do if "%%a"=="%input:~0,1%" set ix=%%a
if %ix%==0 (
    for /L %%a in (1,1,9) do if "%%a"=="%input:~1,1%" set ix=%%a
    for /L %%a in (1,1,9) do if "%%a"=="%input:~2,1%" set iy=%%a
    ) else (
    for /L %%a in (1,1,9) do if "%%a"=="%input:~1,1%" set iy=%%a
    REM Координаты можно ввести без "o" в начале
    set action=o
    )
REM Выводим сообщение, что пользователь - дурак.
if not "%action%"=="q" if not "%action%"=="h" if not "%action%"=="o" if not "%action%"=="f" if not "%action%"=="n" if not "%action%"=="r" call:errorIO2
REM Выводим еще одно сообщение, что пользователь - дурак.
if "%ix%"=="0" (
    call :errorIO1
    goto:gamecycle
    )
if "%iy%"=="0" (
    call :errorIO1
    goto:gamecycle
    )
REM Открываем точки, ставим флаги.
call :checkstart
if "%action%"=="o" (
        call :openpoint %ix% %iy% %%rfield%ix%%iy%%% %%mfield%ix%%iy%%%
        goto:gamecycle
    )
if "%action%"=="f" (
        call :flagpoint %ix% %iy% %%mfield%ix%%iy%%%
        goto:gamecycle
    )
goto:eof
 
REM Вспомогательные процедуры.
REM Выводим наш опознавательный знак.
:logo
echo                                  ~
echo                                  :77~ ~=~I~
echo                          ~       :? I~?:=7=      ~?~
echo                           I7=~ ~I~+7+?:~?7++?=~=?7=
echo                           :=7 7II77III??,+==~~~=I=~
echo                           ~:=I?~7?+7II??++~=?+~:~~
echo                            I777:=I7I??I??++??=~:::~
echo                           I777 :~+I7III??++?+~~~::~=
echo                      ~?IIII?777   777II??++=~~~~::=777II=
echo                       ~~=?I?77777777II???+?==~~:::~7I+~~
echo                         ~,+?IIII7IIII???++??+~~:::~~:
echo                         ~???~??IIII???++~::,~::::~=++~
echo                       ~~~+~I   ??:~+??++=~,:::::~~=?+++~
echo                      ~:,,I===~~++,=?+====~~~:::~+=+I::::~
echo                           =+=======:::=~~~~:::I  +??
echo                            ==~=======~~~~::::~:~+ ?
echo                             ~=====~~~~~::::~~=,~?=:~
echo                            :+?==~~~~:+  +~~==+I+~==~         MINESWEEPER
echo                            =+~:~~==~,~ 7~=+?I?  ~,~=            BY NSINREAL
echo                           =:      ~:=: ++?~~:       ~
echo                                    ,  7  , ~~
echo                                    ~      ~~
echo.
goto:eof
 
REM Пользователь дурак.
:errorIO1
cls
echo Error I/O: Unknown coordinates
call:help
goto:gamecycle
REM Пользователь дважды дурак.
:errorIO2
cls
echo Error I/O: Unknown command
call:help
goto:gamecycle
REM Выписываем пользователю справку.
:help
echo Avaibled commands:
echo   h      - Output this help.
echo   o [yx] - Open point yx
echo   f [yx] - Create flag on point yx
echo   n      - Start new game
IF EXIST records.log echo   r      - Output all records
echo   q      - Exit to Windows or console
echo.
echo Example: o 12     - open point with coordinates y=1, x=2
echo          f 34     - create flag on point y=3, x=4
echo          n        - start new game
echo          new game - start new game
echo.
pause>nul
goto:eof
 
REM Генерируем бомбы.
:genbomb
set nx=%1
set ny=%2
set r1=%random:~-2%
set r2=%random:~-2%
set r1=%r1:0= %
set r2=%r2:0= %
set r1=%r1: =%
set r2=%r2: =%
set r1=%r1:~0,1%
set r2=%r2:~0,1%
if "%r1%"==0 goto :genbomb %nx% %ny%
if "%r2%"==0 goto :genbomb %nx% %ny%
if "%r1%"=="%nx%" goto :genbomb %nx% %ny%
if "%r2%"=="%ny%" goto :genbomb %nx% %ny%
REM Фокус с call - это преобразование имени переменной в её значение. В принципе, можно сделать "call echo %%rfield%%x%%y%%" и будет выведено содержание текущей клетки.
REM Но вот if там нельзя использовать, поэтому мы делаем вызов процедуры с передачей значения переменной и её имени.
call :newbomb %%rfield%r1%%r2%%% rfield%r1%%r2%
REM Делаем бомбы пока их количество не будет равно максимальному.
if "%bombs%" == "%maxbombs%" goto:eof
goto genbomb
 
REM Создаем бомбы, если её нету. Вызывается из :genbomb.
:newbomb
if not "%1"=="X" (
    set %2=X
    set /a bombs=%bombs%+1
    )
goto:eof
 
REM В сапере обычно используются числа для обозначения кол-ва стоящих рядом бомб. Перебираем все клетки и вносим туда необходимые числа. Опять же, используем фокус с call
:genrfield
for /L %%x in (1,1,9) do for /L %%y in (1,1,9) do call :dosumfield %%x %%y %%rfield%%x%%y%% rfield%%x%%y
goto:eof
 
REM А эта процедура записывает необходимые числа в необходимые клеточки.
:dosumfield
REM %1, %2 - координаты (x, y), %3 - содержание клеточки, %4 - имя переменной.
REM Если клеточка заполнена, то выходим из процедуры.
if not "%3"=="?" goto:eof
REM Устанавливаем координаты ближайших клеточек.
set /a x1=%1 - 1 
set /a y1=%2 + 1
 
set /a x2=%1 
set /a y2=%2 + 1 
 
set /a x3=%1 + 1 
set /a y3=%2 + 1
 
set /a x4=%1 - 1 
set /a y4=%2 
 
set /a x5=%1 + 1 
set /a y5=%2
 
set /a x6=%1 - 1 
set /a y6=%2 - 1
 
set /a x7=%1 
set /a y7=%2 - 1 
 
set /a x8=%1 + 1 
set /a y8=%2 - 1
 
REM sum - количество бомб рядом, обнуляем.
set sum=0
REM Проверяем координаты: GTR больше, LSS меньше. "Массив" у нас задан координатами [1..9,1..9], а в результате предыдущих действий координаты выходили за пределы массива.
if %1 GTR 1 if %2 LSS 9 call :newsum %%rfield%x1%%y1%%%
            if %2 LSS 9 call :newsum %%rfield%x2%%y2%%% 
if %1 LSS 9 if %2 LSS 9 call :newsum %%rfield%x3%%y3%%%
if %1 GTR 1             call :newsum %%rfield%x4%%y4%%%
if %1 LSS 9             call :newsum %%rfield%x5%%y5%%%
if %1 GTR 1 if %2 GTR 1 call :newsum %%rfield%x6%%y6%%%
            if %2 GTR 1 call :newsum %%rfield%x7%%y7%%%
if %1 LSS 9 if %2 GTR 1 call :newsum %%rfield%x8%%y8%%%
set %4=%sum%
goto:eof
 
REM Так как call не воспринимает if, то используем отдельную процедуру.
:newsum
if "%1"=="X" set /a sum+=1
goto:eof
 
REM Удаляем числа
:delrfield
for /L %%x in (1,1,9) do for /L %%y in (1,1,9) do call :delsumfield %%x %%y %%rfield%%x%%y%% rfield%%x%%y
goto:eof
 
:delsumfield
if "%3"=="?" goto:eof
if "%3"=="X" goto:eof
set %4=?
goto:eof
 
 
REM Эта процедура относится к выводу поля. Я не знаю как еще в for-цикле использовать две и более команды, кроме как использовать отдельную процедуру. 
:echofield
REM Выводим поле. И пустую строчку.
call echo %%%1%%
echo :-:                             :-:
goto:eof
 
REM Открываем клеточку
:openpoint
rem %1, %2 - x, y; %3 - значение клетки реального поля; %4 - значение клетки видимого поля.
set /a step+=1
REM Если клетка не пуста - рассказываем пользователю много интересного, если в клетке бомба - уже поздно что-либо рассказывать.
if not "%4"=="?" (
    echo Point x=%1 y=%2 already opened
    pause>nul
    goto:eof
    )
if "%3"=="X" if not "%step%"=="1" (
    set die=1
    for /L %%x in (1,1,9) do for /L %%y in (1,1,9) do call set mfield%%x%%y=%%rfield%%x%%y%%
    goto:eof
    )
if "%step%"=="1" if "%3"=="X" (
    set rfield%1%2=?
    set /a bombs-=1
    call :delrfield
    call :genbomb %1 %2
    call :genrfield
    rem call set mfield%1%2=%%rfield%1%2%%
    call :oaf %1 %2 %%rfield%1%2%% %%mfield%1%2%%
    )
REM А если ни то, ни другое, то пытаемся открыть эту и ближние клетки.
call :oaf %1 %2 %3 %4
goto:eof 
 
:oaf
rem %1, %2 - x, y; %3 - значение клетки реального поля; %4 - значение клетки видимого поля.
REM Если клетка пуста (выход за пределы поля) или в ней бомба - уходим отсюда.
if "%3"=="" goto:eof
if "%3"=="X" goto:eof
 
REM Открываем данную клетку
call set mfield%1%2=%%rfield%1%2%%
 
REM Если в данной клетке 0 бомб, то пытаемся открыть все ближние клетки.
if not "%3" == "0" goto:eof
 
REM xn, yn - координаты следующей клетки. Диагональ не проверяется.
set /a xn=%1
set /a yn=%2 + 1
REM Проверка, открыта ли эта клетка на видимом поле.
set dooaf=0
call :checkoaf %%mfield%xn%%yn%%%
REM Если нет - пытаемся открыть.
if %dooaf%==1 call :oaf %xn% %yn% %%rfield%xn%%yn%%% %%mfield%xn%%yn%%%
 
set /a xn=%1
set /a yn=%2 - 1
set dooaf=0
call :checkoaf %%mfield%xn%%yn%%%
if %dooaf%==1 call :oaf %xn% %yn% %%rfield%xn%%yn%%% %%mfield%xn%%yn%%%
 
 
set /a xn=%1 - 1
set /a yn=%2
set dooaf=0
call :checkoaf %%mfield%xn%%yn%%%
if %dooaf%==1 call :oaf %xn% %yn% %%rfield%xn%%yn%%% %%mfield%xn%%yn%%%
 
set /a xn=%1 + 1
set /a yn=%2
set dooaf=0
call :checkoaf %%mfield%xn%%yn%%%
if %dooaf%==1 call :oaf %xn% %yn%   %%rfield%xn%%yn%%% %%mfield%xn%%yn%%%
 
REM Диагональ.
set /a xn=%1 + 1
set /a yn=%2 + 1
set dooaf=0
call :checkoaf %%mfield%xn%%yn%%% %%rfield%xn%%yn%%%
if %dooaf%==1 call :oaf %xn% %yn%   %%rfield%xn%%yn%%% %%mfield%xn%%yn%%%
 
set /a xn=%1 + 1
set /a yn=%2 - 1
set dooaf=0
call :checkoaf %%mfield%xn%%yn%%% %%rfield%xn%%yn%%%
if %dooaf%==1 call :oaf %xn% %yn%   %%rfield%xn%%yn%%% %%mfield%xn%%yn%%%
 
set /a xn=%1 - 1
set /a yn=%2 + 1
set dooaf=0
call :checkoaf %%mfield%xn%%yn%%% %%rfield%xn%%yn%%%
if %dooaf%==1 call :oaf %xn% %yn%   %%rfield%xn%%yn%%% %%mfield%xn%%yn%%%
 
set /a xn=%1 - 1
set /a yn=%2 - 1
set dooaf=0
call :checkoaf %%mfield%xn%%yn%%% %%rfield%xn%%yn%%%
if %dooaf%==1 call :oaf %xn% %yn%   %%rfield%xn%%yn%%% %%mfield%xn%%yn%%%
 
goto:eof
 
REM Проверка, открыта ли клетка на видимом поле.
:checkoaf
if "%1"=="?" set dooaf=1
goto:eof
 
REM Устанавливаем флаг
:flagpoint
REM %1, %2 - x, y; %3 - значение клетки видимого поля
REM Если в клетке уже что-то есть - рассказываем пользователю что-то интересное
if not "%3"=="?" if not "%3"=="!" (
    echo Point %2 %1 already opened
    pause>nul
    goto:eof
    )
REM Если нету флага - ставим, если есть флаг - убираем. Так же изменяем счетчик.
if not "%3"=="!" (
    set /a flags+=1
    call set mfield%%1%%2=^!
    ) else (
    set /a flags-=1
    call set mfield%%1%%2=?
    )
goto:eof 
 
REM Бабах... Мы все умрем... А вот пользователь уже подорвался на какой-то бомбе. Неудачливый из него сапер.
:bombdie
REM :bombdie требует вывода поля (заново), поэтому используется дополнительная переменная для обозначения первого запуска :bombdie и одновременно смерти игры.
if not "%die%"=="1" (
    set die=1
    goto :gamecycle
    )
REM Считываем, хочет ли пользователь еще раз сыграть игру.
pause>nul
echo Want to start new game? Example: yes
set sgame=yes
set /p sgame=
set sgame=%sgame:~0,1%
if "%sgame%"=="y" (
    endlocal>nul
    goto :init
    )
if "%sgame%"=="Y" (
    endlocal>nul
    goto :init
    )
set quit=1
goto:eof
 
REM Проверяем, выиграл ли пользователь.
:wincheck
REM Если флагов больше кол-ва бомб, то пользователь ошибся!
if %flags% GTR %maxbombs% goto:eof
REM Если пользователь решил схитрить... то выходим.
if %step%==0 goto:eof
REM Считаем кол-во правильно поставленных флагов и не открытых клеточек.
set nopoints=0
set rflags=0
for /L %%x in (1,1,9) do for /L %%y in (1,1,9) do call :checkfo %%mfield%%x%%y%% %%rfield%%x%%y%%
REM Если количество правильно поставленных флагов равно кол-ву бомб, то юзер выиграл
if %rflags%==%maxbombs% call :dowin
REM Еще один вариант победы человека над машиной: если все флаги проставлены правильно, но стоят не везде; сумма поставленных флагов и неоткрытых клеточек равна кол-ву бомб.
set /a sumpoints=%nopoints% + %rflags%
if %rflags%==%flags% if %sumpoints%==%maxbombs% call :dowin
goto:eof
 
REM Изменяем счетчики.
:checkfo
if "%1"=="?" set /a nopoints+=1
if "%1"=="!" if "%2"=="X" set /a rflags+=1
goto:eof
 
REM Мы выиграли!
:dowin
if not "%win%"=="1" (
    set win=1
    for /L %%x in (1,1,9) do for /L %%y in (1,1,9) do call set mfield%%x%%y=%%rfield%%x%%y%%
    goto :gamecycle
    )
pause>nul
set name=%USERNAME%
set /p name="Your name: "
set name=%name%:%USERNAME%@%USERDOMAIN%
set name=%name:|=%
IF not EXIST records.log echo ----- Minesweeper' records ----- >records.log
echo Name: %name% ^| Steps: %step% ^| GameTime: %gametime% ^| Flags: %rflags% ^| Not opened: %nopoints% ^| Date-Time: %date% %time% >>records.log 2>nul 
echo Want to start new game? Example: yes
set sgame=yes
set /p sgame=
set sgame=%sgame:~0,1%
if "%sgame%"=="y" (
    endlocal>nul
    goto :init
    )
if "%sgame%"=="Y" (
    endlocal>nul
    goto :init
    )
set quit=1
goto:eof
 
REM Первая процедура для подсчета времени
:checkstart
if not "%started%"=="0" goto:eof
set stime=%time%
set sdate=%date:~0,2%
set started=1
call :endtime
goto:eof
 
REM Вторая (она же основная) процедура для подсчета времени
:endtime
REM Издеваемся над временем.
set rtime=%time%
set stime=%stime::= %
set stime= %stime:,= %
set stime=%stime: 0= %
set rdate=%date:~0,2%
set rtime=%rtime::= %
set rtime= %rtime:,= %
set rtime=%rtime: 0= %
REM В %stime% и %rtime% прописано четыре числа (разделители - пробелы): часы, минуты, секунды, миллисекунды
set counter=4
for /L %%a in (1,1,%counter%) do set s%counter%=
for /L %%a in (1,1,%counter%) do set r%counter%=
REM Начинаем обрабатывать строки stime и rtime с конца.
:looptime
for /F "tokens=%counter%" %%a in ("%stime%") do set s%counter%=%%a
for /F "tokens=%counter%" %%a in ("%rtime%") do set r%counter%=%%a
set /a counter-=1
If %counter% GTR 0 goto looptime
REM Выражаем время одним числом
set /a s=%s4% + %s3%*100 + %s2%*6000 + %s1%*360000
set /a r=%r4% + %r3%*100 + %r2%*6000 + %r1%*360000
REM Учитываем разницу в днях.
if %rdate% GTR %sdate% set /a r+=8640000*(%rdate%-%sdate%)
REM Считаем разницу во времени.
set /a d=%r% - %s%
set /a d1=%d% / 360000
set /a td2=%d% %% 360000
set /a d2=%td2% / 6000
set /a td3=%td2% %% 6000
set /a d3=%td3% / 100
set /a td4=%td3% %% 100
set /a d4=%td4%
if %d1% LSS 10 set d1=0%d1%
if %d2% LSS 10 set d2=0%d2%
if %d3% LSS 10 set d3=0%d3%
if %d4% LSS 10 set d4=0%d4%
REM Устанавливаем прошедшее время.
set gametime=%d1%:%d2%:%d3%.%d4%
endlocal >nul
Вложения
Тип файла: rar miner.rar (6.3 Кб, 456 просмотров)
0
 Аватар для Glevera
14 / 14 / 2
Регистрация: 29.04.2012
Сообщений: 148
05.11.2013, 12:49
Цитата Сообщение от Dragokas Посмотреть сообщение
Игра "Сапер"
Автор: nsinreal habrahabr

Код проверен на безопасность антивирусом "Мозг".
P.S. Комментарии в коде - отпад =) почитайте.
Люблю иногда убить полчаса в Сапере.

Вот и нашлась ошибка...) Не смог выиграть! х)
По ссылке скриншот.
https://www.dropbox.com/s/hvlg... .36.33.png
Миниатюры
Игры на CMD и другие сложные проекты*  
2
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
07.12.2013, 14:45  [ТС]
Игра "Морской бой" на BAT-файлах

Автор: Arigato

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

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

Обсуждение: Игра "Морской бой" на ВАТ-файлах

Скриншоты:

Код
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
@ echo off
setlocal enabledelayedexpansion
 
call :init
call :scene 0 7
 
:continue
call :menu
 
:: Сторона (1 - игрок, 2 - компьютер)
set side=%errorlevel%
 
call :start
 
:game
call :gameOver
call :show %finish%
if %finish% neq 0 goto finish
if %side% equ 1 (
  call :player
) else (
  call :computer
)
goto game
 
:finish
if %finish% equ 1 call :writeLn 1A " + + + ВЫ ВЫИГРАЛИ + + +"
if %finish% equ 2 call :writeLn 1C " - - - ВЫ ПРОИГРАЛИ - - -"
echo:
pause
if %finish% equ 1 (
  mode con cols=80 lines=30
  call :scene 5 2
  mode con cols=80 lines=25
)
goto continue
 
:: ===============
:: ИГРОВЫЕ ФУНКЦИИ
:: ===============
 
:computer
:: Ход компьютера
  0<nul set /p .=Ход компьютера: 
  call :state%state%
  if %kill% equ 1 (
    set play.%row%.%col%=1
  ) else (
    set play.%row%.%col%=-2
    set side=1
  )
exit /b
 
:state1
:: Прострел
:: %row%  - строка выстрела
:: %col%  - столбец выстрела
:: %kill% - результат выстрела (1 - попал, 0 - мимо)
:: TODO: стрелять туда, куда можно поставить максимальное число кораблей максимальной длины
  call :rnd 0 9 row
  call :rnd 0 9 col
  call :freedom %row% %col% play
  if %errorlevel% equ 0 goto state1
  call :rnd 0 1 pki
  set /a pkj=pki-1
  for /l %%m in (1, 1, 2) do (
    set ln=0
    set k=0
    for /l %%n in (1, 1, 2) do (
      :state1_1
      set /a i=%row%+!pki!*!ln!
      set /a j=%col%+!pkj!*!ln!
      call :freedom !i! !j! play
      if !errorlevel! equ 1 (
        set /a k+=1
        set /a ln+=1
        goto state1_1
      )
      set /a pki=-!pki!
      set /a pkj=-!pkj!
      set ln=1    
    )
    call :maxShip
    if !k! geq !errorlevel! (
      set bool=1
      goto state1_2
    )
    set bool=0
    set pki=%pkj%
    set pkj=%pki%
  )
  :state1_2
  if %bool% equ 0 goto :state1
  call :killed %row% %col% kill
  if %kill% equ 1 (
    set pi=%row%
    set pj=%col%
    set len=1
    call :maxShip
    if !errorlevel! gtr 1 (set state=2) else set /a ship.1-=1
  )
exit /b
 
:state2
:: Обстрел
:: %row%  - строка выстрела
:: %col%  - столбец выстрела
:: %kill% - результат выстрела (1 - попал, 0 - мимо)
  set old=!play.%pi%.%pj%!
  set play.%pi%.%pj%=-1
  :state2_1
  set /a row=pi+pki
  set /a col=pj+pkj
  call :freedom %row% %col% play
  set plus=%errorlevel%
  set /a row=pi-pki
  set /a col=pj-pkj
  call :freedom %row% %col% play
  set minus=%errorlevel%
  if %plus% equ 0 if %minus% equ 0 (
    set pki=%pkj%
    set pkj=%pki%
  )
  call :rnd 0 1 rnd
  if %rnd% equ 0 (
    set /a row=%pi%+%pki%
    set /a col=%pj%+%pkj%
  ) else (
    set /a row=%pi%-%pki%
    set /a col=%pj%-%pkj%
  )
  call :freedom %row% %col% play
  if %errorlevel% equ 0 goto state2_1
  call :killed %row% %col% kill
  if %kill% equ 1 (
    set len=2
    set state=1
    call :maxShip
    if !errorlevel! gtr 2 (set state=3) else set /a ship.2-=1
  ) else (
    set k=4
    set ki=+1-1+0+0
    set kj=+0+0+1-1
    for /l %%n in (0, 2, 7) do (
      set /a i=%pi%!ki:~%%n,2!
      set /a j=%pj%!kj:~%%n,2!
      call :freedom !i! !j! play
      if !errorlevel! equ 0 set /a k-=1
    )
    if !k! lss 2 (
      set state=1
      set /a ship.1-=1
    )
  )
  set play.%pi%.%pj%=%old%
exit /b
 
:state3
:: Расстрел
:: %1 - флаг, 1 - просто проверка, без выстрела
:: %row%  - строка выстрела
:: %col%  - столбец выстрела
:: %kill% - результат выстрела (1 - попал, 0 - мимо)
:: TODO: есть баг, не отметил сразу подбитый корабль игрока
  set flag=0
  :state3_1
  set row=%pi%
  set col=%pj%
  :state3_2
  if !play.%row%.%col%! equ 1 (
    set /a row+=%pki%
    set /a col+=%pkj%
    goto state3_2
  )
  set /a i=%row%-%pki%
  set /a j=%col%-%pkj%
  set old=!play.%i%.%j%!
  set play.%i%.%j%=-1
  call :freedom %row% %col% play
  set bool=%errorlevel%
  set play.%i%.%j%=%old%
  if %bool% equ 1 goto state3_3
  set /a pki=-%pki%
  set /a pkj=-%pkj%
  if %flag% equ 1 goto state3_3
  set flag=1
  goto state3_1
  :state3_3
  if %bool% equ 1 (
    if not "%1"=="" exit /b
    call :killed %row% %col% kill
    if !kill! equ 1 (
      set /a len+=1
      call :maxShip
      if !errorlevel! equ !len! (
        set /a ship.!len!-=1
        set state=1
      )
    ) else (
      set trow=%row%
      set tcol=%col%
      set play.%row%.%col%=-2
      call :state3 1
      set row=!trow!
      set col=!tcol!
    )
  ) else (
    set /a ship.%len%-=1
    set state=1
    if "%1"=="" call :state1
  )
exit /b
 
:maxShip
:: Самый большой корабль игрока
:: %ERRORLEVEL% - длина самого большого корабля (0 - игрок проиграл)
  setlocal
  set max=0
  for /l %%i in (1, 1, 4) do if !ship.%%i! gtr 0 set max=%%i
endlocal & exit /b %max%
 
:killed
:: Проверка хода компьютера
:: %1 - строка
:: %2 - столбец
:: %3 - имя переменной для записи результата (1 - попал, 0 - мимо)
  setlocal
  call :coordToLabel %1 %2 aim
  echo %aim%
  echo:
  call :choice "Мимо" "Попал"
  endlocal & set /a %~3=%errorlevel%-1
exit /b
 
:player
:: Ход игрока
  set /p aim=Ваш ход: 
  call :labelToCoord "%aim%" row col
  set val=!comp.%row%.%col%!
  if "%val%"=="" goto player1
  if %val% equ 0 goto player2
  if %val% equ -1 goto player2
  :player1
  call :beep
  goto player
  :player2
  echo:
  if %val% equ 0 (
    call :writeLn 1A " + + + ПОПАЛ + + +"
    set /a comp.%row%.%col%=1
  ) else (
    call :writeLn 1C " - - - МИМО - - -"
    set /a comp.%row%.%col%=-2
    set side=2
  )
  echo:
  pause
exit /b
 
:coordToLabel
:: Получить метку из координат цели
:: %1 - строка
:: %2 - столбец
:: %3 - переменная для записи метки
  setlocal
  set cols=ABCDEFGHIJ
  set aim=!cols:~%2,1!%1
  endlocal & set %~3=%aim%
exit /b
 
:labelToCoord
:: Получить координаты цели из метки
:: %1 - метка
:: %2 - переменная для записи строки
:: %3 - переменная для записи столбца
  setlocal
  call :upperCase "%~1" aim
  set row=%aim:~-1%
  set col=%aim:~0,-1%
  set c=0
  for %%a in (A B C D E F G H I J) do (
    if "%%a"=="%col%" set col=!c!
    set /a c+=1
  )
  endlocal & set %~2=%row%&set %~3=%col%
exit /b
 
:gameOver
:: Проверка окончания игры
:: %finish% - результат (0 - игра продолжается, 1 - игрок выиграл, 2 - игрок проиграл)
  set finish=1
  for /l %%i in (0, 1, 9) do (
    for /l %%j in (0, 1, 9) do if !comp.%%i.%%j! equ 0 set finish=0
  )
  call :maxShip
  if %errorlevel% equ 0 set finish=2
exit /b
 
:init
:: Инициализация игры
  mode con cols=80 lines=25
  title Морской бой (v1.0)
  color 1F
  cls
  call :randomize
exit /b
 
:scene
:: Движение объекта из ресурса
:: %1 - номер данных ресурса
:: %2 - количество строк воды
  setlocal
  set space=
  for /l %%i in (1, 1, 160) do set space= !space!
  set pos=-140
  :scene1
  set text=
  for /f "tokens=2* delims=#" %%s in ('findstr.exe /b /l "%1#" "%~f0"') do (
    if "%%s"=="." (
      set line=%space:~0,80%
    ) else (
      if %pos% lss 0 (
        set line=!space:~%pos%!%%s%space%
        set line=!line:~0,80!
      ) else (
        set line=%%s%space%
        set line=!line:~%pos%,80!
      )
    )
    set text=!text!!line!
  )
  set water=
  set /a cnt=%2 * 80
  for /l %%i in (1, 1, %cnt%) do set water=░!water!
  cls
  echo %text%%water%
  set /a pos+=1
  if %pos% leq 100 goto scene1
endlocal & exit /b
 
:menu
:: Главное меню
:: %ERRORLEVEL% - кто начинает (1 - игрок, 2 - компьютер)
  setlocal
  cls
  call :print 1
  call :writeLn 1B "                                            (c) Arigato Software, 2012-2013"
  echo:
  echo МЕНЮ ИГРЫ
  echo:
  call :choice "Игрок начинает" "Компьютер начинает" "Правила игры" "Выход"
  set result=%errorlevel%
  cls
  if %result% equ 3 (
    call :print 2 1E
    goto menu
  )
  if %result% equ 4 exit 0
  call :print 3 1E
endlocal & exit /b %result%
 
:start
:: Запуск игры
  call :print 4
  0<nul set /p .=Расставляю корабли: ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  :: Значения на игровом поле:
  ::  1 - подбитый корабль
  ::  0 - целый корабль
  :: -1 - нет корабля
  :: -2 - точка промаха
  call :ships comp
  call :diffic comp
  set maxDiffic=%errorlevel%
  :: верхний предел цикла - количество расстановок (40)
  for /l %%n in (1, 1, 40) do (
    0<nul set /p .=█
    call :ships tmpComp
    call :diffic tmpComp
    if !errorlevel! gtr !maxDiffic! (
      set maxDiffic=!errorlevel!
      call :copy tmpComp comp
    )
  )
  call :dispose tmpComp
  call :clear play
  for /l %%i in (1, 1, 4) do set /a ship.%%i=5 - %%i
  set state=1
  cls    
exit /b
 
:clear
:: Очистка игрового поля
:: %1 - имя переменной для очистки
  for /l %%i in (0, 1, 9) do (
    for /l %%j in (0, 1, 9) do set %~1.%%i.%%j=-1
  )
exit /b
 
:dispose
:: Освобождение памяти от игрового поля
:: %1 - имя переменной для удаления
  for /l %%i in (0, 1, 9) do (
    for /l %%j in (0, 1, 9) do set %~1.%%i.%%j=
  )
exit /b
 
:copy
:: Копирование игрового поля
:: %1 - имя переменной, содержащей копируемое игровое поле
:: %2 - имя переменной, куда копировать
  for /l %%i in (0, 1, 9) do (
    for /l %%j in (0, 1, 9) do set %~2.%%i.%%j=!%~1.%%i.%%j!
  )
exit /b
 
:freedom
:: Определение, можно ли поставить однопалубный корабль в заданную позицию
:: %1 - номер строки
:: %2 - номер столбца
:: %3 - имя переменной, содержащей игровое поле
:: %ERRORLEVEL% - результат (1 - можно, 0 - нельзя)
  setlocal
  set ki=+0+1+0-1+1-1+1-1
  set kj=+1+0-1+0+1+1-1-1
  set result=0
  if %1 geq 0 if %1 leq 9 if %2 geq 0 if %2 leq 9 if !%~3.%1.%2! equ -1 (
    for /l %%i in (0, 2, 15) do (
      set /a di=%1!ki:~%%i,2!
      set /a dj=%2!kj:~%%i,2!
      if !di! geq 0 if !di! leq 9 if !dj! geq 0 if !dj! leq 9 (
        set /a val=%~3.!di!.!dj!
        if !val! geq 0 goto freedom1
      )
    )
    set result=1
  )
  :freedom1
endlocal & exit /b %result%
 
:diffic
:: Расчет сложности игровой позиции
:: %1 - имя переменной, содержащей игровое поле
:: %ERRORLEVEL% - результат
  setlocal
  set result=0
  for /l %%i in (0, 1, 9) do (
    for /l %%j in (0, 1, 9) do (
      call :freedom %%i %%j "%~1"
        if !errorlevel! equ 1 set /a result+=1
    )
  )
endlocal & exit /b %result%
 
:ships
:: Расстановка кораблей компьютера
:: %1 - имя переменной, содержащей игровое поле
  call :clear "%~1"
  for /l %%n in (3, -1, 0) do (
    set /a cnt=3-%%n
    for /l %%m in (0, 1, !cnt!) do call :build %%n "%~1"
  )
exit /b
 
:build
:: Размещение корабля на игровом поле
:: %1 - размер корабля на единицу меньше устанавливаемого (0-3)
:: %2 - имя переменной, содержащей игровое поле
  set /a i0=%random% %% 10
  set /a j0=%random% %% 10
  set /a ki=%random% %% 2
  set /a kj=1-ki
  for /l %%n in (0, 1, %1) do (
    set /a i=i0+ki*%%n
    set /a j=j0+kj*%%n
    call :freedom !i! !j! "%~2"
    if !errorlevel! equ 0 (
      goto build
    )
  )
  for /l %%n in (0, 1, %1) do (
    set /a i=i0+ki*%%n
    set /a j=j0+kj*%%n
    set /a %~2.!i!.!j!=0
  )
exit /b
 
:show
:: Вывод игровой ситуации
:: %1 - флаг, 0 - не показывать корабли компьютера
  setlocal
    cls
    echo:
    echo       Поле компьютера           Поле игрока      
    echo:
    echo     A B C D E F G H I J     A B C D E F G H I J     Корабли игрока
    echo    ┌───────────────────┐   ┌───────────────────┐
    set len=4
    set cnt=1
    set c=0
    for /l %%i in (0, 1, 9) do (
      :: Поле компьютера
      set line=  %%i│
      for /l %%j in (0, 1, 9) do (
        set cell=░
        set val=!comp.%%i.%%j!
        if !val! equ 0 if not "%~1"=="0" set cell=■
        if !val! equ -2 set cell=∙
        if !val! equ 1 set cell=*
        set line=!line!!cell! 
      )
      :: Поле игрока
      set line=!line!│  %%i│
      for /l %%j in (0, 1, 9) do (
        set cell=░
        set val=!play.%%i.%%j!
        if !val! equ -2 set cell=∙
        if !val! equ 1 set cell=*
        set line=!line!!cell! 
      )
      set line=!line!│       
      :: Корабли игрока
      set /a alives=ship.!len!
      if !c! lss !alives! (set cell=■) else set cell=*
      for /l %%j in (1, 1, !len!) do (
        set line=!line!!cell! 
      )
      set /a c+=1
      if !c! equ !cnt! (
        set /a len-=1
        set /a cnt+=1
        set c=0
      )
      echo !line!
    )
    echo    └───────────────────┘   └───────────────────┘
    echo:
endlocal & exit /b
 
:: =======================
:: ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ
:: =======================
 
:print
:: Вывод текста из ресурса
:: %1 - номер данных ресурса
:: %2 - цвет первой строки (необязательный параметр)
  setlocal
  set first=1
  for /f "tokens=2* delims=#" %%s in ('findstr.exe /b /l "%1#" "%~f0"') do (
    if "%%s"=="~" (
      pause
      cls
      set first=1
    ) else (
      if !first! equ 1 (
        if not "%~2"=="" (
          call :writeLn %~2 "%%s"
          if not "%%s"=="." set first=0
        ) else echo%%s
      ) else echo%%s
    )
  )
endlocal & exit /b
 
:write
:: Вывести цветную надпись без перевода строки
:: %1 - цвет
:: %2 - текст надписи
:: %3 - флаг, любое значение, если нужно двоеточие в конце строки
  setlocal
  :write1
  set "tempFolder=%TEMP%\%~n0.%time:~-2%.%random%"
  md "%tempFolder%" 2>nul || goto write1
  pushd %tempFolder%
  set /p .=.<nul>"%~2"
  findstr /a:%~1 /c:"." /s "%~2"
  if "%~3"=="" (set /p .=  <nul) else set /p .= <nul
  popd
  rd /s /q "%tempFolder%" 2>nul
endlocal & exit /b
 
:writeLn
:: Вывести цветную надпись с переводом строки
:: %1 - цвет
:: %2 - текст надписи
:: %3 - флаг, любое значение, если нужно двоеточие в конце строки
  call :write %1 "%~2" %3
  echo:
exit /b
 
:choice
:: Выбор пользователем одного из вариантов
:: Параметры - варианты выбора
:: %ERRORLEVEL% - выбранный вариант
  setlocal
  if "%~1"=="" (
    set result=0
    pause
    goto choice3
  )
  set count=0
  :choice1
  set /a count+=1
  echo  %count%. %~1
  shift
  if not "%~1"=="" goto choice1
  :choice2
  set /p result=Ваш выбор (1-%count%): 
  for /l %%i in (1, 1, %count%) do if "%result%"=="%%i" goto choice3
  call :beep
  goto choice2
  :choice3
endlocal & exit /b %result%
 
:beep
:: Подача звукового сигнала
  setlocal
  0<nul set /p strTemp=
endlocal & exit /b
 
:upperCase
:: Преобразование текстовой строки к верхнему регистру
:: %1 - исходная строка
:: %2 - переменная для записи результата
  setlocal
  set strTemp=%~1
  for %%a in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я) do set strTemp=!strTemp:%%a=%%a!
  endlocal & set %~2=%strTemp%
exit /b
 
:randomize
:: Регенерация счетчика случайных чисел
  setlocal
  set rndTemp=%random%
endlocal & exit /b
 
:rnd
:: Генерация случайного числа из заданного диапазона
:: %1 - минимальное значение
:: %2 - максимальное значение
:: %3 - имя переменной для записи результата
  set /a %~3=%1+(%2-%1+1)*%random%/32768
exit /b
 
:: =================
:: ТЕКСТОВЫЕ РЕСУРСЫ
:: =================
 
:: Корабль
0#.
0#                           -                    
0#                          3                
0#                                        
0#                      3                      
0#              q$v        $               
0#                        
0#         v                            
0#           -                      q         
0#        v          -              
0#    o      q       - 3         
0#                                          
0#                                 
0#                          -
0#                
0#              -     
 
:: Логотип
1#.
1#                                                ■■■                    ■■■    
1#.
1#      ■■   ■■  ■■■■  ■■■■   ■■■■  ■■ ■■  ■■■■  ■■  ■■     ■■■■  ■■■■  ■■  ■■  
1#      ■■   ■■ ■■  ■■ ■■ ■■ ■■  ■■ ■■ ■■ ■■  ■■ ■■ ■■■     ■■   ■■  ■■ ■■ ■■■  
1#      ■■■ ■■■ ■■  ■■ ■■ ■■ ■■     ■■■■  ■■  ■■ ■■ ■■■     ■■   ■■  ■■ ■■ ■■■  
1#      ■■■ ■■■ ■■  ■■ ■■ ■■ ■■     ■■■   ■■  ■■ ■■ ■■■     ■■■■ ■■  ■■ ■■ ■■■  
1#      ■■■ ■■■ ■■  ■■ ■■■■  ■■     ■■■■  ■■  ■■ ■■■ ■■     ■■ ■■■■  ■■ ■■■ ■■  
1#      ■■ ■ ■■ ■■  ■■ ■■    ■■  ■■ ■■ ■■ ■■  ■■ ■■■ ■■     ■■ ■■■■  ■■ ■■■ ■■  
1#      ■■ ■ ■■ ■■  ■■ ■■    ■■  ■■ ■■ ■■ ■■  ■■ ■■■ ■■     ■■ ■■■■  ■■ ■■■ ■■  
1#      ■■ ■ ■■  ■■■■  ■■     ■■■■  ■■ ■■  ■■■■  ■■  ■■     ■■■■  ■■■■  ■■  ■■
1#.
 
:: Правила игры
2#                     ПРАВИЛА ИГРЫ МОРСКОЙ БОЙ (стр. 1 из 2)
2#.
2# "Морской бой" - игра для двух  участников, в которой  игроки по очереди называюткоординаты на неизвестной им карте соперника. Если у соперника по этим координа-там имеется  корабль (координаты заняты), то корабль  или его часть "топится", апопавший получает право  сделать еще один ход. Цель игрока - первым поразить всекорабли противника.
2#.
2# Игровое поле - квадрат 10x10 каждого игрока, на котором  размещается флот кораб-лей. Горизонтали  нумеруются сверху  вниз (0-9), а вертикали  помечаются буквамислева направо (A-J).
2#.
2# Размещаются:
2#    1 корабль - ряд из 4 клеток ("четырехпалубные")
2#    2 корабля - ряд из 3 клеток ("трехпалубные")
2#    3 корабля - ряд из 2 клеток ("двухпалубные")
2#    4 корабля - 1 клетка ("однопалубные")
2# При размещении корабли не могут касаться друг друга углами.
2#.
2# Рядом со "своим" квадратом  чертится "чужой"  такого же размера, только  пустой.Это участок моря, где плавают чужие корабли противника.
2# При попадании в корабль  противника - на чужом  поле ставится  крестик. Попавшийстреляет еще раз.
2#.
2#~
2#                     ПРАВИЛА ИГРЫ МОРСКОЙ БОЙ (стр. 2 из 2)
2#.
2# Перед началом боевых действий игроки договариваются, кто будет ходить первым.
2#.
2# Игрок, выполняющий ход, совершает выстрел - указывает координаты клетки, в кото-рой, по его мнению, находится корабль противника, например, "J0" (верхняя праваяклетка).
2#.
2#    1. Если выстрел  пришелся в клетку, не занятую ни одним  кораблем противника,то следует ответ "Мимо" и стрелявший игрок ставит на чужом квадрате в этом местеточку. Право хода переходит к сопернику.
2#.
2#    2. Если выстрел  пришелся в клетку, где находится  корабль, то следует  ответ"Попал". Стрелявший игрок ставит на чужом  поле в эту клетку крестик, а его про-тивник ставит  крестик на своем поле также в эту клетку. Стрелявший  игрок полу-чает право на еще один выстрел.
2#.
2# Победителем считается тот, кто первым потопит все 10 кораблей противника. Проиг-равший имеет право изучить после окончания игры у соперника игровое поле.
2#.
2#~
 
:: Подсказка в начале игры
3#                               ПОДСКАЗКА К ИГРЕ
3#.
3# Для игры вам понадобится чистый тетрадный листок в клеточку.
3# Нарисуйте на листе два игровых поля размером 10x10 клеток каждое:
3#.
3#       A B C D E F G H I J       A B C D E F G H I J
3#     _|_|_|_|_|_|_|_|_|_|_|    _|_|_|_|_|_|_|_|_|_|_|
3#    0_|_|_|_|_|_|_|_|_|_|_|   0_|_|_|_|_|_|_|_|_|_|_|
3#    1_|_|_|_|_|_|_|_|_|_|_|   1_|_|_|_|_|_|_|_|_|_|_|
3#    2_|_|_|_|_|_|_|_|_|_|_|   2_|_|_|_|_|_|_|_|_|_|_|
3#    3_|_|_|_|_|_|_|_|_|_|_|   3_|_|_|_|_|_|_|_|_|_|_|
3#    4_|_|_|_|_|_|_|_|_|_|_|   4_|_|_|_|_|_|_|_|_|_|_|
3#    5_|_|_|_|_|_|_|_|_|_|_|   5_|_|_|_|_|_|_|_|_|_|_|
3#    6_|_|_|_|_|_|_|_|_|_|_|   6_|_|_|_|_|_|_|_|_|_|_|
3#    7_|_|_|_|_|_|_|_|_|_|_|   7_|_|_|_|_|_|_|_|_|_|_|
3#    8_|_|_|_|_|_|_|_|_|_|_|   8_|_|_|_|_|_|_|_|_|_|_|
3#    9_|_|_|_|_|_|_|_|_|_|_|   9_|_|_|_|_|_|_|_|_|_|_|
3#.
3# Пронумеруйте клетки, как показано на рисунке.
3#.
3# Расположите на левом поле свои корабли в соответствии с правилами игры.
3#.
3#~
 
:: Яхта
4#                       ...^v^
4#                                    $:... ^v^..
4#                           ... ^v^     $$
4#                                    $ $$
4#                                    $$$ :..... ^v^
4#                        ... ^v^       $$ .
4#                                  $$$ 
4#                                  $ $  :::..... ^v^
4#                                 $$ $  
4#                                $$$ $  
4#                               $$$$ $  
4#                              $$$$$ $  
4#                            $$$$$$$ $  
4#                           $$$$$$$$ $ 
4#                        $ $$$$$$$$$ $ 
4#                        $$ $        $$$     $$$$$   $$
4#                         $$$$$$$$$$$$$$$$$$$$$$$ $$$$.
4#                          $$$$$$$$$$$$$$$$$$$$$$$$$$
4#  ..-+*°*+-..  ~~~*°*~~~  ..-+*°*+-.. ..-+*°*+-..  ~~~*°*~~~  ..-+*°*+-.. ~~~*°
4# ~~~  ..-+*°*+-..~~~~  ..-+*°*+-.. ~~~  ..-+*°*+-..~~~~  ..-+*°*+-.. ..-+*°*+-..
4#  ..-+*~~°*+-..  ..-+*~~~~°*+-.. *+-...-+*° ..-+*~~°*+-..  ..-+*~~~~°*+-.. *+-..
4#  .~*°*~~~~  ..-+*~~~~°*+-.. *.-+*°*+-.. .~*°*~~~~  ..-+*~~~~°*+-.. *.-+*°*+-.. 
4#.
 
:: Фрегат
5#                                gg                            
5#                cggN            NgT            Fgg            
5#                iggc      Tggggggg              KN            
5#           gggggggg        Bgggggg        Fggggggh            
5#            Ngggggg       TNNhhhdg         KgggggN            
5#           gggggggg       gggggggggggggggTHhhhHhNh            
5#                 gg        Fggggggggggggg       Ah            
5#          Ngggggggggggggg Eggggggggggggg  Fggggggggggggg      
5#           dgggggggggggF ggggggggggggggR YggggggggggggH       
5#         AggggggggggggR TgggggggggggggN  ggggggggggggg        
5#         ggggggggggggg  HgggggggggggggB  ggggggggggggg        
5#         ggggggggggggg  NgggggggggggggH cggggggggggggg        
5#       dgggggggggggggg  RggggggggggggggTYggggggggggggg        
5#  gggggi gggggggggggggI  ggggggggggggggg ggggggggggggggR  hgg 
5#  YRgA   ggggggggggggggF ggggggggggggggKIggggggggggggggg  cdI 
5#    dgK    Hg  hgggNdgh    gN Kgggggggd    ggFgTgh      Fgg   
5#     gg   YgX ggRggRgXg  igK gg ggNigFgg  gc gATgN     KggK   
5#      Bgggg  gB EgggggggggAigE  ggggcgEEggihgTgggggggggggg    
5#       gggggdgHhhggKghgdRgNggHhHggghgNggKgBdhggggggggggggi    
5#        Aggggggggggggggggggggggggggggggggggggggggggggggg      
5#         ggggggggggggggggggggggggggggggggggggggggggggggB      
5#          TgggggT  Iggg  Hggh  ggg  Tggg   ggggggggggT        
5#           ggggggggggggggggggggggggggggggggggggggggggg        
5#             gggggggggggggggggggggggggggggggggggggggg         
5#             KHBHBBHHHHBHBHHBHHHgghBBBHBHBBBBBBBBBBBF
Вложения
Тип файла: zip SeaBattle.zip (6.8 Кб, 292 просмотров)
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
07.02.2014, 23:53  [ТС]
Сетевой Морской Бой на BAT

Автор: Delphiist

Совместимость: Windows XP

Тема: https://www.cyberforum.ru/post2124174.html
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
05.07.2014, 20:03  [ТС]
2048

Порт игры 2048 от Josiah Winslow.

код

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
@echo off&setlocal enabledelayedexpansion&title 2048&mode con: cols=32 lines=44&color F0
:startgame
if exist "2048JWinslow.dat" (for /f "delims=" %%g in (2048JWinslow.dat)do %%g) else set/ascore=0,winstate=0,bestscore=0&for /l %%g in (0,1,15)do set board[%%g]=0
set moves=0&set h=0&for /l %%g in (0,1,15)do if !board[%%g]!==0 set /a h+=1
if %h%==16 call :tilespawn&call :tilespawn
:startloop
if %score% gtr %bestscore% set bestscore=%score%
call :drawboard 0&call :savegame&choice /c wasdxn /n /m ""
if %errorlevel%==1 call :rotateclockwise&call :rotateclockwise&call :rotateclockwise&call :compress&call :merge&call :compress&call :compress&call :rotateclockwise
if %errorlevel%==2 call :compress&call :merge&call :compress&call :compress
if %errorlevel%==3 call :rotateclockwise&call :compress&call :merge&call :compress&call :compress&call :rotateclockwise&call :rotateclockwise&call :rotateclockwise
if %errorlevel%==4 call :rotateclockwise&call :rotateclockwise&call :compress&call :merge&call :compress&call :compress&call :rotateclockwise&call :rotateclockwise
if %errorlevel%==5 goto end
if %errorlevel%==6 (set score=0&set winstate=0&set moves=0&for /l %%g in (0,1,15)do set board[%%g]=0
call :tilespawn&call :tilespawn&goto startloop)
set/aboardchanged=0,tiles=0&for /l %%g in (0,1,15)do (if !board[%%g]! neq !tmpboard[%%g]! set boardchanged=1
if !board[%%g]! neq 0 set /a tiles+=1
if !board[%%g]!==2048 if %winstate%==0 set winstate=1)
if %boardchanged%==1 call :tilespawn&set/amoves+=1
if %winstate%==1 goto youwin
set/ayoulost=0,v=0
:1
set/av+=1
set/aw=%v%%%4,x=%v%/4,y=%v%-1,z=%v%-4
if %tiles%==15 (if %w% neq 0 if !board[%v%]!==!board[%y%]! set youlost=1
if %x% neq 0 if !board[%v%]!==!board[%z%]! set youlost=1)
if %tiles%==15 if %v% neq 15 goto 1
if %tiles%==15 if %youlost%==0 goto youlost
goto startloop
:tilespawn
set/arandtile=%random%%%16
if !board[%randtile%]! gtr 0 goto tilespawn
set/aboard[%randtile%]=%random%%%10/9*2+2&exit /b
:compress
set x=-1
:2
set/aw=0,x+=1,y=-1&for /l %%g in (0,1,3) do set tmparray[%%g]=0
:3
set/ay+=1&set/az=%x%*4+!y!
if !board[%z%]! neq 0 set/atmparray[%w%]=!board[%z%]!&set/aw+=1
if %y% neq 3 goto 3
for /l %%g in (0,1,3)do set/az=%x%*4+%%g&set/aboard[!z!]=!tmparray[%%g]!
if %x% neq 3 goto 2
exit /b
:merge
set x=-1
:4
set/ax+=1,y=-1
:5
set/ay+=1&set/aw=%x%*4+!y!&set/az=!w!+1
if !board[%w%]!==!board[%z%]! set/aboard[%w%]*=2,score+=!board[%w%]!&set board[%z%]=0
if %y% neq 2 goto 5
if %x% neq 3 goto 4
exit /b
:rotateclockwise
set i=12
for /l %%g in (0,1,15)do set/atmparray[%%g]=board[!i!],i-=4&if !i! lss 0 set/ai+=17
for /l %%g in (0,1,15)do set/aboard[%%g]=!tmparray[%%g]!
exit /b
:youwin
set winstate=2&call :drawboard 1&call :savegame&choice /c cnx /n /m ""
if %errorlevel%==1 goto startloop
if %errorlevel%==2 goto startgame
if %errorlevel%==3 exit /b
:youlost
call :drawboard 2&for /l %%g in (0,1,15)do set board[%%g]=0
set/ascore=0,winstate=0&call :savegame&choice /c nx /n /m ""
if %errorlevel%==1 goto startgame
if %errorlevel%==2 exit /b
:drawboard
for /l %%g in (0,1,15)do (set "board2[%%g]=      !board[%%g]!"&if !board[%%g]!==0 set "board2[%%g]=      "
if %moves% gtr 0 if %%g==%randtile% set board2[%%g]=   + !board[%%g]!
set board2[%%g]=!board2[%%g]:~-6!)
cls&echo  ___     ___    _  _      ___&echo ^|__ \   / _ \  ^| ^|^| ^|    / _ \&echo    ) ^| ^| ^| ^| ^| ^| ^|^| ^|_  ^| (_) ^|&echo   / /  ^| ^| ^| ^| ^|__   _^|  ^> _ ^<&echo  / /_  ^| ^|_^| ^|    ^| ^|   ^| (_) ^|&echo ^|____^|  \___/     ^|_^|    \___/&echo(&echo Join the numbers and get to the&echo            2048 tile^^!&echo(&if %1==0 echo     (Press N for new game)&echo(
if %1==1 echo             You Win!&echo Press C to continue, N to reset
if %1==2 echo            Game Over&echo     Press N to try again...
echo  Score: %score%&echo  Best: %bestscore%&echo  +------+------+------+------+&echo  ^|%board2[0]%^|%board2[1]%^|%board2[2]%^|%board2[3]%^|&echo  +------+------+------+------+&echo  ^|%board2[4]%^|%board2[5]%^|%board2[6]%^|%board2[7]%^|&echo  +------+------+------+------+&echo  ^|%board2[8]%^|%board2[9]%^|%board2[10]%^|%board2[11]%^|&echo  +------+------+------+------+&echo  ^|%board2[12]%^|%board2[13]%^|%board2[14]%^|%board2[15]%^|&echo  +------+------+------+------+&echo(&echo HOW TO PLAY: Use the WASD keys&echo to move the tiles. When two&echo tiles with the same number&echo touch, they merge into one^^!&echo -------------------------------&echo NOTE: This is only a port of&echo the original 2048, found at&echo [url]http://git.io/2048[/url] . Official&echo apps for iOS and Android are&echo also available. Other versions&echo are derivatives or fakes, and&echo should be used with caution.&echo -------------------------------&echo Port by Josiah Winslow. 2048&echo created by Gabriele Cirulli.&echo Based on 1024 by Veewo Studio&echo and conceptually similar to&echo Threes by Asher Vollmer.&exit /b
:savegame
echo(>2048JWinslow.dat&for %%g in (score bestscore winstate)do echo set %%g=!%%g!>>2048JWinslow.dat
for /l %%g in (0,1,15)do set tmpboard[%%g]=!board[%%g]!&echo set board[%%g]=!board[%%g]!>>2048JWinslow.dat
exit /b
:end
Миниатюры
Игры на CMD и другие сложные проекты*  
Вложения
Тип файла: zip 2048.zip (1.8 Кб, 277 просмотров)
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
02.04.2015, 20:54  [ТС]
Волшебный ключ
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
09.08.2015, 20:10  [ТС]
Лаунчер для игры MineCraft
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
01.10.2015, 19:59  [ТС]
Графика в командной строке
0
0 / 0 / 0
Регистрация: 15.10.2016
Сообщений: 1
20.03.2017, 20:25
Я почти доделал квест, но в if выскакивает сообщение "Непредвиденное появление: 1". Искал везде, но не нашел, почему такая ошибка. Квест сырой (я не доделал одну комнату), но посмотреть стоит.

Windows Batch file
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
@echo off
echo ‘¤Ґ«a©вҐ ¬aЄбЁ¬a«мго иЁаЁHг ®ЄHa, нв® ўa¦H®!
pause
echo on
rem [                               __  __                                                  __              __         ______  ]
rem [                              /  |/  |                                                /  |           _/  |       /      \ ]
rem [   ______    _______   _______ $$/ $$/         ______   __    __   ______    _______  _$$ |_         / $$ |      /$$$$$$  |]
rem [  /      \  /       | /       |/  |/  |       /      \ /  |  /  | /      \  /       |/ $$   |        $$$$ |      $$$  \$$ |]
rem [  $$$$$$  |/$$$$$$$/ /$$$$$$$/ $$ |$$ |      /$$$$$$  |$$ |  $$ |/$$$$$$  |/$$$$$$$/ $$$$$$/           $$ |      $$$$  $$ |]
rem [  /    $$ |$$      \ $$ |      $$ |$$ |      $$ |  $$ |$$ |  $$ |$$    $$ |$$      \   $$ | __         $$ |      $$ $$ $$ |]
rem [ /$$$$$$$ | $$$$$$  |$$ \_____ $$ |$$ |      $$ \__$$ |$$ \__$$ |$$$$$$$$/  $$$$$$  |  $$ |/  |       _$$ |_  __ $$ \$$$$ |]
rem [ $$    $$ |/     $$/ $$       |$$ |$$ |      $$    $$ |$$    $$/ $$       |/     $$/   $$  $$/       / $$   |/  |$$   $$$/ ]
rem [  $$$$$$$/ $$$$$$$/   $$$$$$$/ $$/ $$/        $$$$$$$ | $$$$$$/   $$$$$$$/ $$$$$$$/     $$$$/        $$$$$$/ $$/  $$$$$$/  ]
rem [                                                   $$ |                                                                    ]
rem [                                                   $$ |                                                                    ]
rem [                                                   $$/                                                                     ]
@echo off
pause
cls
:menu
echo You can see three doors.
echo Which one would you choose?
echo 1) The door with a sign
echo 2) The another door
echo 3) The door with an another sign
Set /p a="Choose where do you want to go:"
if %a% EQU 1 GoTo one
if %a% EQU 2 GoTo two
if %a% EQU 3 GoTo three
else GoTo menu
cls
:one
cls
echo You see a sign:
echo on
rem [  ______  _________ _______  _______  _______ _________ _______  _______ ]
rem [ (  __  \ \__   __/(  ____ )(  ____ \(  ____ \\__   __/(  ___  )(  ____ )]
rem [ | (  \  )   ) (   | (    )|| (    \/| (    \/   ) (   | (   ) || (    )|]
rem [ | |   ) |   | |   | (____)|| (__    | |         | |   | |   | || (____)|]
rem [ | |   | |   | |   |     __)|  __)   | |         | |   | |   | ||     __)]
rem [ | |   ) |   | |   | (\ (   | (      | |         | |   | |   | || (\ (   ]
rem [ | (__/  )___) (___| ) \ \__| (____/\| (____/\   | |   | (___) || ) \ \__]
rem [ (______/ \_______/|/   \__/(_______/(_______/   )_(   (_______)|/   \__/]
rem [                                                                         ]
@echo off
pause
cls
echo You can:
echo 1) Open the door
echo 2) Run back
Set /p %b%="What are you going to do:"
if %b% EQU 1 goto death1
if %b% EQU 2 goto menu
else goto one
:death1
echo *The director killed you*
pause
goto badend
:two
echo You don't see any sign, so you open the door.
pause
echo You see an Ipad in the room.
echo You can:
echo 1) Take the Ipad
echo 2) Run back
Set /p %c%="What are you going to do:"
if %c% EQU 1 (
GoTo ipad
)
if %c% EQU 2 (
GoTo menu
) else (
GoTo two
)
pause
:ipad
echo Well, in the screen is written:
echo on
rem [     __  __                                                     __                  ]
rem [    / / / /___ _      __   ____ ___  ____ _____  __  __   _____/ /_____ ___________ ]
rem [   / /_/ / __ \ | /| / /  / __ `__ \/ __ `/ __ \/ / / /  / ___/ __/ __ `/ ___/ ___/ ]
rem [  / __  / /_/ / |/ |/ /  / / / / / / /_/ / / / / /_/ /  (__  ) /_/ /_/ / /  (__  )  ]
rem [ /_/ /_/\____/|__/|__/  /_/ /_/ /_/\__,_/_/ /_/\__, /  /____/\__/\__,_/_/  /____/   ]
rem [                                              /____/                                ]
rem [                       _          __  __                 __        ___ ]
rem [   ____ _________     (_)___     / /_/ /_  ___     _____/ /____  _/__ \]
rem [  / __ `/ ___/ _ \   / / __ \   / __/ __ \/ _ \   / ___/ //_/ / / // _/]
rem [ / /_/ / /  /  __/  / / / / /  / /_/ / / /  __/  (__  ) ,< / /_/ //_/  ]
rem [ \__,_/_/   \___/  /_/_/ /_/   \__/_/ /_/\___/  /____/_/|_|\__, /(_)   ]
rem [                                                          /____/       ]
@echo off
pause
Set /p d="Answer the question (write the number):"
echo After that you see an another text:
echo on
rem [     __  __                                                     __                 ]
rem [    / / / /___ _      __   ____ ___  ____ _____  __  __   _____/ /_____ ___________]
rem [   / /_/ / __ \ | /| / /  / __ `__ \/ __ `/ __ \/ / / /  / ___/ __/ __ `/ ___/ ___/]
rem [  / __  / /_/ / |/ |/ /  / / / / / / /_/ / / / / /_/ /  (__  ) /_/ /_/ / /  (__  ) ]
rem [ /_/ /_/\____/|__/|__/  /_/ /_/ /_/\__,_/_/ /_/\__, /  /____/\__/\__,_/_/  /____/  ]
rem [                                              /____/                               ]
rem [                       _                      __                ___ ]
rem [   ____ _________     (_)___     ____ _____ _/ /___ __  ____  _/__ \]
rem [  / __ `/ ___/ _ \   / / __ \   / __ `/ __ `/ / __ `/ |/_/ / / // _/]
rem [ / /_/ / /  /  __/  / / / / /  / /_/ / /_/ / / /_/ />  </ /_/ //_/  ]
rem [ \__,_/_/   \___/  /_/_/ /_/   \__, /\__,_/_/\__,_/_/|_|\__, /(_)   ]
rem [                              /____/                   /____/       ]
@echo off
pause
Set /p e="Answer the question (write the number):"
Set /a sum=%d%+%e%
echo Then you see:
echo Write the sum of that numbers or something wil happen!
echo You can:
echo 1) Answer
echo 2) Run away
Set /p f="So, you choose:"
if %f% EQU 1 goto sum
if %f% EQU 2 goto death2
else goto menu
:sum
Set /p psum="Write the sum!!!"
if %psum% EQU %sum% ( echo It is "Paskhalotchka", as Russian people call it =) > %USERPROFILE%\Desktop\open_me_plz.txt
echo This file is from AsciiQuest 1.0! >> %USERPROFILE%\Desktop\open_me_plz.txt
goto end
) else ( goto death3
:death2
cls
echo When you were running away, you slipped and fell.
echo That's the end of the game.
pause
goto badend
:death3
cls
echo The sum isn't right. You failed.
echo I've hacked your IP and I know all about you!
color a
ipconfig
echo @echo off > %USERPROFILE%\Desktop\open_me_pleeease.bat
echo :go >> %USERPROFILE%\Desktop\open_me_pleeease.bat
echo echo I've hacked you >> %USERPROFILE%\Desktop\open_me_pleeease.bat
echo echo Click Ctrl+C if you're enough >> %USERPROFILE%\Desktop\open_me_pleeease.bat
echo goto go >> %USERPROFILE%\Desktop\open_me_pleeease.bat
echo This file is from AsciiQuest 1.0! >> %USERPROFILE%\Desktop\open_me_pleeease.bat
goto badend
:three
echo Я не знаю, что здесь будет
:badend
cls
echo You failed. You will replay.
pause
goto menu
:end
You won!!! Congratulations!!!
0
 Аватар для b0gus
741 / 339 / 134
Регистрация: 17.03.2014
Сообщений: 842
20.03.2017, 22:04
AndrewSavchuk, минусую
не люблю, когда на МОЙ рабочий стол всяку бяку пишут
0
4340 / 2130 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
21.03.2017, 01:54
?
Windows Batch file
1
2
3
4
5
6
7
if %psum% EQU %sum% (
 echo It is "Paskhalotchka", as Russian people call it = > "%USERPROFILE%\Desktop\open_me_plz.txt"
 echo This file is from AsciiQuest 1.0! >> "%USERPROFILE%\Desktop\open_me_plz.txt"
 goto end
) else (
 goto death3
)
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
21.03.2017, 09:53  [ТС]
Господа, эта тема не для обсуждения игр и тем более их проблем и доработок.
Впредь, пожалуйста, создавайте отдельную тему, а здесь оставляйте только ссылку на неё.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
14.08.2017, 15:07  [ТС]
Grinii, последнее сообщение написано специально для вас.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
02.01.2018, 20:57  [ТС]
Очередная змейка
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
10.07.2018, 21:04  [ТС]
Игра "Камень-ножницы-бумага"
1
5 / 5 / 0
Регистрация: 24.11.2014
Сообщений: 51
26.07.2022, 10:24
Какая-то чертовщина с файлом miner.rar и антивирусом MS Defender в Win 10. Сначала он ругался на архив miner.rar, называя его «Trojan:Script/Ulthar.A!ml», сообщая, что уровень опасности критический и описывая действия как «Эта опасная программа выполняет команды злоумышленника.». При этом, на VT он же, как и другие антивирусы, молчит. И ещё, он ругается именно на архив, а не на CMD-файл. Через какое-то время я опять проверил архив и оказалось, что антивирус забыл о заразе. Но, через несколько дней антивирус проснулся и опять начал определять заразу, но уже под именем «TrojanDownloader:Win32/Nemucod!ml» (уровень опасности так же критический и описание «Эта опасная программа загружает другие программы.»). На CMD-файл по прежнему не реагирует. В VT так же тишина. Может стоит перепаковать CMD-файл?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
26.07.2022, 14:32  [ТС]
Andrey_Vladi-ch, https://www.microsoft.com/en-u... submission
0
5 / 5 / 0
Регистрация: 24.11.2014
Сообщений: 51
26.07.2022, 15:18
Я знаю про это, вопрос в том, что с архивом?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
26.07.2022, 15:28  [ТС]
Попадает под сигнатурный детект. С обновлением баз, сигнатуры добавляются/убавляются/изменяются, поэтому у вас то детектит, то нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.07.2022, 15:28
Помогаю со студенческими работами здесь

Калькулятор или другие проекты на Goland
Есть ли у кого-нибудь на счету готовые проекты на языке Go? Не важно какие, главное чтобы можно было разобраться и запустить.

Как из одной формы открывать другие проекты?
Здравствуйте! Мне нужно создать программу, в которой будет форма, с помощью которой можно будет открыть созданные ранее sln-решения. ...

Как в codeblocks создавать сложные проекты? Как связывать файлы между собой?
Не могу найти никакого руководства. Как компилировать?

Сложные проекты на ASP.NET 2 (VS.NET 2005)
Вопрос по организации решений в VS.NET 2005. Есть сайт - проект ASP.NET 2, есть параллельный проект на C#, в котором, скажем, вынесены...

Размер Буфера и другие настройки CMD
Добрый день всем! Подскажите пожалуйста размер буфера для CMD и прочие настройки можно задавать в самом CMD файле?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru