Sayfayı Yazdır | Pencereyi Kapat

Random Yer Değiştirme

Nereden Yazdırıldığı: Clomosy | Forum
Kategori: Genel Programlama
Forum Adı: Genel İşlemler
Forum Tanımlaması: TRObject dili ile programlama yaparken karşılaşılan genel işlemler
URL: https://forum.clomosy.com.tr/forum_posts.asp?TID=593
Tarih: 10 Haziran 2025 Saat 13:53
Program Versiyonu: Web Wiz Forums 12.07 - https://www.webwizforums.com


Konu: Random Yer Değiştirme
Mesajı Yazan: emre.gungor01
Konu: Random Yer Değiştirme
Mesaj Tarihi: 12 Mayıs 2024 Saat 18:18
Merhabalar;

Clomosy Kitap'tan ve github kodlarından bakmaya çalıştım fakat bir bilgi sahibi olamadım projemde orta noktada bulunan yuvarlağımı içindeki label bastığımda 25 olunca ekranda random bir yere atamasını istiyorum fakat nasıl yapacağım hakkında bir şey bulamadım;

kodlar;

Var
  AnaForm:TclForm;
  btn1 : TClProButton;
  Zaman : TCLTimer;
  sayac:Integer;
  
  Zaman2:TCLTimer;
  sayac1:Integer;
  lblTimer: TCLLabel;
  
void zamanlayici;
{
  if(sayac == sayac)
  {
  sayac = sayac + 1;
  Zaman.Enabled = False;
  btn1.Text = IntToStr(sayac);
  if(sayac == 25)
  {
  AnaForm.SetFormColor('#23c7c5','',clGNone);
  sayac1 = sayac1 + 3;
  
  btn1.Position.Y = btn1.Position.Y + 30;  //KONUM
  }
  }
  else
  {
  btn1.Text = IntToStr(sayac);
  sayac = sayac + 1;
  }
}

void sure;
{
  
  if(sayac1 == 0)
  {
    Zaman2.Enabled = False;
    lblTimer.caption = IntToStr(sayac1);
    ShowMessage('Süreniz Doldu!');
   
    if(btn1 == 2)
    {
    Zaman2.Enabled= False;
    lblTimer.caption = IntToStr(sayac1);
    }
  }
  else
  {
    lblTimer.caption=IntToStr(sayac1);
    Dec(sayac1);
  }
}

 {
   sayac=0;
   
   sayac1=20;
   
   AnaForm = TclForm.Create(Self);
   
  Zaman= AnaForm.AddNewTimer(AnaForm,'Zaman',1000);
  Zaman.Enabled = True;
  AnaForm.AddNewEvent(Zaman,tbeOnTimer,'zamanlayici');
  
  
  Zaman2=AnaForm.AddNewTimer(AnaForm,'Zaman2',1000);
  Zaman2.Enabled=True;
  AnaForm.AddNewEvent(Zaman2,tbeOnTimer,'sure');
  
  lblTimer=AnaForm.AddNewLabel(AnaForm,'lblTimer','');
  lblTimer.StyledSettings = ssFamily;
  lblTimer.TextSettings.Font.Size = 35;
  lblTimer.Align = alTop;
  lblTimer.Height=50;
  lblTimer.Width=50;
  lblTimer.Margins.Left = 170;
 
   AnaForm.SetFormColor('#52504d','',clGNone); 
   btn1 = AnaForm.AddNewProButton(AnaForm,'btn1','SAYAC');
   btn1.Align = alCenter;
   btn1.Position.Y=0; // konum.
   btn1.Width = 100;
   btn1.Height = 100;
   btn1.clProSettings.BorderColor = clAlphaColor.clHexToColor('#a0a3b1');
   btn1.clProSettings.FontColor = clAlphaColor.clHexToColor('#050505');
   btn1.clProSettings.BackgroundColor = clAlphaColor.clHexToColor('#ffffff');
   btn1.clProSettings.IsTransparent = False;
   btn1.clProSettings.FontSize = 12;
   btn1.clProSettings.FontVertAlign = palcenter;//palLeading , palCenter , palTrailing
   btn1.clProSettings.FontHorzAlign = palCenter;
   btn1.clProSettings.IsFill = True; 
   btn1.clProSettings.IsRound = True;
   btn1.clProSettings.RoundHeight = 50;
   btn1.clProSettings.RoundWidth = 50;
   btn1.clProSettings.BorderWidth = 3;
   btn1.SetclProSettings(btn1.clProSettings);

   AnaForm.AddNewEvent(btn1,tbeOnClick,'zamanlayici');
   AnaForm.AddNewEvent(lblTimer,tbeOnClick,'sure');
   AnaForm.Run;
 
 }




