Hesabına erişemeyen eski üyeler Discord üzerinden yardım alabilir.
Master
59.2997
merhaba,

geçen aylarda yazdığım bir fonksiyon vardı sayıları en yüksekten düşüğe doğru sıralayan. bu gün bir sistemde gereksinim duyduğumdan bunun alfabetik olanını kodlamak için işe koyuldum. kısa süre içerisinde şöyle bir kod oluştu ve gayet düzenli bir şekilde çalışıyor. sizlerle paylaşmak istedim.

öncelikle fonksiyonun scripti şu şekilde;

[FUNCTION arrangeStrings]  // 6 Temmuz 2010 - Slothere
IF <ARGV> > 0
  FOR 0 <EVAL <ARGV> -1>
    LOCAL.ARGV<dLOCAL._FOR>=<ARGV[<dLOCAL._FOR>]>
  ENDFOR
  FOR a 0 <EVAL <ARGV> -1>
    FOR b 0 <EVAL <ARGV> -1>
      LOCAL.1=<STRTOLOWER <STRSUB 0 1 <LOCAL.ARGV<dLOCAL.a>>
      LOCAL.2=<STRTOLOWER <STRSUB 0 1 <LOCAL.ARGV<dLOCAL.b>>
      IF STRCMP(<LOCAL.1>,<LOCAL.2>) == -1
        LOCAL.TEMP=<LOCAL.ARGV<dLOCAL.b>>
        LOCAL.ARGV<dLOCAL.b>=<LOCAL.ARGV<dLOCAL.a>>
        LOCAL.ARGV<dLOCAL.a>=<LOCAL.TEMP>
      ENDIF
    ENDFOR
  ENDFOR
  FOR 0 <EVAL <ARGV> -1>
    SYSMESSAGE <LOCAL.ARGV<dLOCAL._FOR>>
  ENDFOR
ENDIF

kullanım şeklini kendinize göre düzenlersiniz. şu anki sistemde kullanabilmeniz için;

.arrangestrings <param1>,<param2>,<param3>,...<paramxx>" 

şeklinde fonksiyonu kullanmanız yeterli olacaktır. örneklendirmek gerekirse;

.arrangestrings slothere,gokberk,ultima,scripting,arrange,string,esenyel

diye kullandığımızda dönen sonuç;


arrange
esenyel
gokberk
scripting
slothere
string
ultima

şeklinde olacaktır. İstediğiniz sayıda parametre kullanmanız mümkün.

teknik konularda bu başlık altından gerekli desteği alabilirsiniz, teşekkürler.
Eline emeğine sağlık güzel paylaşım.
eline sağlık
Marlock : Eline emeğine sağlık güzel paylaşım.
Master
59.2997
Merhaba,

Bu sabah aldığım bir özel mesaj aracılığı ile anlatımda bazı güncellemeler yapmak istiyorum. Yayınladığım kodu incelediğimde şu anki hali ile kodun kullanım alanının ne kadar dar olduğunu ve anlatımın da bu yüzden ne kadar yalın kaldığını fark ettim.

Kodun yapısına şu anda baktığımızda fonksiyon belirttiğimiz metinleri alıp sıralayıp bize bir mesaj olarak gösteriyor. Ancak bu fonksiyonun amacı bu kadar kısıtlı olmamalı. O yüzden kodun yapısında bazı değişiklikler yapmak ve bu değişiklikleri örnek kullanımlarla pekiştirmek istiyorum.

Fonksiyonun güncellenmiş hali aşağıda yer almaktadır;


[function arrangeStrings]
if <argv> > 0
  for 0 <eval <argv> -1>
    local.argv<dlocal._for>=<argv[<dlocal._for>]>
  endfor
  for a 0 <eval <argv> -1>
    for b 0 <eval <argv> -1>
      local.1=<strtolower <strsub 0 1 <local.argv<dlocal.a>>
      local.2=<strtolower <strsub 0 1 <local.argv<dlocal.b>>
      if strcmp(<local.1>,<local.2>) == -1
        local.temp=<local.argv<dlocal.b>>
        local.argv<dlocal.b>=<local.argv<dlocal.a>>
        local.argv<dlocal.a>=<local.temp>
      endif
    endfor
  endfor
  for 0 <eval <argv> -1>
    local.args=<local.args>,<local.argv<dlocal._for>>
  endfor
  return <strsub 0 <local.args>>
endif

Fonksiyonun bu yeni halinde, mesaj ile gösterme işlemi kaldırılıp, onun yerine sıralanmış metinleri bir dizi şeklinde (aa,bb,cc) sıralayıp bu sıralı diziyi geriye döndürmesi sağlandı.

Bundan sonra gösterme işlemi için yapmamız gerekenler oldukça basit ve yalın, anlaşılır kodlarla gerçekleşebilecek. En temel örneklendirme ile sıralı metinleri mesaj olarak şu şekilde gösterebiliriz;


[function goster]
args=<arrangeStrings gokberk,slothere,ultima,strike,arrange,string>
while (!<isempty <argv[<dlocal._while>]>>)
sysmessage <argv[<dlocal._while>]>
endwhile

Burada kullandığımız bazı işlemleri de sizlere anlatmak istiyorum.

args=<arrangeStrings gokberk,slothere,ultima,strike,arrange,string>

Burada fonksiyonumuza (arrangeStrings) alfabetik olarak sıralanmasını istediğimiz metinleri bir dizi halinde (virgülle ayırarak) gönderiyoruz. -Burada gönderilebilecek parametre sayısı, oyun içerisindeki yazı yazma bölümünün limiti ile eşdeğerdir. Yani yazabildiğimiz en uç yere kadar istediğiniz miktarda metni dizi şeklinde göndermeniz mümkündür.-

Daha sonra fonksiyonumuz bu girilen metinleri bir dizi işlem sonucunda alfabetik olarak sıralayıp tekrar gönderdiğimiz şekilde ancak bu sefer alfabetik olarak sıralanmış halde geriye gönderecektir.

Fonksiyonunu bu gönderdiği sıralı metni, &#8220;goster&#8221; adlı fonksiyonumuzun argümanına (args) atıyoruz. Atanan bu değerlere bundan sonra <argv[x]> şeklinde erişebiliriz. (argümanlar konusunda daha detaylı anlatım için: https://www.ultima-strike.com/dokuman/temel-string-tanimlamalari )

Daha sonra bunları ekranda göstermek için de basit bir while döngüsü aracılığıyla (siz for da kullanabilirsiniz, aynı işlem gerçekleşir) ekrana sırasıyla yazdırıyoruz.


while (!<isempty <argv[<dlocal._while>]>>)
sysmessage <argv[<dlocal._while>]>
endwhile

Diğer bir örnek olması amacıyla dialogdaki kullanımı da aşağıda yer almaktadır.


[dialog d_arrange]
0,0
resizepic 50 50 5054 100 250
args=<arrangeStrings gokberk,slothere,ultima,strike,arrange,string>
dorigin 75 60
while (!<isempty <argv[<dlocal._while>]>>)
dtext +0 *20 1000 <argv[<dlocal._while>]>
endwhile

Kodun en temel kullanım alanı bu şekildedir. Siz yaratıcılığınız ve kullanımlarınıza göre istediğiniz şekilde biçimlendirip o şekilde kullanabilirsiniz. Buradakiler yalnızca örnek teşkil eder. Buradaki kullanımlara bağlı kalmanız gerekmez.
@slothere

teşekkür ederiz.

Üye Ol veya Giriş Yap

Bu forum başlığına mesaj atmak istiyorsanız hemen üye olun veya giriş yapın.