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 
echo [4;27Нзддддддддддддддддддддддддддд№
echo [5;27НЁ    NOUGHTS AND CROSSES    Ё
echo [6;27НЁ                           Ё
echo [7;27НЁ                           Ё
echo [8;27НЁ         1 Ё 2 Ё 3         Ё
echo [9;27НЁ        дддедддеддд        Ё
echo [10;27НЁ         4 Ё 5 Ё 6         Ё
echo [11;27НЁ        дддедддеддд        Ё
echo [12;27НЁ         7 Ё 8 Ё 9         Ё
echo [13;27НЁ                           Ё
echo [14;27НЁ                           Ё
echo [15;27Нюддддддддддддддддддддддддддды
echo [16;27Ниммммммммммммммммммммммммммм╩
echo ╨                 Esc quits ╨
echo [18;27Нхммммммммммммммммммммммммммм╪
echo You first?
CHOICE  /CYN /N
echo  ["a";"a"p
if errorlevel 3 goto Quit
if "%S1%"=="1" echo 1
if "%S2%"=="2" echo 2
if "%S3%"=="3" echo 3
if "%S4%"=="4" echo 4
if "%S5%"=="5" echo 5
if "%S6%"=="6" echo 6
if "%S7%"=="7" echo 7
if "%S8%"=="8" echo 8
if "%S9%"=="9" echo 9
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 X
if "%S2%"=="X" echo X
if "%S3%"=="X" echo X
if "%S4%"=="X" echo X
if "%S5%"=="X" echo X
if "%S6%"=="X" echo X
if "%S7%"=="X" echo X
if "%S8%"=="X" echo X
if "%S9%"=="X" echo X
if "%S1%"=="O" echo O
if "%S2%"=="O" echo O
if "%S3%"=="O" echo O
if "%S4%"=="O" echo O
if "%S5%"=="O" echo O
if "%S6%"=="O" echo O
if "%S7%"=="O" echo O
if "%S8%"=="O" echo O
if "%S9%"=="O" echo O
echo 
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 My 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 YOUR MOVE ["a";"a"p
set a=
:a
echo  %a%
CHOICE  /C123456789 /N
echo  ["a";"a"p
if not "%a%"=="" echo              ["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=INVALID MOVE
set S%e%=X
set H%e%=X
if not (%a%)==() echo 
goto Human
:Draw
set m=
echo Drawn game!
:Win
if (%m%)==(XXX) echo OK, you won!
if (%m%)==(OOO) echo I WIN AGAIN!
echo PLAY AGAIN?
CHOICE  /CYN /N
echo  ["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             ╨
================================end of file ttt.bat=======================

Играет неплохо, для запуска нужен ansi. Но варианты повторяются.
Вы видели каку-нибудь программу, которая бы первым ходом ходила на сторону?
Я нет, хотя любой первый ход не проигрывающий.
Алексей



--- ifmail v.2.15dev5
 * Origin: CHIB (2:5020/400)