summaryrefslogtreecommitdiff
path: root/SlitherlinkUnit.pas
diff options
context:
space:
mode:
Diffstat (limited to 'SlitherlinkUnit.pas')
-rw-r--r--SlitherlinkUnit.pas51
1 files changed, 42 insertions, 9 deletions
diff --git a/SlitherlinkUnit.pas b/SlitherlinkUnit.pas
index 6395e36..1be3682 100644
--- a/SlitherlinkUnit.pas
+++ b/SlitherlinkUnit.pas
@@ -1,6 +1,6 @@
unit SlitherlinkUnit;
-{ $DEFINE norandomize}
+{$DEFINE norandomize}
{$DEFINE preSchleifenTest}
{$DEFINE vorLoesen}
{$DEFINE SchleifenFrueherkennung}
@@ -69,7 +69,6 @@ type
procedure WohinMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure WohinMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
- procedure FelderErzeugen;
function ersteFreieKante: integer;
procedure LoesungInitialisieren;
{$IFDEF preSchleifenTest}
@@ -94,7 +93,7 @@ type
{$ENDIF}
procedure wSchleife(S: boolean);
function FesteKante(I: Integer): integer; // 0=nein; 1=fest weg; 2=fest da
- function FestesFeld(I: Integer): boolean;
+ function festesFeld(I: Integer): boolean;
procedure inDieserSituationTutMan(I: Integer);
public
Felder: array of Integer; // -1 = leer
@@ -116,7 +115,11 @@ type
constructor create(Parent: TWinControl);
destructor destroy; override;
procedure Loesen;
- procedure Leeren(PB: TProgressbar);
+ function LoesungsAnzahl: longint;
+ procedure FelderErzeugen;
+ procedure Leeren(PB: TProgressbar); overload;
+ procedure Leeren(PB: TProgressbar; Anzahl: longint); overload;
+ procedure Leeren(PB: TProgressbar; Anzahl: longint; nullenExtra: boolean); overload;
procedure Erzeugen(PB: TProgressbar); overload;
procedure Erzeugen(PB: TProgressbar; vorheriges_lassen: boolean); overload;
procedure Zeichnen(hacked: boolean); overload;
@@ -601,6 +604,19 @@ begin
// (ersteFreieKante+1) mod 2 + 2,
end;
+function TFeld.LoesungsAnzahl: longint;
+begin
+ kantenPermErzeugen;
+ {$IFDEF preSchleifenTest}
+ ZusammenhangInitialisieren;
+ {$ENDIF}
+ LoesungInitialisieren;
+ if ersteFreieKante=-1 then
+ result:=byte(felderOkay)
+ else
+ result:=rekursivLoesen(ersteFreieKante div 2,false,true,false);
+end;
+
function TFeld.rekursivLoesen(Knoten: integer; LoesungBehalten,EndeBeiEins,warKante: boolean): integer;
var I,J,K,L,Ma,Mi: integer;
{$IFDEF preSchleifenTest}
@@ -901,6 +917,16 @@ begin
end;
procedure TFeld.Leeren(PB: TProgressbar);
+begin
+ Leeren(PB,-1);
+end;
+
+procedure TFeld.Leeren(PB: TProgressbar; Anzahl: longint);
+begin
+ Leeren(PB,Anzahl,true);
+end;
+
+procedure TFeld.Leeren(PB: TProgressbar; Anzahl: longint; nullenExtra: boolean);
var I,J: Integer;
save: Integer;
geht: boolean;
@@ -938,6 +964,7 @@ begin
begin
if Assigned(PB) then PB.StepIt;
if (Kanten[_KantenPerm[I]]<>-2) and
+ (Kanten[_KantenPerm[I]]<>-1) and
(Schleife or (festeKante(_KantenPerm[I])<0)) then
begin
save:=Kanten[_KantenPerm[I]];
@@ -992,11 +1019,14 @@ begin
PB.Position:=0;
PB.Max:=length(_FelderPerm);
end;
- For J:=0 to 1 do
+ For J:=0 to byte(nullenExtra) do
For I:=0 to length(_FelderPerm)-1 do
- if (Felder[_FelderPerm[I]]=0) xor (J=1) then
+ if (not nullenExtra) or
+ ((Felder[_FelderPerm[I]]=0) xor (J=1)) then
begin
if Assigned(PB) then PB.StepIt;
+ if Felder[_FelderPerm[I]]=-1 then
+ continue;
save:=Felder[_FelderPerm[I]];
Felder[_FelderPerm[I]]:=-1;
LoesungInitialisieren;
@@ -1036,7 +1066,11 @@ begin
tvorloesen:=tvorloesen+now-tstart;
{$ENDIF}
{$ENDIF}
- if not geht then
+ if geht then begin
+ dec(Anzahl);
+ if Anzahl=0 then exit;
+ end
+ else
Felder[_FelderPerm[I]]:=save;
end;
if Assigned(PB) then PB.Visible:=false;
@@ -1378,7 +1412,7 @@ begin
end;
end;
-function TFeld.FestesFeld(I: Integer): boolean;
+function TFeld.festesFeld(I: Integer): boolean;
begin
result:=
not (Schleife or
@@ -1489,7 +1523,6 @@ end;
procedure TFeld.inDieserSituationTutMan(I: Integer);
var F: File;
- C: Cardinal;
B: Byte;
J: Integer;
begin