Clomosy | Forum Ana Sayfa
Forum Anasayfa Forum Anasayfa > Genel Programlama > Genel İşlemler
  Aktif Konular Aktif Konular RSS - Random Yer Değiştirme
  SSS SSS  Forumu Ara   Etkinlikler   Kayıt Ol Kayıt Ol  Giriş Giriş

Clomosy Resmi Forum Sitesidir. Amacımız kullanıcılarımıza, iş ortaklarımıza, danışmanlara, yazılımcılara programlarımız hakkında destek ve bilgi vermektir.

Random Yer Değiştirme

 Yanıt Yaz Yanıt Yaz
Yazar
Mesaj
  Konu Arama Konu Arama  Topic Seçenekleri Topic Seçenekleri
emre.gungor01 Açılır Kutu İzle
Deneyimli Üye
Deneyimli Üye


Kayıt Tarihi: 03 Mayıs 2024
Konum: Konya
Durum: Aktif Değil
Puanlar: 46
Mesaj Seçenekleri Mesaj Seçenekleri   Teşekkürler (0) Teşekkürler(0)   Alıntı emre.gungor01 Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Konu: Random Yer Değiştirme
    Gönderim Zamanı: 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;
 
 }

Yukarı Dön
BilalCndn Açılır Kutu İzle
Forum Yöneticisi
Forum Yöneticisi
Simge

Kayıt Tarihi: 09 Ekim 2023
Durum: Aktif Değil
Puanlar: 150
Mesaj Seçenekleri Mesaj Seçenekleri   Teşekkürler (0) Teşekkürler(0)   Alıntı BilalCndn Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Gönderim Zamanı: 13 Mayıs 2024 Saat 09:59
Merhaba Emre,

Doküman sayfasından (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 Developer

[email protected]
Yukarı Dön
emre.gungor01 Açılır Kutu İzle
Deneyimli Üye
Deneyimli Üye


Kayıt Tarihi: 03 Mayıs 2024
Konum: Konya
Durum: Aktif Değil
Puanlar: 46
Mesaj Seçenekleri Mesaj Seçenekleri   Teşekkürler (0) Teşekkürler(0)   Alıntı emre.gungor01 Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Gönderim Zamanı: 13 Mayıs 2024 Saat 22:46
evet işime yaradı fakat taşma sorununu bulamadım.
Yukarı Dön
BilalCndn Açılır Kutu İzle
Forum Yöneticisi
Forum Yöneticisi
Simge

Kayıt Tarihi: 09 Ekim 2023
Durum: Aktif Değil
Puanlar: 150
Mesaj Seçenekleri Mesaj Seçenekleri   Teşekkürler (1) Teşekkürler(1)   Alıntı BilalCndn Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Gönderim Zamanı: 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 Developer

[email protected]
Yukarı Dön
emre.gungor01 Açılır Kutu İzle
Deneyimli Üye
Deneyimli Üye


Kayıt Tarihi: 03 Mayıs 2024
Konum: Konya
Durum: Aktif Değil
Puanlar: 46
Mesaj Seçenekleri Mesaj Seçenekleri   Teşekkürler (0) Teşekkürler(0)   Alıntı emre.gungor01 Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Gönderim Zamanı: 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.
Yukarı Dön
emre.gungor01 Açılır Kutu İzle
Deneyimli Üye
Deneyimli Üye


Kayıt Tarihi: 03 Mayıs 2024
Konum: Konya
Durum: Aktif Değil
Puanlar: 46
Mesaj Seçenekleri Mesaj Seçenekleri   Teşekkürler (0) Teşekkürler(0)   Alıntı emre.gungor01 Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Gönderim Zamanı: 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?
Yukarı Dön
Developer Açılır Kutu İzle
Forum Yöneticisi
Forum Yöneticisi


Kayıt Tarihi: 14 Haziran 2023
Durum: Aktif Değil
Puanlar: 354
Mesaj Seçenekleri Mesaj Seçenekleri   Teşekkürler (0) Teşekkürler(0)   Alıntı Developer Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Gönderim Zamanı: 27 Mayıs 2024 Saat 17:54
Merhaba Emre 
Aldığın hatanın resmini atar mısın 

Yukarı Dön
emre.gungor01 Açılır Kutu İzle
Deneyimli Üye
Deneyimli Üye


Kayıt Tarihi: 03 Mayıs 2024
Konum: Konya
Durum: Aktif Değil
Puanlar: 46
Mesaj Seçenekleri Mesaj Seçenekleri   Teşekkürler (0) Teşekkürler(0)   Alıntı emre.gungor01 Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Gönderim Zamanı: 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.
Yukarı Dön
 Yanıt Yaz Yanıt Yaz

Forum Atla Forum İzinleri Açılır Kutu İzle

Forum Software by Web Wiz Forums® version 12.07
Copyright ©2001-2024 Web Wiz Ltd.

Bu Sayfa 0,035 Saniyede Yüklendi.