{Jeu du Baguenaudier}
{On dispose d'une reglette contenant N cases numerotees}
{de 1 a N sur lesquelles sont deposes N pions, un par case.}
{On desire enlever les N pions en respectant les regles }
{suivantes : }
{Il n'y a jamais qu'un pion au plus par case;}
{On peut a tout instant poser (s'il n'y en a pas) ou enlever}
{(s'il y en a un) un pion sur la case 1}
{On peut poser ou enlever un pion sur la case numˇrotee}
{j (avec 1< j <=N ) s'il y a un pion sur la case j-1 et aucun}
{sur les cases precedentes.}

program baguenaudier;

	uses
		Wait;

	const
		N = 6; 				{nombre de cases}
		M = 35;			{rayon des jetons}

	type
		reglette = array[1..N] of boolean;

	var
		t: reglette;
		i: integer;
		r: rect;

	procedure DessinPion (i: integer);
		var
			x, y, temp: integer;
	begin
		x := 50 + 80 * (i - 1);
		y := 50;
		SetRect(r, x - M, y - M, x + M, y + M);
		PaintOval(r);
		wait(60);
	end;

	procedure Remplir (n: integer; var t: reglette);
	forward;

	procedure Vider (n: integer; var t: reglette);

	begin
		if n = 0 then
		else if n = 1 then
{t[n] := false}
			DessinPion(n)
		else
			begin
				Vider(n - 2, t);
{t[n] := false;}
				DessinPion(n);
				Remplir(n - 2, t);
				Vider(n - 1, t);
			end;
	end;


	procedure Remplir (n: integer; var t: reglette);

	begin
		if n = 0 then
		else if n = 1 then
{t[n] := true}
			DessinPion(n)
		else
			begin
				Remplir(n - 1, t);
				Vider(n - 2, t);
{t[n] := true;}
				DessinPion(n);
				Remplir(n - 2, t);
			end;
	end;

begin
	ShowDrawing;
	for i := 1 to N do
		begin
			SetRect(r, 10 + 80 * (i - 1), 10, 10 + 80 * i, 90);
			Framerect(r);
		end;
	PenMode(PatXor);
	for i := 1 to N do
{t[i] := true;}
		DessinPion(i);
	Vider(N, t);
end.