Cevaplar:
Mesajı Yazan: BilalCndn
Mesaj Tarihi: 13 Mayıs 2024 Saat 09:59
Merhaba Emre,

Doküman sayfasından ( https://www.docs.clomosy.com/index.php/Random" rel="nofollow - https://www.docs.clomosy.com/index.php/Random ) random hakkında bilgi sahibi olabilirsin. Koda gelecek olursak öncelikle bir nesneye 'Align' özelliği verdiğin zaman o nesneyi sabitlemiş oluyorsun. Butonun da 'Align' özelliğine 'alCenter' ataması yaptığınızda butonu bulunduğu nesnenin merkezine sabitlemiş oluyorsunuz. Bu durum butonun pozisyonunu manuel olarak değiştirmenize engel oluyor. Pozisyonda değişiklik yapabilmek için 'Align' özelliğine 'alNone' ataması yapmalısınız. Artık butonu hareket ettirebildiğimize göre gelelim 'Random' konusuna. Clomosy'de 'Random' özelliği 0 ile 1 arasında rastgele bir sayı üretir. Yani siz 0 ile 100 arasında bir sayı üretmesini istiyorsanız 'Random' özelliğini 100 ile çarpmalısınız. Kodunda yaptığım düzenlemelerde formun boyutları ile çarptım. Bu durumda nesne form içerisinde rasgele bir konuma gelebilecek. Fakat nesnenin bir kısmının form dışına çıkma ihtimali var. Bu problemin çözümünü sana bıraktım ama çözemezsen sormaktan çekinme. Ayrıca nesnenin 'Align' özelliğini 'alNone' olarak belirlediğimiz için başlangıç pozisyonunu senin istediğin gibi ortalamak istedim. Bu kod da sana az önce bahsettiğim problemin çözümü için ipucu olmuş olacak.

Kodun düzenlenmiş hali:
Var
  AnaForm:TclForm;
  btn1 : TClProButton;
  Zaman : TCLTimer;
  sayac:Integer;
  
  Zaman2:TCLTimer;
  sayac1:Integer;
  lblTimer: TCLLabel;
  
void zamanlayici;
{
  if(sayac == sayac)
  {
  sayac = sayac + 1;
  Zaman.Enabled = False;
  btn1.Text = IntToStr(sayac);
  if(sayac == 25)
  {
  AnaForm.SetFormColor('#23c7c5','',clGNone);
  sayac1 = sayac1 + 3;
  btn1.Position.X = Random() * AnaForm.clWidth;
  btn1.Position.Y = Random() * AnaForm.clHeight;
  }
  }
  else
  {
  btn1.Text = IntToStr(sayac);
  sayac = sayac + 1;
  }
}

void sure;
{
  
  if(sayac1 == 0)
  {
    Zaman2.Enabled = False;
    lblTimer.caption = IntToStr(sayac1);
    ShowMessage('Süreniz Doldu!');
   
    if(btn1 == 2)
    {
    Zaman2.Enabled= False;
    lblTimer.caption = IntToStr(sayac1);
    }
  }
  else
  {
    lblTimer.caption=IntToStr(sayac1);
    Dec(sayac1);
  }
}

 {
   sayac=0;
   
   sayac1=20;
   
   AnaForm = TclForm.Create(Self);
   
  Zaman= AnaForm.AddNewTimer(AnaForm,'Zaman',1000);
  Zaman.Enabled = True;
  AnaForm.AddNewEvent(Zaman,tbeOnTimer,'zamanlayici');
  
  
  Zaman2=AnaForm.AddNewTimer(AnaForm,'Zaman2',1000);
  Zaman2.Enabled=True;
  AnaForm.AddNewEvent(Zaman2,tbeOnTimer,'sure');
  
  lblTimer=AnaForm.AddNewLabel(AnaForm,'lblTimer','');
  lblTimer.StyledSettings = ssFamily;
  lblTimer.TextSettings.Font.Size = 35;
  lblTimer.Align = alTop;
  lblTimer.Height=50;
  lblTimer.Width=50;
  lblTimer.Margins.Left = 170;
 
   AnaForm.SetFormColor('#52504d','',clGNone); 
   btn1 = AnaForm.AddNewProButton(AnaForm,'btn1','SAYAC');
   btn1.Align = alNone;
   btn1.Width = 100;
   btn1.Height = 100;
   btn1.Position.X = (AnaForm.clWidth / 2) - (btn1.Width / 2);
   btn1.Position.Y = (AnaForm.clHeight / 2) - (btn1.Width / 2); // konum.
   btn1.clProSettings.BorderColor = clAlphaColor.clHexToColor('#a0a3b1');
   btn1.clProSettings.FontColor = clAlphaColor.clHexToColor('#050505');
   btn1.clProSettings.BackgroundColor = clAlphaColor.clHexToColor('#ffffff');
   btn1.clProSettings.IsTransparent = False;
   btn1.clProSettings.FontSize = 12;
   btn1.clProSettings.FontVertAlign = palcenter;//palLeading , palCenter , palTrailing
   btn1.clProSettings.FontHorzAlign = palCenter;
   btn1.clProSettings.IsFill = True; 
   btn1.clProSettings.IsRound = True;
   btn1.clProSettings.RoundHeight = 50;
   btn1.clProSettings.RoundWidth = 50;
   btn1.clProSettings.BorderWidth = 3;
   btn1.SetclProSettings(btn1.clProSettings);

   AnaForm.AddNewEvent(btn1,tbeOnClick,'zamanlayici');
   AnaForm.AddNewEvent(lblTimer,tbeOnClick,'sure');
   AnaForm.Run;
 
 }

Sorunun çözüme ulaşıp ulaşmadığı ile ilgili geri dönüşünü bekliyorum.
İyi çalışmalar diliyorum.


-------------
Bilal Candan

Atiker Yazılım Veri İşlem A.Ş.
Software and Artificial Intelligence Development Specialist

[email protected]


Mesajı Yazan: emre.gungor01
Mesaj Tarihi: 13 Mayıs 2024 Saat 22:46
evet işime yaradı fakat taşma sorununu bulamadım.


Mesajı Yazan: BilalCndn
Mesaj Tarihi: 14 Mayıs 2024 Saat 09:59
Merhaba Emre,

Bu sorunu çözebilmemiz için öncelikle nesnelerin pozisyonlarının nasıl çalıştığını anlamalıyız.

Görselde gördüğün gibi bir formun sol üst köşesi (0x0) pozisyonunda oluyor. Sağ üst köşesi (formun genişliği x 0) sol alt köşesi (0 x formun yüksekliği) sağ alt köşesi ise (formun genişliği x formun yüksekliği) oluyor. Aynı durum görsel nesneler için de geçerli. Bu durumda dairenin konumunu sol üst köşesine göre alıyoruz. Şimdi taşma durumlarını inceleyelim.
 

Görselde gördüğün gibi nesnenin pozisyonu formun sınırları dahilinde olmasına rağmen nesne bir miktar formun dışında kalabiliyor. Şimdi senin kodun üzerinde bu duruma çözüm getirelim.

   btn1.Position.X = Abs((Random() * AnaForm.clWidth) - btn1.Width);
  btn1.Position.Y = Abs((Random() * AnaForm.clHeight) - btn1.Height);

Bu kodda form sınırları dahilinde olacak şekilde bir random sayı üretiyoruz.(Bu kısmı daha önce yapmıştık zaten)
Ürettiğimiz sayıdan nesnenin uzunluğunu çıkarıyoruz. Bu durum bizim için sağdan ve alttan taşmaları önlüyor. Fakat random sayı nesnenin uzunluğundan düşük bir sayı gelirse bu sefer pozisyon negatif olacağı için soldan ya da üstten taşmalar olacaktır. Bu durumu düzeltmek için de çıkan sayıyı 'Abs' fonksiyonu içerisine alıyoruz. 'Abs' fonksiyonu sayının mutlak değerini aldığı için negatif bir sayı çıkma ihtimali de ortadan kalkıyor. Bu şekilde nesnenin formun dışına taşmasını da engellemiş oluyoruz.

Sorunun çözüme ulaşıp ulaşmadığı ile ilgili geri dönüşünü bekliyorum.
İyi çalışmalar diliyorum.


-------------
Bilal Candan

Atiker Yazılım Veri İşlem A.Ş.
Software and Artificial Intelligence Development Specialist

[email protected]


Mesajı Yazan: emre.gungor01
Mesaj Tarihi: 14 Mayıs 2024 Saat 10:47
Teşekkür ederim sorunum çözüldü ve açıklamayı güzel yaptığınız için ayrı teşekkür ederim sade ve anlaşılır.


Mesajı Yazan: emre.gungor01
Mesaj Tarihi: 25 Mayıs 2024 Saat 12:52
Merhabalar;
Kod yazdım fakat çalışmıyor hatayı da tam çözemedim. Yardımcı olabilir misiniz?

Kodlar;

Var
  AnaForm:TclForm;  
  btn1 : TClProButton;
  Zaman : TCLTimer;
  sayac:Integer;
  
  RndmTimer: TClTimer;
  colorArray : array of String;
  
  oyunzaman:TCLTimer;
  sayac1:Integer;
  lblTimer: TCLLabel;
  
  testImg: TCLImage;  //random yerlerde belirli zamanda görsel çıkartıyor. //EKSURE İÇİN KULLANDIM.
  
  
void randomColor;
var
  randmDeger: Integer;
{
  colorArray = ['#26cf3a','#ff780a','#9a7de8','#813b3b','#a664c4','#6492c4','#81c464'];
  randmDeger =  clMath.GenerateRandom(0,6);
  AnaForm.SetFormColor(colorArray[randmDeger],'',clGNone);
}

/*
void randomPosition;   //Random Position değiştirmesi için oluşturuldu.
{
  btn1.Position.X = Abs((Random() * AnaForm.clWidth) - btn1.Width);
  btn1.Position.Y = Abs((Random() * AnaForm.clHeight) - btn1.Height);
}
*/

void eksure   //Ekranın ortasındaki sayı 25 veya büyük olunca çıkması için yapıldı.
{
  if(IntToStr(btn1.Text) > 25)
  {
  testImg.visible=False;
  sayac1 = sayac1+5;
  }
}

void zamanlayici;
{
  
    if (sayac >= 100)
    {
      RndmTimer.Enabled = True;
    }
    btn1.Text = IntToStr(sayac);
    
  
  
  sayac = sayac + 1;
  oyunzaman.Enabled=True;
  btn1.Text = IntToStr(sayac);
  
  
  if(sayac == 25)
  {
    AnaForm.SetFormColor('#23c7c5','',clGNone);
    sayac1 = sayac1 + 3;
    btn1.Position.X = Abs((Random() * AnaForm.clWidth) - btn1.Width);
    btn1.Position.Y = Abs((Random() * AnaForm.clHeight) - btn1.Height);
    testImg.Position.X = Abs((Random() * AnaForm.clWidth) - testImg.Width);
    testImg.Position.Y = Abs((Random() * AnaForm.clHeight) - testImg.Height);
    testImg.visible=True;
  }
  
  if(sayac == 72)
  {
    AnaForm.SetFormColor('#e01f1f','',clGNone);
    sayac1 = sayac1 + 5;
    btn1.Position.X = Abs((Random() * AnaForm.clWidth) - btn1.Width);
    btn1.Position.Y = Abs((Random() * AnaForm.clHeight) - btn1.Height);
    testImg.Position.X = Abs((Random() * AnaForm.clWidth) - testImg.Width);
    testImg.Position.Y = Abs((Random() * AnaForm.clHeight) - testImg.Height);
    testImg.visible=True;
  }
  
  if(sayac == 100)
  {
    AnaForm.SetFormColor('#cfeb00','#db7edd',clGHorizontal);
    sayac1 = sayac1 + 7;
    btn1.Position.X = Abs((Random() * AnaForm.clWidth) - btn1.Width);
    btn1.Position.Y = Abs((Random() * AnaForm.clHeight) - btn1.Height);
    testImg.Position.X = Abs((Random() * AnaForm.clWidth) - testImg.Width);
    testImg.Position.Y = Abs((Random() * AnaForm.clHeight) - testImg.Height);
    testImg.visible=True;
  }
  //1.
  if (sayac >= 127)
    {
      AnaForm.SetFormColor('#ffae00','',clGNone);
      randomPosition();
      RndmTimer.Enabled = False;
    }
    btn1.Text = IntToStr(sayac);
  //2.
   if (sayac == 134) 
    {
      RndmTimer.Enabled = True;
      randomPosition();
    }
    btn1.Text = IntToStr(sayac);
  //3.  
  /*         // random position için fonksiyon  
  if(sayac >= 137 && sayac <= 155)
  {
    randomPosition();
  }
  */
  //4.
    if (sayac >= 156)
    {
      AnaForm.SetFormColor('#16cce3','',clGNone);
      RndmTimer.Enabled = False;
    }
    btn1.Text = IntToStr(sayac);
}

Burada bulunan yorum satırları içerisine aldığım (/*  */) yerlerde void randomPosition; diye parametre atadım ve kod bloğunda ise if(sayac >= 137 && sayac <= 155)  bunu yazdım benim ortadaki sayacım sürekli 155'ten küçük olduğu içinde random olarak yer değiştiriyor, fakat ben sadece 137 sayısıyla 155 sayıları arasında random olarak yer değiştirmesini istiyorum kopyala yapıştır yaparak yer değiştirebilirdim fakat daha kolay olması ve yer kaplamaması adına void randomPosition; parametresini oluşturdum. Sizce nasıl yapabilirim?


Mesajı Yazan: Developer
Mesaj Tarihi: 27 Mayıs 2024 Saat 17:54
Merhaba Emre 
Aldığın hatanın resmini atar mısın 



Mesajı Yazan: emre.gungor01
Mesaj Tarihi: 28 Mayıs 2024 Saat 10:53
Kodlarımı öyle yapsam da çalışıyor yani hata almıyorum sadece istediğim sonucu alamadım. 

1.Kod;
/*
void randomPosition;   //Random Position değiştirmesi için oluşturuldu.
{
  btn1.Position.X = Abs((Random() * AnaForm.clWidth) - btn1.Width);
  btn1.Position.Y = Abs((Random() * AnaForm.clHeight) - btn1.Height);
}
*/

2.Kod;

/*         // random position için fonksiyon  
  if(sayac >= 137 && sayac <= 155)
  {
    randomPosition();
  }
  */

Ben bunu yazdığımda sayacımın içerisindeki sayı 155'ten küçük olduğu için sürekli yer değiştiriyor. Bastığımda 1 olduğunda 2 olduğunda 3 diye gidiyor ta ki bu 155'e kadar sürekli yer değiştiriyor fakat ben 137 sayısıyla 155 sayıları arasında random yer değiştirmesini istemiştim.



Sayfayı Yazdır | Pencereyi Kapat

Forum Software by Web Wiz Forums® version 12.07 - https://www.webwizforums.com
Copyright ©2001-2024 Web Wiz Ltd. - https://www.webwiz.net