https://blog.csdn.net/m0_62916138/article/details/128435237
根据上面文章改写为delphi版的程序,效果如图,版权归原作者所有.
以下为delphi源码
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.StdCtrls, Vcl.Mask,
RzEdit, RzSpnEdt;
type
TForm1 = class(TForm)
strngrd1: TStringGrid;
btn1: TButton;
lbl1: TLabel;
edt1: TRzSpinEdit;
procedure btn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure strngrd1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
private
procedure writegrid;
procedure shudu_1;
procedure shudu_2;
procedure shudu_3;
procedure dighole(difficulty:integer);
procedure getshudu(difficulty:integer);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
shudu:array[0…8,0…8] of Integer;
hole:array[0…8,0…8] of Integer;
implementation
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
begin
getshudu(edt1.IntValue);
writegrid;
end;
procedure TForm1.dighole(difficulty: integer);
begin
difficulty:=difficulty*20;
while difficulty>0 do
begin
shudu[random(9),random(9)]:=0;
dec(difficulty);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
for var i := 0 to 8 do
for var j := 0 to 8 do
shudu[i,j]:=0;
end;
procedure TForm1.getshudu(difficulty: integer);
begin
shudu_1;
shudu_2;
shudu_3;
dighole(difficulty);
end;
procedure TForm1.shudu_1;
var
a:array[0…8] of Integer;
n:integer;
i:Integer;
begin
n:=0;
while(n<9) do
begin
var m:=Random(9)+1;
var flag:=0;
for i := 0 to n do
begin
if a[i]=m then
begin
flag:=1;
break;
end;
end;
if flag=0 then
begin
a[n]:=m;
inc(n);
end;
var k:=0;
for var g:=3 to 5 do
for var h:= 3 to 5 do
begin
shudu[g,h]:=a[k];
Inc(k);
end;
end;
end;
procedure TForm1.shudu_2;
begin
for var i := 3 to 5 do
begin
var l:=0;
for var j := 3 to 5 do
begin
if i=3 then
begin
shudu[i+1][l]:=shudu[i,j];
shudu[i+2,l+6]:=shudu[i,j];
inc(l);
end
else if i=4 then
begin
shudu[i+1][l]:=shudu[i,j];
shudu[i-1,l+6]:=shudu[i,j];
inc(l);
end
else if i=5 then
begin
shudu[i-2][l]:=shudu[i,j];
shudu[i-1,l+6]:=shudu[i,j];
inc(l);
end;
end;
end;
for var j := 3 to 5 do
begin
var l:=0;
for var i := 3 to 5 do
begin
if j=3 then
begin
shudu[l][j+1]:=shudu[i,j];
shudu[l+6,j+2]:=shudu[i,j];
inc(l);
end
else if j=4 then
begin
shudu[l,j+1]:=shudu[i,j];
shudu[l+6,j-1]:=shudu[i,j];
inc(l);
end
else if j=5 then
begin
shudu[l,j-2]:=shudu[i,j];
shudu[l+6,j-1]:=shudu[i,j];
inc(l);
end;
end;
end;
end;
procedure TForm1.shudu_3;
begin
for var i := 0 to 3 do
begin
var l:=0;
for var j := 3 to 5 do
begin
if i=0 then
begin
shudu[i+1,l]:=shudu[i,j];
shudu[i+2,l+6]:=shudu[i,j];
inc(l);
end
else if i=1 then
begin
shudu[i+1,l]:=shudu[i,j];
shudu[i-1,l+6]:=shudu[i,j];
inc(l);
end
else if i=2 then
begin
shudu[i-2,l]:=shudu[i,j];
shudu[i-1,l+6]:=shudu[i,j];
inc(l);
end;
end;
end;
for var i := 6 to 8 do
begin
var l:=0;
for var j := 3 to 5 do
begin
if i=6 then
begin
shudu[i+1,l]:=shudu[i,j];
shudu[i+2,l+6]:=shudu[i,j];
inc(l);
end
else if i=7 then
begin
shudu[i+1,l]:=shudu[i,j];
shudu[i-1,l+6]:=shudu[i,j];
inc(l);
end
else if i=8 then
begin
shudu[i-2,l]:=shudu[i,j];
shudu[i-1,l+6]:=shudu[i,j];
inc(l);
end;
end;
end;
end;
procedure TForm1.strngrd1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
with tstringgrid(sender).Canvas do
begin
pen.Color:=clblack;
brush.Style:=bsclear;
rectangle(rect);
if (acol>2) and (acol<6) then
begin
brush.color:=clmoneyGreen;
fillrect(rect);
textout(rect.Left+2,rect.Top+2,tstringgrid(sender).Cells[acol,arow]);
end;
if (arow>2) and (arow<6) then
begin
brush.color:=clmoneyGreen;
fillrect(rect);
textout(rect.Left+2,rect.Top+2,tstringgrid(sender).Cells[acol,arow]);
end;
if (arow>2) and (arow<6) and (acol>2) and (acol<6) then
begin
brush.color:=clblue;
fillrect(rect);
textout(rect.Left+2,rect.Top+2,tstringgrid(sender).Cells[acol,arow]);
end;
end;
end;
procedure TForm1.writegrid;
begin
for var i := 0 to 8 do
for var j := 0 to 8 do
begin
if shudu[i,j]=0 then
begin
strngrd1.Cells[i,j]:=‘’;
continue;
end else
strngrd1.Cells[i,j]:=inttostr(shudu[i,j]);
end;
end;
end.