Код:
Procedure MouseDown(x,y: real; b: integer);
begin
if alarm.sum<>-3 then begin
foreach var d in alarm do if d<>-1 then begin a[d].BorderColor := Color[0]; a[d].BorderWidth := 1; end;
alarm := |-1,-1,-1|;
end;
if (x in 9.5*w..w*10.5) and (y in 10+4*w..w*5+10) then //нажата подстветка вкл/выкл
if boolean(sol.Tag) then
begin sol.Tag := false; sol.FontColor := Colors.Gray; sol.Color := EmptyColor; ColorX(0) end
else begin sol.Tag := true; sol.FontColor := Colors.Goldenrod; sol.Color := Color[2];
ColorX(grids[integer(vib.Tag)]) end;
if (x in 9.5*w..w*10.5) and (y in 10..w+10) then begin //нажата НОВАЯ ИГРА
Redraw(() -> begin NewGameInit end); exit;end;
if (x in 9.5*w..w*10.5) and (y in 10+1.3*w..w*2+9) then//нажата кнопка levelb вверх
if levels < 4 then begin levels += 1; levelb.Number := levels; ColorX(0); end;
if (x in 9.5*w..w*10.5) and (y in 10+2*w..w*2.7+10) then//нажата кнопка levelb вниз
if levels > 1 then begin levels -= 1; levelb.Number := levels; ColorX(0); end;
if (x in 10..9+9*w) and (y in 10..9+9*w) then begin //нажато окно на поле
var z := trunc((y-10)/w)*9 + trunc((x-10)/w);
vib.MoveTo(a[z].LeftTop.X.trunc - 2, a[z].LeftTop.Y.trunc-2); vib.tag := z; vib.Visible := true;
if (grids[z] =0) and boolean(srazy.Tag) then begin Okno(grids[z]); Colorx(integer(vib2.Tag)) end;
if (grids[z] =0) and not boolean(srazy.Tag) then Colorx(integer(vib2.Tag));
if (grids[z]<>0) then ColorX(grids[z]);
end;
if (x in 10..9+9*w) and (y in w*9.5..w*9.5+w) then begin//нажато цифра под полем
var z := trunc((x-10)/w)+1;
vib2.MoveTo(8+w*(z-1), 9.5*w-2); vib2.Tag := z;
button[z].Color := Color[2];
if not boolean(srazy.Tag) then Okno(z);
ColorX(z);
end;
if (x in 9.5*w..w*10.5) and (y in 9.5*w..w*10.5) then//нажато 'ввод основных\дополнительных'
if boolean(dop.Tag) then
begin dop.FontColor := Color[0]; dop2.FontColor := EmptyColor; dop.Tag := false end
else begin dop.FontColor := EmptyColor; dop2.FontColor := Color[0]; dop.Tag := true end;
//10+w*z-w, w*9.5, w, Color[1], 1,Color[0]);
if (x in 9.5*w..w*10.5) and (y in 10+8*w..w*9+10) then//нажата кнопка СРАЗУ
if boolean(srazy.Tag) then begin srazy.Tag := false; srazy.Text := '/' end
else begin srazy.Tag := true; srazy.Text := '=' end;
if win.Visible = true then exit;
if (x in 9.5*w..w*10.5) and (y in 10+6.5*w..w*7.5+10) then//нажата кнопка del
if not boolean(a[integer(vib.tag)].Tag) then begin
var ind := integer(vib.tag);
if grids[ind] <> 0 then begin
if button2[grids[ind]].Number = 0 then button2[grids[ind]].Color := Color[5];
button2[grids[ind]].Number := button2[grids[ind]].Number + 1; otkrito -= 1;
end;
ColorX(0); grids[ind] := 0; a[ind].Text := ''; a2[ind].Text := ' '#13#10' '#13#10' ';
a2[ind].Tag := 0; a[ind].Color := EmptyColor;
end;
end;
Procedure Init;
begin
for var z := 0 to 80 do begin
var (x,y) := (z div 9, z mod 9);
a[z] := new SquareWPF(10+y*w,10+x*w,w, EmptyColor, 0.5,Color[0]);
a[z].FontSize := 3*w div 5; a[z].Tag := false;
a2[z] := new SquareWPF(10+y*w+w div 16,10+x*w+w div 16,w-2*w div 16, EmptyColor);
a2[z].TextAlignment := Alignment.CenterTop; a2[z].FontName := 'Courier New';
a2[z].FontSize := w * 28 div 100; a2[z].Text := ' '#13#10' '#13#10' '; a2[z].Tag := 0;
end;
for var x := 0 to 3 do begin
var gor:= new LineWPF(10+x*3*w,10,10+x*3*w,10+w*9,Color[0]); gor.SetLineWidth(3);
var ver:= new LineWPF(10,10+x*3*w,10+w*9,10+x*3*w,Color[0]); ver.SetLineWidth(3);
end;
vib := new SquareWPF(8,8,w+4, EmptyColor,5,Color[3]); //выделение ячейки на поле (выбор)
vib.Visible := false; vib.Tag := integer(0);
for var z := 1 to 9 do begin
button[z] := new SquareWPF(10+w*z-w, w*9.5, w, Color[1], 1,Color[0]);
button[z].FontSize := 3*w div 5; button[z].Number := z;
button2[z] := new SquareWPF(10+w*z-w+3, w*9.5+3, w-6, Color[1], 1,Color[0]);
button2[z].BorderColor := EmptyColor; button2[z].FontSize := w * 28 div 100;
button2[z].TextAlignment := Alignment.RightBottom; button2[z].Color := Color[5];
button2[z].Number := 9;
end;
vib2 := new SquareWPF(8,9.5*w-2,w+4, EmptyColor,5,Color[3]); //выделение ячейки под полем)
vib2.Tag := 1;
dop := new SquareWPF(w*9.5, w*9.5, w, Color[1], 1,Color[0]);
dop.FontSize := 3*w div 5; dop.Tag := false; dop.Text := '1-9';
dop2 := new SquareWPF(w*9.5,w*9.5+w div 16,w, EmptyColor);
dop2.TextAlignment := Alignment.CenterTop; dop2.FontName := 'Courier New';
dop2.FontColor := EmptyColor; dop2.FontSize := w * 28 div 100;
dop2.Text := '1 2 3'#13#10'4 5 6'#13#10'7 8 9';
srazy := new SquareWPF(w*9.5, 10+8*w, w, Color[1], 1,Color[0]);
srazy.FontSize := 3*w div 5; srazy.Tag := true; srazy.Text := '=';
del := new SquareWPF(w*9.5, 10+6.5*w, w, Color[1], 1,Color[0]);
del.FontSize := 3*w div 5; del.Text := 'del';
newgame := new SquareWPF(w*9.5,10,w,Color[1],1,Color[0]); //кнопка Новая Игра
newgame.Text := 'НОВАЯ'#13#10' ИГРА'; newgame.FontSize := w div 4;
var levelsq := new SquareWPF(w*9.5,10+1.5*w,w,Color[1],1,Color[0]); //кнопка УРОВЕНЬ СЛОЖНОСТИ
levelsq.RotateAngle := 45;
levelb := new SquareWPF(w*9.5,10+1.5*w,w,EmptyColor,0,EmptyColor); //цифра уровеня
levelb.FontSize := 3*w div 5; levelb.number := levels;
sol := new SquareWPF(w*9.5, 10+4*w, w, Color[2], 1,Color[0]);
sol.FontSize := 4*w div 5 ; sol.Text := '☀'; sol.Tag := True; sol.FontColor := Colors.Goldenrod;
win := new SquareWPF(w*9.5,w*3+10,w,Colors.White);//слово ПОБЕДА
win.Text := 'ПОБЕДА'; win.FontSize := w div 4; win.FontColor := Colors.Red; win.Visible := false;
end;
begin
Window.SetSize(w*11,w*11);
Window.CenterOnScreen;
Window.Caption := 'СУДОКУ';
Redraw(() -> begin Init; PoleInit end);
OnMouseDown += MouseDown;
end.