summaryrefslogtreecommitdiff
path: root/raetselunit.pas
diff options
context:
space:
mode:
Diffstat (limited to 'raetselunit.pas')
-rw-r--r--raetselunit.pas271
1 files changed, 119 insertions, 152 deletions
diff --git a/raetselunit.pas b/raetselunit.pas
index dc6741c..5f1033b 100644
--- a/raetselunit.pas
+++ b/raetselunit.pas
@@ -6,36 +6,22 @@ interface
uses
Classes, SysUtils, Forms, Spin, Controls, StdCtrls, ExtCtrls, LCLType,
- lowlevelunit;
+ lowlevelunit, Messages, ComCtrls;
type
tAlphabetFunktion = function(i: longint): string;
- tFelderRaetsel = class;
-
- tFelderLoesMeta = class
+ tButtonWithArrowKeys = class(tButton)
private
- _inh: boolean;
- _perm: tLongintArray;
- _mgl: tInt64Array;
- _posi: longint;
- _fr: tFelderRaetsel;
- public
- constructor create(ib: boolean; fr: tFelderRaetsel);
- destructor destroy;
- function posi: longint;
- function fwd: boolean;
- procedure rev;
- property inhaltBehalten: boolean read _inh;
- procedure aktualisiereInhalt(p,alt: longint);
- procedure aktualisiereRand(p,alt: longint);
+ procedure WMGetDlgCode(var Msg: TWMGetDlgCode); message WM_GETDLGCODE;
end;
tRaetsel = class
private
besitzer: tForm;
zeichenflaeche: tImage;
- erzeugeBtn: tButton;
+ erzeugeBtn: tButtonWithArrowKeys;
+ progressbar1: tProgressBar;
function besitzerHoehe: longint; dynamic;
function besitzerBreite: longint; dynamic;
procedure zeichenFlaecheNeuKreieren;
@@ -43,19 +29,19 @@ type
procedure onMouseDown(sender: tObject; button: tMouseButton; shiftState: tShiftState; x,y: longint); dynamic; abstract;
procedure erzeugeOnClick(sender: tObject);
procedure loeschen; dynamic; abstract;
- function loesen(inhaltBehalten: boolean): longint; dynamic; abstract;
procedure leeren; dynamic; abstract;
public
constructor create(aOwner: tForm);
destructor destroy; override;
- function gleichzeitigMoeglich(num: longint): longint; dynamic; abstract;
- function _loesen(lm: tFelderLoesMeta): longint; dynamic; abstract;
+ function loesen(inhaltBehalten: boolean; lPos: longint): longint; dynamic; abstract;
+ function passt(spalte,zeile: integer): boolean; dynamic; abstract;
+ function geloest: boolean; dynamic; abstract;
procedure zeichnen; dynamic; abstract;
end;
tFelderRaetsel = class(tRaetsel)
spinEdits: array of tSpinEdit;
- diagonalenCB: tCheckBox;
+ diagonalenCB,sudokuCB: tCheckBox;
groeszen,inhalt,rand: array of longint;
moeglich: array of int64;
dim,schriftGroesze,cursorPosition: longint;
@@ -66,7 +52,6 @@ type
procedure onMouseDown(sender: tObject; button: tMouseButton; shiftState: tShiftState; x,y: longint); override;
procedure aktualisiereGroesze;
procedure loeschen; override;
- function loesen(inhaltBehalten: boolean): longint; override;
procedure leeren; override;
procedure aktualisiereZeichenflaechenGroesze;
function besitzerHoehe: longint; override;
@@ -80,114 +65,43 @@ type
procedure zeichnen; override;
end;
-const
- spacing = 2;
-
-implementation
-
-uses
- math;
-
-// tFelderLoesMeta *************************************************************
-
-constructor tFelderLoesMeta.create(ib: boolean; fr: tFelderRaetsel);
-var
- i: longint;
-begin
- inherited create;
- _fr:=fr;
- _inh:=ib;
- _perm:=permutation(length(fr.inhalt));
- setlength(_perm,length(_perm)+1);
- for i:=length(_perm)-1 downto 1 do
- _perm[i]:=_perm[i-1];
- _perm[0]:=-1;
- setlength(_mgl,length(fr.inhalt));
- _posi:=0;
-end;
+{$DEFINE interface}
-destructor tFelderLoesMeta.destroy;
-begin
- setlength(_perm,0);
- setlength(_mgl,0);
- inherited destroy;
-end;
+{$DEFINE hochhaus}
+{$I raetselunit.inc}
+{$UNDEF hochhaus}
-function tFelderLoesMeta.posi: longint;
-begin
- result:=_perm[_posi];
-end;
+{$DEFINE buchstaben}
+{$I raetselunit.inc}
+{$UNDEF buchstaben}
-function tFelderLoesMeta.fwd: boolean;
-begin
- result:=_posi<length(_perm);
- if result then
- inc(_posi);
-end;
+{$UNDEF interface}
-procedure tFelderLoesMeta.rev;
-begin
- dec(_posi);
-end;
+const
+ spacing = 2;
-procedure tFelderLoesMeta.aktualisiereInhalt(p,alt: longint);
-var
- i,j,x,y,cnt,neu: longint;
- maske: int64;
-begin
- // hier sollte die Zeile und Spalte von _mgl[p] aktualisiert werden
- x:=p mod _fr.dim;
- y:=p div _fr.dim;
- neu:=_fr.inhalt[p];
- if neu<>-1 then begin
- if alt<>-1 then begin
- _fr.inhalt[p]:=-1;
- aktualisiereInhalt(p,alt);
- _fr.inhalt[p]:=neu;
- alt:=-1;
- end;
- cnt:=_fr.gleichzeitigMoeglich(p);
- maske:=1 shr _fr.inhalt[p];
- _mgl[p]:=maske;
- if cnt>1 then begin
- j:=0;
- for i:=0 to _fr.dim-1 do
- j:=j+byte(_fr.inhalt[y*_fr.dim+i]=neu);
- if j>=cnt then
- for i:=0 to _fr.dim-2 do
- _mgl[i*_fr.dim+i+byte(i>=x)]:=_mgl[i*_fr.dim+i+byte(i>=x)] and not maske;
- j:=0;
- for i:=0 to _fr.dim-1 do
- j:=j+byte(_fr.inhalt[i*_fr.dim+x]=neu);
- if j>=cnt then
- for i:=0 to _fr.dim-2 do
- _mgl[(i+byte(i>=y))*_fr.dim+x]:=_mgl[(i+byte(i>=y))*_fr.dim+x] and not maske;
- // TODO: Diagonalen
- end
- else begin
- for i:=0 to _fr.dim-2 do begin
- _mgl[y*_fr.dim+i+byte(i>=x)]:=_mgl[y*_fr.dim+i+byte(i>=x)] and not maske;
- _mgl[(i+byte(i>=y))*_fr.dim+x]:=_mgl[(i+byte(i>=y))*_fr.dim+x] and not maske;
- end;
- // TODO: Diagonalen
- end;
- end
- else begin
- if alt=-1 then
- exit;
- maske:=1 shr alt;
- for i:=0 to _fr.dim-2 do begin
- _mgl[(i+byte(i>=y))*_fr.dim+x]:=_mgl[(i+byte(i>=y))*_fr.dim+x] or maske;
- _mgl[y*_fr.dim+x+byte(i>=x)]:=_mgl[y*_fr.dim+x+byte(i>=x)] or maske;
- end;
- // TODO: Diagonalen
- // TODO: _mgl[p]
- end;
-end;
+implementation
-procedure tFelderLoesMeta.aktualisiereRand(p,alt: longint);
+uses
+ math, dialogs;
+
+{$DEFINE alphabetFunktion}
+function zahlenAlphabetFunktion(i: longint): string;
+{$DEFINE hochhaus}
+{$I raetselunit.inc}
+{$UNDEF hochhaus}
+function buchstabenAlphabetFunktion(i: longint): string;
+{$DEFINE buchstaben}
+{$I raetselunit.inc}
+{$UNDEF buchstaben}
+{$UNDEF alphabetFunktion}
+
+// tButtonWithArrowkeys ********************************************************
+
+procedure tButtonWithArrowkeys.WMGetDlgCode(var msg: tWMGetDLGCODE);// message WM_GETDLGCODE;
begin
- // hier sollte die Zeile bzw. Spalte von _rand[p] aktualisiert werden
+ inherited;
+ msg.Result := msg.Result or DLGC_WANTARROWS;
end;
// tRaetsel ********************************************************************
@@ -199,7 +113,7 @@ begin
zeichenflaeche:=tImage.create(besitzer);
zeichenflaeche.parent:=besitzer;
zeichenflaeche.onMouseDown:=@onMouseDown;
- erzeugeBtn:=tButton.create(besitzer);
+ erzeugeBtn:=tButtonWithArrowKeys.create(besitzer);
erzeugeBtn.parent:=besitzer;
erzeugeBtn.left:=spacing;;
erzeugeBtn.top:=spacing;;
@@ -243,7 +157,7 @@ end;
procedure tRaetsel.erzeugeOnClick(sender: tObject);
begin
loeschen;
- loesen(true);
+ loesen(true,-1);
leeren;
end;
@@ -285,6 +199,11 @@ begin
diagonalenCB.caption:='Diagonalen';
diagonalenCB.top:=erzeugeBtn.top+erzeugeBtn.height+spacing;
diagonalenCB.left:=spinEdits[length(spinEdits)-1].left+spinEdits[length(spinEdits)-1].width+spacing;
+ sudokuCB:=tCheckBox.create(besitzer);
+ sudokuCB.parent:=besitzer;
+ sudokuCB.caption:='Sudoku';
+ sudokuCB.top:=erzeugeBtn.top+erzeugeBtn.height+spacing;
+ sudokuCB.left:=diagonalenCB.left+diagonalenCB.width+spacing;
zeichenflaeche.left:=spacing;
zeichenflaeche.top:=diagonalenCB.top+diagonalenCB.height+spacing;
aktualisiereGroesze;
@@ -375,34 +294,19 @@ begin
rand[i]:=-1;
end;
-function tFelderRaetsel.loesen(inhaltBehalten: boolean): longint;
-var
- lm: tFelderLoesMeta;
-begin
- lm:=tFelderLoesMeta.create(inhaltBehalten,self);
- result:=_loesen(lm);
- lm.free;
-end;
-
procedure tFelderRaetsel.leeren;
var
p: tLongintArray;
i,w: longint;
-var
- lm: tFelderLoesMeta;
begin
- lm:=tFelderLoesMeta.create(false,self);
-
p:=permutation(dim*dim);
for i:=0 to length(p)-1 do begin
- if inhalt[p[i]]<0 then continue;
+ if inhalt[p[i]]<0 then
+ continue;
w:=inhalt[p[i]];
inhalt[p[i]]:=-1;
- lm.aktualisiereInhalt(p[i],w);
- if _loesen(lm)<>1 then begin
+ if loesen(false,-1)<>1 then
inhalt[p[i]]:=w;
- lm.aktualisiereInhalt(p[i],-1);
- end;
end;
p:=permutation((dim+1)*4);
@@ -410,13 +314,9 @@ begin
if rand[p[i]]<0 then continue;
w:=rand[p[i]];
rand[p[i]]:=-1;
- lm.aktualisiereRand(p[i],w);
- if _loesen(lm)<>1 then begin
+ if loesen(false,-1)<>1 then
rand[p[i]]:=w;
- lm.aktualisiereRand(p[i],-1);
- end;
end;
- lm.free;
end;
procedure tFelderRaetsel.aktualisiereZeichenflaechenGroesze;
@@ -456,11 +356,22 @@ end;
procedure tFelderRaetsel.schreibeZentriert(x,y,i: longint);
var
- br,ho: longint;
- s: string;
+ br,ho: longint;
+ s: string;
begin
s:=uebersetze(i);
with zeichenflaeche.canvas do begin
+ brush.color:=$FFFFFF - $181818*byte(diagonalenCB.checked and ((x=y) or (x+y=dim+1)));
+ if not passt(x,y) then
+ font.color:=$0000FF
+ else if geloest then
+ font.color:=$007F00
+// else if startFeld[x+y*dim] then
+// font.color:=$7F7F7F
+ else
+ font.color:=$000000;
+ // feldFarben[x+y*dim];
+
br:=textWidth(s);
ho:=textHeight(s);
textOut(
@@ -504,5 +415,61 @@ begin
schreibeZentriert(i mod dim,i div dim,inhalt[i]);
end;
+{$DEFINE create}
+constructor tHochhausRaetsel.create(aOwner: tForm);
+{$DEFINE hochhaus}
+{$I raetselunit.inc}
+{$UNDEF hochhaus}
+
+constructor tBuchstabenRaetsel.create(aOwner: tForm);
+{$DEFINE buchstaben}
+{$I raetselunit.inc}
+{$UNDEF buchstaben}
+{$UNDEF create}
+
+{$DEFINE destroy}
+destructor tHochhausRaetsel.destroy;
+{$DEFINE hochhaus}
+{$I raetselunit.inc}
+{$UNDEF hochhaus}
+destructor tBuchstabenRaetsel.destroy;
+{$DEFINE buchstaben}
+{$I raetselunit.inc}
+{$UNDEF buchstaben}
+{$UNDEF destroy}
+
+{$DEFINE passt}
+function tHochhausRaetsel.passt(spalte,zeile: integer): boolean;
+{$DEFINE hochhaus}
+{$I raetselunit.inc}
+{$UNDEF hochhaus}
+function tBuchstabenRaetsel.passt(spalte,zeile: integer): boolean;
+{$DEFINE buchstaben}
+{$I raetselunit.inc}
+{$UNDEF buchstaben}
+{$UNDEF passt}
+
+{$DEFINE geloest}
+function tHochhausRaetsel.geloest: boolean;
+{$DEFINE hochhaus}
+{$I raetselunit.inc}
+{$UNDEF hochhaus}
+function tBuchstabenRaetsel.geloest: boolean;
+{$DEFINE buchstaben}
+{$I raetselunit.inc}
+{$UNDEF buchstaben}
+{$UNDEF geloest}
+
+{$DEFINE gesamtRaenderErzeugen}
+procedure tHochhausRaetsel.gesamtRaenderErzeugen;
+{$DEFINE hochhaus}
+{$I raetselunit.inc}
+{$UNDEF hochhaus}
+procedure tBuchstabenRaetsel.gesamtRaenderErzeugen;
+{$DEFINE buchstaben}
+{$I raetselunit.inc}
+{$UNDEF buchstaben}
+{$UNDEF gesamtRaenderErzeugen}
+
end.