unit KakuroSolver; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Spin, StdCtrls; type { TForm1 } TForm1 = class(TForm) Button1 : TButton; Button2 : TButton; Button3: TButton; ComboBox1: TComboBox; Label1 : TLabel; Label2 : TLabel; Label3 : TLabel; Memo1 : TMemo; SqsHigh : TSpinEdit; SqsWide : TSpinEdit; procedure Button1Click(Sender: TObject); // Makes initial square grid procedure Button2Click(Sender: TObject); // Shows Boxes Array in Memo1 procedure FormClick(Sender: TObject); //Creating Puzzle and Defining Squares procedure FormPaint(Sender: TObject); // Draws above the divider line Procedure Blank (i : Integer); Procedure Across; Procedure Down; Procedure Both; private public end; Const SqSize=28; x=5; y=50; var Form1: TForm1; MouX, MouY :Integer; // Used to store a mouse click. Boxes : Array [0..21,0..21] of Byte; {This is to store the puzzle square definitions. 0=Blank, 1=Across,2=Down,3=Both,4=Addend.} c,d :TPoint; implementation {$R *.lfm} { TForm1 } Procedure TForm1.Blank (i : Integer); Begin Canvas.Pen.Color:=clRed; Boxes[(d.X-5) div SqSize,(d.Y-50) div SqSize]:=i; Case i of 0 : Begin Canvas.Brush.Color:=clBlack; End; 4 : Begin Canvas.Brush.Color:=clWhite; End; end; Canvas.Pen.Width:=1; Canvas.Rectangle(x+1+SqSize* ((d.X-5) div SqSize), y+1+SqSize* ((d.Y-50) div SqSize), x+SqSize* (((d.X-5) div SqSize)+1), y+SqSize* (((d.Y-50) div SqSize)+1)); Label3.Caption:='(X,Y)=('+IntToStr((d.X-5) div SqSize)+',' +IntToStr((d.Y-50) div SqSize)+')'; Boxes[(d.X-5) div SqSize,(d.Y-50) div SqSize]:=i; end; // Proc Blank Procedure TForm1.Both; Begin Canvas.Pen.Color:=clRed; Canvas.Brush.Color:=clWhite; Canvas.Pen.Width:=1; Canvas.Rectangle(x+1+SqSize*((d.X-5) div SqSize), y+1+SqSize*((d.Y-50) div SqSize), x+SqSize* (((d.X-5) div SqSize)+1), y+SqSize* (((d.Y-50) div SqSize)+1)); Label3.Caption:='(d.X,d.Y)=('+IntToStr(d.X)+','+IntToStr(d.Y)+')' +' (X,Y)=('+IntToStr(x+1+SqSize*((d.X-5) div SqSize))+',' +IntToStr(y+1+SqSize*(d.Y-5) div SqSize)+')'; Canvas.Pen.Color:=clBlack; Canvas.Brush.Color:=clWhite; Canvas.Line(x+1+SqSize* ((d.X-5) div SqSize), y+1+SqSize* ((d.Y-50) div SqSize), x+SqSize*(((d.X-5) div SqSize)+1), y+SqSize*(((d.Y-50) div SqSize)+1)); Boxes[(d.X-5) div SqSize,(d.Y-50) div SqSize]:=3; end; // Proc Both Procedure TForm1.Down; Var m : Byte; Begin Canvas.Pen.Color:=clRed; Canvas.Brush.Color:=clWhite; Canvas.Pen.Width:=1; Canvas.Rectangle(x+1+SqSize*((d.X-5) div SqSize), y+1+SqSize*((d.Y-50) div SqSize), x+SqSize* (((d.X-5) div SqSize)+1), y+SqSize* (((d.Y-50) div SqSize)+1)); Label3.Caption:='(d.X,d.Y)=('+IntToStr(d.X)+','+IntToStr(d.Y)+')' +' (X,Y)=('+IntToStr(x+1+SqSize*((d.X-5) div SqSize))+',' +IntToStr(y+1+SqSize*(d.Y-5) div SqSize)+')'; Canvas.Pen.Color:=clBlack; For m:=1 to 28 Do Canvas.Line(x+1+SqSize*((d.X-5) div SqSize), y+1+SqSize*((d.Y-50) div SqSize), x+SqSize* (((d.X-5) div SqSize)+1), y+m+SqSize* (((d.Y-50) div SqSize))); Boxes[(d.X-5) div SqSize,(d.Y-50) div SqSize]:=2; end; // Proc Down Procedure TForm1.Across; Var m : Byte; Begin Canvas.Pen.Color:=clRed; Canvas.Brush.Color:=clWhite; Canvas.Pen.Width:=1; Canvas.Rectangle(x+1+SqSize*((d.X-5) div SqSize), y+1+SqSize*((d.Y-50) div SqSize), x+SqSize* (((d.X-5) div SqSize)+1), y+SqSize* (((d.Y-50) div SqSize)+1)); Label3.Caption:='(d.X,d.Y)=('+IntToStr(d.X)+','+IntToStr(d.Y)+')' +' (X,Y)=('+IntToStr(x+1+SqSize*((d.X-5) div SqSize))+',' +IntToStr(y+1+SqSize*(d.Y-5) div SqSize)+')'; Canvas.Pen.Color:=clBlack; For m:=0 to 27 Do Canvas.Line(x+1+SqSize*((d.X-5) div SqSize), y+1+m+SqSize*((d.Y-50) div SqSize), x+SqSize* (((d.X-5) div SqSize)+1), y+SqSize* (((d.Y-50) div SqSize)+1)); Boxes[(d.X-5) div SqSize,(d.Y-50) div SqSize]:=1; end; //Proc Across procedure TForm1.FormPaint(Sender: TObject); // Also clears the Boxes Array. begin Canvas.Pen.Color:=clBlack; Canvas.Pen.Width:=3; Canvas.Line(0,45,Form1.Width,45); // Black Divider Line. end; // Proc FormPaint procedure TForm1.Button1Click(Sender: TObject); // Makes initial square grid Var x, j, k : Integer; begin Canvas.Pen.Color:=TColor($f0f0f0); For x:=51 to Form1.Height Do Canvas.Line(0,x,Form1.Width,x); // Clear Canvas with Lines. Canvas.Pen.Color:=clBlack; Canvas.Pen.Width:=3; Canvas.Line(0,45,Form1.Width,45); // Black Divider Line. Canvas.Pen.Width:=1; Canvas.Line(5,50,SqsWide.Value*SqSize+5,50); // First Horz Line. For x:=1 to SqsHigh.Value Do Canvas.Line(5,x*SqSize+50,SqsWide.Value*SqSize+5,x*SqSize+50); // Horz Lines. Canvas.Line(5,50,5,SqsHigh.Value*SqSize+50); // First Vert Line. For x:=1 to SqsWide.Value Do Canvas.Line(x*SqSize+5,50,x*SqSize+5,SqsHigh.Value*SqSize+50); // Vert Lines. For j:=0 to 21 Do For k:=0 to 21 Do Boxes[j,k]:=7; end; // Proc Button1Click Initial Square Grid. procedure TForm1.Button2Click(Sender: TObject); // Show Boxes Var a, b, c, d, m,n : Integer; s : String; begin Memo1.Lines.Clear; For m := 0 to SqsHigh.Value-1 Do Begin s:=''; For n :=0 to SqsWide.Value-1 Do s:=s+IntToStr(Boxes[n,m])+','; Memo1.Lines.Add(s); end; // m Loop. // Looking in Boxes for Accross squares. c:=1; d:=0; For a:=1 to SqsHigh.Value-1 Do Begin For b:=1 to SqsWide.Value-1 Do Begin If Boxes[b,a]=1 Then While Boxes[b+c,a]=4 Do c:=c+1; end; end; end; // Proc Button2Click Show Boxes procedure TForm1.FormClick(Sender: TObject); //Defining Puzzle Squares begin c.X:=Mouse.CursorPos.X; c.Y:=Mouse.CursorPos.Y; d:=Form1.ScreenToClient(c); // d.X and d.Y are your coordinates Canvas.Pen.Width:=1; Case ComboBox1.ItemIndex of 0 : Blank (ComboBox1.ItemIndex); // This is a Blank (Non-Playing) Square. 1 : Across; // This is a Sum Across Square. 2 : Down; // This is a Sum Down Square. 3 : Both; // This is a Sum Both Ways Square. Else Blank (ComboBox1.ItemIndex); // This is an Addend Square. End; end; // Proc FormClick end.