9 Taş ufak bi sorun

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Svvordlion
Üye
Mesajlar: 2
Kayıt: 28 Ara 2013 04:47

9 Taş ufak bi sorun

Mesaj gönderen Svvordlion »

Değerli abilerim kardeşlerim 9 taş tablosu çizip iki noktanın kesiştiği her noktaya bi daire çiziyorum toplamda 9 tane kesişen nokta var ve benim amacım 9 yerine 6 tane daire(3ü kırmızı 3 ü mavi) yerleştirme yani sorunum bazı daireler üst üste biniyor

unit Unit1;


interface


uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,extctrls, StdCtrls, Math;


type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;


var
Form1: TForm1;


implementation


{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var cubuk,pul:array [1..9] of tshape;
i,x,y:integer;
kutu:array [1..9] of integer;
hk,ck,c,d,k:integer;
begin
randomize;
for i:=1 to 3 do
begin
cubuk:=tshape.Create(self);
cubuk.Parent:=self;
cubuk.Left:=100;
cubuk.Top:=i*100;
cubuk.Width:=200;
cubuk.Height:=1;
cubuk.Brush.Color:=rgb(0,0,0);
cubuk[i+3]:=tshape.Create(self);
cubuk[i+3].Parent:=self;
cubuk[i+3].Left:=i*100;
cubuk[i+3].Top:=100;
cubuk[i+3].Width:=1;
cubuk[i+3].Height:=200;
cubuk[i+3].Brush.Color:=rgb(0,0,0);
end;


for i:=1 to 9 do
begin
kutu:=i;
end;






for i:=1 to 6 do
begin
hk:=10-i;
ck:=random(10-i)+1;
c:=kutu[hk];
kutu[hk]:=kutu[ck];
kutu[ck]:=c;
end;


for i:=1 to 6 do
begin
k:=kutu[10-i];
if k<4 then y:=100;
if (k>3) and (k<7) then y:=200;
if k>6 then y:=300;
if (k=1) or (k=4) or (k=7) then x:=100;
if (k=2) or (k=5) or (k=8) then x:=200;
if (k=3) or (k=6) or (k=9) then x:=300;


if power(-1,i)<0 then




begin
x:=100*(random(3)+1);
y:=100*(random(3)+1);
pul[1]:=tshape.Create(self);
pul[1].Parent:=self;
pul[1].Left:=x-5;
pul[1].Top:=y-5;
pul[1].Width:=10;
pul[1].Height:=10;
pul[1].Brush.Color:=rgb(255,0,0);
pul[1].Shape:=stCircle;
end;


begin
x:=100*(random(3)+1);
y:=100*(random(3)+1);
pul[2]:=tshape.Create(self);
pul[2].Parent:=self;
pul[2].Left:=x-5;
pul[2].Top:=y-5;
pul[2].Width:=10;
pul[2].Height:=10;
pul[2].Brush.Color:=rgb(0,0,255);
pul[2].Shape:=stCircle;
end;


end;
















end;


end.
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: 9 Taş ufak bi sorun

Mesaj gönderen omurolmez »

Kod: Tümünü seç

if power(-1,i)<0 then
satırının hemen üstüne

Kod: Tümünü seç

ShowMessage('');
ekleyerek çalıştırdığınızda, üst üste gelen daireleri görebilirsiniz.

Tabii sorduğunuz bu değil ama eğer bu bir ödev değil ise ve oyunu tamamlamayı hedefliyorsanız, şu tür bir yapı öneririm :

Kod: Tümünü seç

type
  TTas =(tBos, tKirmizi, tMavi);
  Form1 =class(TForm)
  //....
  private   
    FTaslar :array[0..2, 0..2] of TTas;
  //....
Böylece, mesela şu şekilde kodlar yazabilirsiniz :
merkezdeki pozisyona kırmızı taşı koymak için

Kod: Tümünü seç

FTaslar[1, 1] :=tKirmizi
sol üstte taş olup olmadığını öğrenmek için

Kod: Tümünü seç

FTaslar[0, 0]<>tBos
Çizim işlemlerine gelince, gönderdiğiniz kodda Button1Click olayına yazdığınız tüm kodu Form1Paint olayına yazabilir ve şu şekilde ikiye ayırabilirsiniz :

Kod: Tümünü seç

//Adım 1: Zeminin (çizgilerin) çizilmesi
// . . .
//Adım 2: Taşların çizilmesi
for ADikey :=0 to 2 do
  for AYatay :=0 to 2 do
    TasCiz(ADikey, AYatay, FTaslar[ADikey, AYatay]);
Bu durumda, TasCiz işleviniz şuna benzeyebilir :

Kod: Tümünü seç

procedure TForm1.TasCiz(ADikey, AYatay :integer; ATas :TTas);
const
  Renkler :array[TTas] of TColor =(clBlack, clRed, clBlue);
var
  x, y :integer;
begin
  if ATas<>tYok then begin
    x :=100 + AYatay * 30;
    y :=100 + ADikey * 30;
    Canvas.Brush.Color :=Renkler[ATas];
    Canvas.Circle(x, y, 5);
  end;
end;
Şimdi ne yaptık ? Oyunun kurallarını/mantığını, taşların görüntülenme mantığından ayırmaya çalıştık. Böylece, her iki kısımda da sadece o kısma konsantre olabilmeyi hedefledik. Tabii çizimde iki yöntemden biri seçilebilir.

Fikriniz olması için, Windows un tercih ettiği boyama yöntemini kullandım. Yani görüntü nesneleri hafızada tutulmaz ve gerektikçe form tekrar boyanır. Siz örneğinizdeki yöntemden gitmek isterseniz, formunuzun üzerine bir Image vb nesne yerleştirmenizi ve çizimlerinizi onun üzerine yapmanızı tavsiye ederim. Bu durumda, onPaint vb bir olaya bağlı kalmaksızın istediğiniz zaman ve bir defa çizim yapmanız yeterli olur. Tercih sizin.

TasCiz işlevinde, üçüncü parametre olarak ATas :TTas gereksiz görünebilir. Çünki zaten FTaslar dizisi global tanımlı ve TasCiz e ADikey ve AYatay değerlerini geçtik. Bu tartışmalı bir konu. Fazla derine girmeden, kısaca söyleyip geçeyim, bu şekilde programlamanın bazı yararları vardır. Ama tercih sizin.

Eğer oyunu sonuna kadar götürmek istiyorsanız, elimden geldiğince yardımcı olurum.
Ömür Ölmez
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: 9 Taş ufak bi sorun

Mesaj gönderen mrmarman »

@omurolmez

Eline sağlık. :bravo:

Oyun gibi düşününce taşları hareket ettirmek noktasında bir ilüzyon yaratabilirsiniz.

(1) üzerinde olunan boyama pulun aynı büyüklüğünde bir shape'i o an create edilir
(2) taşıma işlemi görseli bununla yapılır.
(3) sonunda o shape free edilir,
(4) tasınan yere canvas operasyonu ile yeni pul resmi çizilebilir.
Resim
Resim ....Resim
omurolmez
Üye
Mesajlar: 187
Kayıt: 31 Eki 2012 11:41

Re: 9 Taş ufak bi sorun

Mesaj gönderen omurolmez »

Hoşgeldiniz @mrmarman. Artık oyunun tamamlanması işten bile değil :D
Ömür Ölmez
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: 9 Taş ufak bi sorun

Mesaj gönderen mrmarman »

- Keşke oyun olsaydı, arkadaşın okul ödeviymiş de. Daha önce görüşmemiz oldu.
Tabii iki ayrı forumda başlık açılır da diğerinde sorun çözülürse, burası da öksüz kalıyor. :o

Bkz.DelphiDunyası.NET
Resim
Resim ....Resim
Svvordlion
Üye
Mesajlar: 2
Kayıt: 28 Ara 2013 04:47

Re: 9 Taş ufak bi sorun

Mesaj gönderen Svvordlion »

Hepinize teşekkür ediyorum yardımlarınız için fakat muharrem abicim olayı noktaladı ve şöyle bişeyde var konuyu actıktan 7 saat sonra buraya eklenmiş o yüzden böyle bi sıkıntı oluştu :)
Cevapla