Binary Hell's main site

 Главная страница 
 Новости 
 Статьи 
 Продукты 
 Документация 
 Наши проекты 
 О группе 
 
 Пишите нам 
 Опыт ФИДО конференций 
 Доки по ASM-у 
 Учебники 
 Форматы файлов 
 

- RU.ALGORITHMS (2:5030/1334.67) ------------------------------ RU.ALGORITHMS -
 Msg  : 1 из 906
 From : Sergey Buts                         2:4614/9.59     Пон 06 Hоя 00 22:58
 To   : All                                                 Пон 13 Hоя 00 01:32
 Subj : Крестики-нолики
-------------------------------------------------------------------------------
По многочисленным просьбам кидаю исходник прямо в эху.
Кое-какие напутствия:
Управление - на цифровой клавиатуре. Поскольку компьютер всегда выигрывает, то
первым предоставляется ход человеку. В этом случае можно сыграть в ничью. Желаю
удачи :-)


--- Тут начинается файл x0lik.pas ---
{А разработал данную прогу А.Отенко}
uses Crt;
const
   xSize:byte = 39;
   ySize:byte = 20;
   Length1:byte = 5;

var
  i,j,maxx,maxy,curx,cury,quit:byte;
  aS:char;
  fild:array[ 1..40, 1..20] of word;
  fildS:array[ 1..40, 1..20 ] of char;

function fac( x:word ):word;
begin
  if x=0 then fac:=1 else fac:=fac( x-1 )*4 +1
end;

procedure color( tex,back:word );
begin
  TextColor( tex );
  TextBackground( back )
end;

procedure setcurs;
begin
  gotoxy( curx*2, cury )
end;

procedure findempty;
var
   x1,y1:byte;
begin

 maxx:=0;
 for x1:=1 to xSize do
  for y1:=1 to ySize do
  begin
   fild[ x1, y1 ]:=0;
   if fildS[ x1, y1 ]='.' then
   begin
     maxx:=x1;
     maxy:=y1
   end
  end;
 if maxx=0 then quit:=2
end;

procedure buildline( kx,ky:shortint );
var
   kolx,kol0,kolempty,x1,y1,k:byte;
begin
   kolempty:=0;
   kolx:=0;
   kol0:=0;
   for k:=0 to Length1-1 do
   begin
    x1:=i+k*kx;
    y1:=j+k*ky;
    if ( x1>0 ) and ( y1>0 ) and ( x1<=xSize ) and ( y1<=ySize ) then
aS:=fildS[ x1, y1 ]
    else aS:=' ';
    if aS='.' then Inc( kolempty );
    if aS='x' then Inc( kolx );
    if aS='o' then Inc( kol0 )
   end;

   if ( ( kolx=0 ) or ( kol0=0 ) ) and ( kolx+kol0+kolempty=Length1 ) then
   begin
    for k:=0 to Length1-1 do
    begin
      x1:=i+k*kx;
      y1:=j+k*ky;

      fild[ x1, y1 ]:=fild[ x1, y1 ]+fac( kolx+kol0 );
      if ( fild[ x1, y1 ]>fild[ maxx, maxy ] ) and ( fildS[ x1, y1 ]='.' ) then
      begin
        maxx:=x1;
        maxy:=y1
      end;
    end;
    if ( kolx=Length1 ) and ( quit <> 2 ) then quit:=1;
    if ( kol0=Length1 ) then quit:=2;

    if ( kolx+kolempty<Length1 ) and ( kol0+kolempty<Length1 ) and ( quit=0 )
then quit:=3;
    if ( ( kolx+kolempty=Length1 ) or ( kol0+kolempty=Length1 ) ) and ( quit<>1
) and ( quit<>2 ) then quit:=4
  end
end;

procedure ithink;
var
   bS:char;
