bu programı yazmaya başladığımdan beri yeniden başladığım 3. projemde bile aynı sorunu çözemedim. aşağıda kopyalayacağım kodda başla butonuna basıldığında 3 seçenek geliyor bu 3 seçenek kolay normal ve zor seçeneklerinden oluşuyor. şimdilik sadece kolay seçeneği için kodlama yapmaya çalıştım. kodlama yaparkenki amacım her 3*3 için 5 tane random x y koordinatları atanması, daha sonra bunların daha önce atanıp atanmadığının kontrolü eğer daha önce atanmadıysa üretilen x y değerlerindeki yere yine random bir sayı ataması yapmak. tabi sayıyı atarken satır ve sütun kontrolü de yapmak gerekiyor. amacım program her 3*3 için 5 tane toplamda 9 tane 3*3 olacağından 9*5=45 sayı atamak ama bunları tamamen sudoku bulmacasının kuralına göre atamak. daha sonra kullanıcının bulmacayı çözdükten sonra yine bir butonla kontrolünü yapmak ve yine bir butonla bulmacayı otomatik olarak çözmek.
programı her döngüde üretilen x y ve sayi değerlerinin testi ile çalıştırıyorum ve sonuçta x ve y nin aynı olması durumunda yeni bir x y almak için tekrar isimli etiketlere dönmediğinin farkına vardım. yani dizikontrol veya herhangi boolean kontrol değişkenlerime if ile yaptığım karşılaştırma sonucunda istediğim true yada false değeri atanmıyor. sorunun ne olduğunun farkına varamadım. işte kod
Kod: Tümünü seç
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Math, Menus, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Panel1: TPanel;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
Label1: TLabel;
ListBox1: TListBox;
ListBox2: TListBox;
ListBox3: TListBox;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
procedure RadioButton3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
sudoku:array[1..9,1..9] of TEdit;
dizi:array[1..9,1..9] of string;
rakam:array[1..9] of integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
i,j,x,y:integer; // i ve j döngü kontrolü x ve y satır sütun kontrolü
begin
for i:=1 to 9 do
begin
if i=1 then y:=10 else y:=y+49;
x:=10;
for j:=1 to 9 do
begin
sudoku[i,j]:=TEdit.Create(Self);
sudoku[i,j].parent:=Self;
sudoku[i,j].TabOrder:=i;
sudoku[i,j].ctl3d:=false;
sudoku[i,j].AutoSize:=True;
sudoku[i,j].Font.Name:='Trebuchet MS';
sudoku[i,j].font.Style:=[fsbold];
sudoku[i,j].font.Color:=TColor($0000FF);
sudoku[i,j].font.Height:=-11;
sudoku[i,j].font.size:=25;
sudoku[i,j].MaxLength:=1;
sudoku[i,j].enabled:=true;
sudoku[i,j].left:=x;
sudoku[i,j].top:=y;
sudoku[i,j].height:=50;
sudoku[i,j].width:=50;
sudoku[i,j].show;
x:=x+49;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=632 downto 464 do
panel1.Left:=i;
//panel forma geldi
form1.ActiveControl:=button1;
//radiobutton2 otomatik olarak seçili hale getirildi
end;
procedure TForm1.RadioButton1Click(Sender: TObject);
label
tekrar,tekrar2,tekrar3,tekrar4,tekrar5;
var
i,j,x,y,sayac,c,k,l,sayi,max,yataymax,dikeymax,yataymin,dikeymin,m,n,rndm:integer;
yataydizi:array[1..5] of integer;
dikeydizi:array[1..5] of integer;
dizikontrol,dkontrol,bkontrol,xkontrol,ykontrol:boolean;
strsayi:string;
begin
for i:=464 to 632 do
panel1.Left:=i;
//panel sağ tarafa gitti
radiobutton1.Checked:=false;
dizikontrol:=false;
listbox1.Clear;
listbox2.Clear;
listbox3.Clear;
for i:=1 to 9 do
for j:=1 to 9 do
begin
sudoku[i,j].text:='';
sudoku[i,j].enabled:=true;
end;
max:=9;
for c:=1 to max do
rakam[c]:=c;
for c:=1 to 5 do
begin
yataydizi[c]:=0;
dikeydizi[c]:=0;
end;
yataymax:=3;
dikeymax:=3;
yataymin:=1;
dikeymin:=1;
for i:=1 to 3 do
begin
for j:=1 to 3 do
begin
for k:=1 to 5 do
begin
tekrar:
randomize;
x:=randomrange(yataymin,yataymax+1);
y:=randomrange(dikeymin,dikeymax+1);
dizikontrol:=true;
for l:=1 to 5 do
if (x=yataydizi[l]) and (y=dikeydizi[l]) then
dizikontrol:=true
else
dizikontrol:=false;
if dizikontrol=true then
begin
showmessage('trueymiş');
goto tekrar
end
else
begin
showmessage('falseymiş');
yataydizi[k]:=x;
dikeydizi[k]:=y;
listbox1.items.add(inttostr(yataydizi[k]));
listbox2.items.add(inttostr(dikeydizi[k]));
end;
tekrar3:
randomize;
rndm:=randomrange(1,max+1);
sayi:=rakam[rndm];
xkontrol:=false;
ykontrol:=false;
for m:=1 to 9 do
begin
if x=m then
goto tekrar4
else
if inttostr(sayi)=sudoku[m,y].text then
xkontrol:=true
else
xkontrol:=false;
tekrar4:
if y=m then
goto tekrar5
else
if inttostr(sayi)=sudoku[x,m].text then
ykontrol:=true
else
ykontrol:=false;
tekrar5:
end;
if xkontrol=true or ykontrol=true then
goto tekrar3
else
begin
sudoku[x,y].text:=inttostr(sayi);
listbox3.Items.add(inttostr(sayi));
max:=max-1;
for n:=rndm to max do
rakam[n]:=rakam[n+1];
end;
end;
max:=9;
for n:=1 to max do
rakam[n]:=n;
dikeymin:=dikeymax+1;
dikeymax:=dikeymax+3;
end;
yataymin:=yataymax+1;
yataymax:=yataymax+3;
dikeymax:=3;
dikeymin:=1;
end;
label6.Caption:=inttostr(listbox1.Items.Count);
label7.Caption:=inttostr(listbox2.Items.Count);
label8.Caption:=inttostr(listbox3.Items.Count);
end;
procedure TForm1.RadioButton2Click(Sender: TObject);
var
i:integer;
begin
for i:=464 to 632 do
panel1.Left:=i;
//panel sağ tarafa gitti
radiobutton2.Checked:=false;
end;
procedure TForm1.RadioButton3Click(Sender: TObject);
var
i:integer;
begin
for i:=464 to 632 do
panel1.Left:=i;
//panel sağ tarafa gitti
radiobutton3.Checked:=false;
end;
end.