Re: Кpестики-нолики (bat)
- From
- Aleksey D. Tetyorko ()
- To
- Andrew Ezhguroff
- Date
- 2002-11-08T11:57:21Z
- Area
- RU.ALGORITHMS
From: "Aleksey D. Tetyorko" <chib@megastyle.com>
Hi, All!
А играть со всеми этими реализациями вы пробовали!?
Ходят они всегда одинаково, и либо всегда проигрывают, либо сводят
к ничьей простейшим способом - например, первый ход в центр.
Кто с ними будет играть!? И какой в этом интерес...
Вот одна из простейших реализаций, взял в инете:
======================ttt.bat================================:: Tic Tac Toe
:: Bruce Howells 03/1998 from the Fidonet Batpower conference
:: some cosmetic tweaks by Michael Marquart
:: tested in MSdos V6.22 and Windows 98SE
@echo off
if (%1)==(!!!) goto start
if (%1)==() %comspec% /e:1024 /c %0 !!!
if (%1)==(!) set C%2=O
if (%1)==(!) set S%2=O
if (%1)==(!) set r=::
if (%1)==(!) goto Computer
goto quit
:: NOTE to clear environment, exit gracefully with Escape when permitted
:start
cls
:Again
set r=::
for %%x in (1 2 3 4 5 6 7 8 9) do set S%%x=%%x
echo [3;1H[0;1;33;41m
echo [4;27Нзддддддддддддддддддддддддддд№
echo [5;27НЁ [36mNOUGHTS AND CROSSES [33mЁ
echo [6;27НЁ Ё
echo [7;27НЁ Ё
echo [8;27НЁ [33m1 [37mЁ [33m2 [37mЁ [33m3 [33mЁ
echo [9;27НЁ [37mдддедддеддд [33mЁ
echo [10;27НЁ [33m4 [37mЁ [33m5 [37mЁ [33m6 [33mЁ
echo [11;27НЁ [37mдддедддеддд [33mЁ
echo [12;27НЁ [33m7 [37mЁ [33m8 [37mЁ [33m9 [33mЁ
echo [13;27НЁ Ё
echo [14;27НЁ Ё
echo [15;27Нюддддддддддддддддддддддддддды
echo [16;27Ниммммммммммммммммммммммммммм╩
echo [17;27H╨ [37mEsc quits [33m╨
echo [18;27Нхммммммммммммммммммммммммммм╪[37m
echo [17;29H[36mYou first?
CHOICE [17;39H /CYN /N
echo [17;40H ["a";"a"p
if errorlevel 3 goto Quit
if "%S1%"=="1" echo [8;37H[0;33;41m1
if "%S2%"=="2" echo [8;41H[0;33;41m2
if "%S3%"=="3" echo [8;45H[0;33;41m3
if "%S4%"=="4" echo [10;37H[0;33;41m4
if "%S5%"=="5" echo [10;41H[0;33;41m5
if "%S6%"=="6" echo [10;45H[0;33;41m6
if "%S7%"=="7" echo [12;37H[0;33;41m7
if "%S8%"=="8" echo [12;41H[0;33;41m8
if "%S9%"=="9" echo [12;45H[0;33;41m9
if errorlevel 2 set r=
if errorlevel 2 goto Computer
:Human
set m=XXX
:Computer
:: vars used by computer's move
for %%x in (b C H k) do set %%x=
if "%S1%"=="X" echo [8;37H[1;37;41mX
if "%S2%"=="X" echo [8;41H[1;37;41mX
if "%S3%"=="X" echo [8;45H[1;37;41mX
if "%S4%"=="X" echo [10;37H[1;37;41mX
if "%S5%"=="X" echo [10;41H[1;37;41mX
if "%S6%"=="X" echo [10;45H[1;37;41mX
if "%S7%"=="X" echo [12;37H[1;37;41mX
if "%S8%"=="X" echo [12;41H[1;37;41mX
if "%S9%"=="X" echo [12;45H[1;37;41mX
if "%S1%"=="O" echo [8;37H[1;37;41mO
if "%S2%"=="O" echo [8;41H[1;37;41mO
if "%S3%"=="O" echo [8;45H[1;37;41mO
if "%S4%"=="O" echo [10;37H[1;37;41mO
if "%S5%"=="O" echo [10;41H[1;37;41mO
if "%S6%"=="O" echo [10;45H[1;37;41mO
if "%S7%"=="O" echo [12;37H[1;37;41mO
if "%S8%"=="O" echo [12;41H[1;37;41mO
if "%S9%"=="O" echo [12;45H[1;37;41mO
echo [1;37;41m
if (%S1%%S2%%S3%)==(%m%) goto Win
if (%S4%%S5%%S6%)==(%m%) goto Win
if (%S7%%S8%%S9%)==(%m%) goto Win
if (%S1%%S4%%S7%)==(%m%) goto Win
if (%S2%%S5%%S8%)==(%m%) goto Win
if (%S3%%S6%%S9%)==(%m%) goto Win
if (%S1%%S5%%S9%)==(%m%) goto Win
if (%S3%%S5%%S7%)==(%m%) goto Win
set i=%i%+
if (%i%)==(++++++++++) goto Draw
if (%r%)==(::) set m=XXX
if not (%r%)==(::) set m=OOO
%r% echo [17;29HMy move...
%r% if (%S5%)==(5) %0 ! 5
%r% set k=
:: Subroutine
:sub
%r% if not (%k%)==() set b=%b%%k%
:: Test for 2 O's in line
%r% if (%k%)==(@) if not (%C%)==(%t%) goto %b%
:: Test for 2 (or nil) X's in line
%r% if (%k%)==(#) if not (%H%)==(%t%) goto %b%
%r% if not (%k%)==() for %%x in (%S%) do if not (%%x)==(X) if not (%%x)==(O)
%0 ! %%x
%r% if not (%k%)==() goto %b%
:: Test for lines with 2 O's
%r% set t=OO
%r% set k=@
%r% set C=%C1%%C3%%C2%
:ChkHmn
%r% set b=
%r% set H=%H1%%H3%%H2%
%r% set S=%S1% %S3% %S2%
%r% goto sub
:@
%r% set C=%C4%%C5%%C6%
:#
%r% set H=%H4%%H5%%H6%
%r% set S=%S4% %S5% %S6%
%r% goto sub
:@@
%r% set C=%C7%%C9%%C8%
:##
%r% set H=%H7%%H9%%H8%
%r% set S=%S7% %S9% %S8%
%r% goto sub
:@@@
%r% set C=%C1%%C9%%C5%
:###
%r% set H=%H1%%H9%%H5%
%r% set S=%S1% %S9% %S5%
%r% goto sub
:@@@@
%r% set C=%C3%%C5%%C7%
:####
%r% set H=%H3%%H5%%H7%
%r% set S=%S3% %S5% %S7%
%r% goto sub
:@@@@@
%r% set C=%C1%%C7%%C4%
:#####
%r% set H=%H1%%H7%%H4%
%r% set S=%S1% %S7% %S4%
%r% goto sub
:@@@@@@
%r% set C=%C2%%C5%%C8%
:######
%r% set H=%H2%%H5%%H8%
%r% set S=%S2% %S5% %S8%
%r% goto sub
:@@@@@@@
%r% set C=%C3%%C9%%C6%
:#######
%r% set H=%H3%%H9%%H6%
%r% set S=%S3% %S9% %S6%
%r% goto sub
:@@@@@@@@
:: Test for lines with 2 X's
%r% if (%t%)==(OO) set H=!!
%r% if (%H%)==(!!) set k=#
%r% if (%H%)==(!!) set t=XX
%r% if (%H%)==(!!) goto ChkHmn
:########
:: Test for lines with no X's
%r% if (%t%)==(XX) set H=!
%r% if (%H%)==(!) set t=
%r% if (%H%)==(!) goto ChkHmn
:: Check opposite corners
%r% if (%S1%)==(O) if (%S9%)==(9) %0 ! 9
%r% if (%S3%)==(O) if (%S7%)==(7) %0 ! 7
%r% if (%S7%)==(O) if (%S3%)==(3) %0 ! 3
%r% if (%S9%)==(O) if (%S1%)==(1) %0 ! 1
:: Check for ANY corner
%r% for %%x in (%S1% %S3% %S7% %S9%) do if not (%%x)==(X) if not (%%x)==(O)
%0 ! %%x
%r% for %%x in (%S8% %S6% %S4% %S2%) do if not (%%x)==(X) if not (%%x)==(O)
%0 ! %%x
set r=
echo [17;29HYOUR MOVE ["a";"a"p
set a=
:a
echo [14;34H %a%
CHOICE [17;39H /C123456789 /N
echo [17;40H ["a";"a"p
if not "%a%"=="" echo [0;1;33;41m[14;34H ["a";"a"p
for %%x in (1 2 3 4 5 6 7 8 9 10) do if errorlevel==%%x set e=%%x
if (%e%)==(10) goto Quit
set t=
for %%x in (%S1% %S2% %S3% %S4% %S5% %S6% %S7% %S8% %S9%) do if (%%x)==(%e%)
set t=Y
if (%t%)==() for %%x in (set goto) do %%x a=[5mINVALID MOVE
set S%e%=X
set H%e%=X
if not (%a%)==() echo [0;1;37;41m[14;35H
goto Human
:Draw
set m=
echo [17;29HDrawn game!
:Win
if (%m%)==(XXX) echo [17;29HOK, you won!
if (%m%)==(OOO) echo [17;29HI WIN AGAIN!
echo [0;1;5;37;41m[17;43HPLAY AGAIN?
CHOICE [17;54H /CYN /N
echo [17;55H ["a";"a"p
:Quit
for %%x in (1 2 3 4 5 6 7 8 9) do set C%%x=
for %%x in (1 2 3 4 5 6 7 8 9) do set H%%x=
for %%x in (1 2 3 4 5 6 7 8 9) do set S%%x=
for %%x in (a b C e H i k m r S t) do set %%x=
if errorlevel 1 if not errorlevel 2 goto Again
echo [0;1;33;41m[17;43H ╨[22;1H[0;37;40m
================================end of file ttt.bat=======================
Играет неплохо, для запуска нужен ansi. Но варианты повторяются.
Вы видели каку-нибудь программу, которая бы первым ходом ходила на сторону?
Я нет, хотя любой первый ход не проигрывающий.
Алексей
--- ifmail v.2.15dev5
* Origin: CHIB (2:5020/400)