begin
 repeat
  setcurs;
  color( 0, 7 );
  bS:=fildS[ curx, cury ];
  write( bS );

  aS:=readkey;

  setcurs;
  bS:=fildS[ curx, cury ];
  color( 14, 1 );
  if bS='x' then color( 13, 1 ) else if bS='o' then color( 10, 1 );
  write( bS );

  if aS='s' then
  begin
    quit:=1;
    exit
  end;

  if ( aS='4' ) or ( aS='7' ) or ( aS='1' ) then Dec( curx );
  if ( aS='6' ) or ( aS='9' ) or ( aS='3' ) then Inc( curx );
  if ( aS='8' ) or ( aS='7' ) or ( aS='9' ) then Dec( cury );
  if ( aS='2' ) or ( aS='1' ) or ( aS='3' ) then Inc( cury );

  if cury<1 then cury:=ySize;
  if curx<1 then curx:=xSize;
  if curx>xSize then curx:=1;
  if cury>ySize then cury:=1

 until ( aS=' ' ) and ( fildS[ curx, cury ]='.' );

  fildS[ curx, cury ]:='o';
  gotoxy( curx * 2, cury );
  color( 0, 7 );
  write( 'o' )
end;

{procedure printit;
begin
  for j:=1 to ySize do
  begin
    gotoxy( 40,j );
    for i:=1 to xSize do write( fild[ i, j ],' ' );
    writeln
  end

end;  }

procedure think;
begin
 findempty;
 if quit=0 then
 begin
  for j:=1 to ySize do
   for i:=1 to xSize do
   begin
     buildline( 1, 0 );
     buildline( 1, 1 );
     buildline( 0, 1 );
     buildline( -1, 1 )
   end;
  if quit=4 then quit:=0
 end
{ printit;
  write( #7 )}
end;

procedure msg( ss:string );
const
   ss1:string[12]='           ';
var
   x,y:byte;
begin
   color( 15, 2 );
   y:=abs( ySize div 2 -4 )+1;
   x:=abs( xSize div 2 -6 )+1;
   gotoxy( x, y );
   write( ss1 );
   Inc( y );
   gotoxy( x, y );
   write( ' GAME OVER ' );
   Inc( y );
   gotoxy( x, y );
   write( ss1 );
   Inc( y );
   gotoxy( x, y );
   write( ss );
   Inc( y );
   gotoxy( x, y );
   write( ss1 )
end;

BEGIN
 repeat
  curx:=1;
  cury:=1;
  quit:=0;
  clrscr;

  writeln( 'Will you change Current Setup (', xSize, 'x', ySize, 'x', Length1,
') y/n? ' );
  aS:=readkey;

  if aS='y' then
  begin
    write( 'X Size of field: '); readln( xSize );
    write( 'Y Size of field: '); readln( ySize );
    write( 'Length of line to complete: '); readln( Length1 )
  end;

  writeln( 'Do you want me to start? y/n '); aS:=readkey;

  color( 14, 1 );
  clrscr;
  for i:=1 to xSize do
    for j:=1 to ySize do
    begin
     fildS[ i, j ]:='.';
     gotoxy( i*2, j );
     write( '.' )
    end;

  writeln;
  write ( 'Press "s" to stop' );

  if aS<>'y' then ithink;

  while quit=0 do
  begin

    think;
    if quit = 0 then
    begin
      fildS[ maxx, maxy ]:='x'; { Set my figure }
      gotoxy( 1, 22 );
      write( 'Ok ?' );
      gotoxy( maxx * 2, maxy );
      color( 13+15, 1 );
      write( 'X' );

      aS:=readkey;

      color( 13, 1 );
      gotoxy( maxx*2, maxy );
      write( 'x' );
      gotoxy( 1, 22 );
      write( '    ' );

      findempty;
      if quit=0 then ithink;
    end;

    if quit=1 then msg( ' Happy End ' );
    if ( quit=2 ) or ( quit=3 ) then msg( '  You won  ' )

  end;

  gotoxy( 1, 21 );
  writeln( 'One more! y/n? ' );
  aS:=readkey;
 until aS<>'y'
end.


--- А здесь x0lik.pas кончается ---


                Best regards, Sergey Buts.


 * Origin: mailto:siriy@kaskad.sumy.ua | HomePage: http://siriy.n (2:4614/9.59)

  

Rambler's Top100 Rambler's Top100 NET's Top100