kontrol deyimlerinde problem

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
semiramis
Üye
Mesajlar: 6
Kayıt: 03 Oca 2008 10:59

kontrol deyimlerinde problem

Mesaj gönderen semiramis »

problemim bir sudoku programı yapımında. eğer sudoku yu bilmiyorsanız hemen bilgilendireyim. sudoku 3*3 tane 3*3 kutucukdan (9x9) oluşuyor. bulmacanın tamamlanması için her 3*3da bulunan sayı aynı 3*3 de ve aynı satır sütunda tekrarlanmış olmayacak. ayrıntılı bilgi http://www.geocities.com/iks_kare/sudoku/Sudoku.htm adresinde mevcut.

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.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
kodları tam inceliyemedim ama label kullanmışsın.
tavsiyem label kullanmadan bu işi halletmen.
recursive fonksiyonlar işini görecektir. (yani kendini çağıran fonksiyonlar)
hadi kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
semiramis
Üye
Mesajlar: 6
Kayıt: 03 Oca 2008 10:59

Mesaj gönderen semiramis »

öneri için teşekkürler. denedikten sonra tekrar durumu belirteceğim.
semiramis
Üye
Mesajlar: 6
Kayıt: 03 Oca 2008 10:59

Mesaj gönderen semiramis »

yalnız şöyle bir durum var ki, belki dikkatinizi çekmiştir karşılaştırmadan sonra goto ile label e gönderirken boolean kontrol değişkenlerin içeriklerini yazdırıyorum showmessage ile. fakat if deyimindeki şart sağlanmasına rağmen boolean değişkenlere şarta göre true yada false atamıyor. yani

Kod: Tümünü seç

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; 
kısmında hiç trueymiş yazmıyor devamlı falseymiş yazıyor showmessagela. haliyle belirtilen label a da gitmiyor. sanırım problem bu. bir çözüm tavsiye eden olursa çok sevinirim.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
for dan sonraki işlemleri begin end içine almayı unutmuşsun sanırım.

Kod: Tümünü seç

if (x=yataydizi[l]) and (y=dikeydizi[l]) then
            dizikontrol:=true
        else
           dizikontrol:=false; 
bu işlemi 5 defa yapıyor 5.işlem sonunda dizikontrol değeri false oluyor
for dan sonra begin koyup uygun yerede end ini koyarsan düzelir kanaatindeyim.
ancak bu hala label kullanmaman gerekliliğini değiştirmez.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Cevapla