home *** CD-ROM | disk | FTP | other *** search
- program hanoi;
-
- var
- n, a, b, c, ah, bh, ch, x, timer: integer;
- response: char;
- manual: boolean;
- xtimer: real;
-
- procedure erase(i,x:integer; var xh:integer);
- var j,k,l: integer;
- begin
- l := 170-5*xh;
- k := 100*x-40;
- for j := l to l+3 do begin
- Draw(k-2*i-2,j,k+2*i+3,j,0);
- Plot(k,j,1);
- end;
- xh := xh - 1;
- end;
-
- procedure create(i,x:integer; var xh:integer; manual:boolean; timer:integer);
- var j,k,l: integer;
- begin
- xh := xh + 1;
- l := 170-5*xh;
- k := 100*x-40;
- for j := l to l+3 do Draw(k-2*i-2,j,k+2*i+3,j,2);
- if manual then read(response) else Delay(timer);
- if KeyPressed then read(response);
- end;
-
- procedure han(n,a,b,c:integer;var ah,bh,ch:integer; manual:boolean; timer:integer);
- begin
- if n>1 then han(n-1,a,c,b,ah,ch,bh,manual,timer);
- erase(n,a,ah); create(n,b,bh,manual,timer);
- if n>1 then han(n-1,c,b,a,ch,bh,ah,manual,timer);
- end;
-
- begin
- write('This program requires color adapter. Do you have one? ');
- readln(response); if (response='n') or (response='N') then Halt;
- repeat
- write ('Number of disks (1-20): ');
- readln (n);
- until (n>0) and (n<21);
- repeat
- write ('Delay time in seconds (0-10 or -1 for manual) ');
- readln (xtimer);
- if xtimer<0 then begin
- xtimer := 0;
- manual := true;
- end else manual := false;
- until (xtimer>=0) and (xtimer<=10);
- timer := trunc(xtimer * 1000);
- GraphColorMode;
- Palette(0);
- GraphBackground(9);
- for x := 170 to 180 do Draw(14,x,306,x,3);
- Draw(60,65,60,170,1);
- Draw(160,65,160,170,1);
- Draw(260,65,260,170,1);
- ah := 0; bh := 0; ch := 0;
- for x := n downto 1 do create(x,1,ah,false,0);
- han(n,1,3,2,ah,ch,bh,manual,timer);
- if not manual then readln(response);
- TextMode;
- end.