GTAMulti.com - Türkiye'nin Türkçe GTA Sitesi

For döngüsü.

Başlatan lastmuchanos, 15 Şubat 2022, 22:10:36

« önceki - sonraki »

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

lastmuchanos

Selamlar, sorum biraz komplike bir soru. Biraz yeniyim ve Pawn dilinde kendimi geliştirmeye çalışıyorum. Soruma gelecek olursak;

for(new i; i < sizeof(GuvenliBolge); ++i)
{
    GuvenliBolge[i][Rectangle] = CreateDynamicRectangle(GuvenliBolge[i][minX], GuvenliBolge[i][minY], GuvenliBolge[i][maxX], GuvenliBolge[i][maxY], 0, 0);
    GuvenliBolge[i][Zone] = GangZoneCreate(GuvenliBolge[i][minX], GuvenliBolge[i][minY], GuvenliBolge[i][maxX], GuvenliBolge[i][maxY]);
}

burada bir for döngüsü kullanıldığını görüyoruz. Bu for döngüsünün amacı nedir? Yani, anlayamadığım nokta, safe zone oluşturmak için neden bir for döngüsüne ihtiyaç duyuyoruz? Takıldığım tek nokta bu, aynı şekilde bir örnek daha göstermek istiyorum.

CMD:tamirkiti(playerid)
{
if (PlayerData[playerid][pEsyalar][10] <= 0)
    return HataMesajGonder(playerid, "Hiç tamir kitiniz yok.");

if (IsPlayerInAnyVehicle(playerid))
    return HataMesajGonder(playerid, "Aracın içinde tamir edemezsin.");

if (GetPVarInt(playerid, "TamirEdiyor") == 1)
    return HataMesajGonder(playerid, "Zaten tamir ediyorsun!");

for (new i = 1; i != MAX_VEHICLES; i ++)
{
    if (!IsEngineVehicle(i))
        return HataMesajGonder(playerid, "Bu aracı tamir edemezsin.");

    if (!GetHoodStatus(i))
        return HataMesajGonder(playerid, "Tamir etmek için aracın kaputu açık olmalı.");

PlayerData[playerid][pEsyalar][10]--;
ApplyAnimation(playerid, "BD_FIRE", "wash_up", 4.1, 0, 0, 0, 0, 0, 1);
ApplyAnimation(playerid, "BD_FIRE", "wash_up", 4.1, 0, 0, 0, 0, 0, 1);

        SetPVarInt(playerid, "TamirEdiyor", 1);
        SetTimerEx("RepairCar", 20000, false, "dd", playerid, i);

        SendNearbyMessage(playerid, 30.0, COLOR_CYAN, "** %s aracı tamir etmeye başlar.", ReturnName(playerid, 0));
GameTextForPlayer(playerid, "~n~~n~~n~~n~~n~~n~~n~~n~~n~~n~~g~Tamir ediliyor...~w~ Bekleyiniz...", 5500, 3);
return 1;
}
HataMesajGonder(playerid, "Aracın kaputuna yakın değilsin.");
return 1;
}

Bu daha iyi bir örneklendirme olacaktır, baktığımızda belirli koşullar sağlandıktan sonra for döngüsü oluşturulduğunu görüyoruz, neden? Burada doğrudan aracı tamir etmek için gerekli olan kod satırlarını yazsak ne olur? Ne kayıp ederiz? Şimdiden cevaplayan herkese çok teşekkür ediyorum, güzel günler!


Hasan Sangrento

En üstteki for döngüsü bütün güvenli bölgeleri kapsamak için for döngüsüne alıyor, böylece onlara rectangle zone oluşturuyor. En alttaki ise yakınında araç olup olmadığını kontrol ediyor.

https://www.techotopia.com/index.php/Objective-C_Looping_-_The_for_Statement


lastmuchanos

Alıntı yapılan: Hasan Sangrento - 15 Şubat 2022, 22:57:32
En üstteki for döngüsü bütün güvenli bölgeleri kapsamak için for döngüsüne alıyor, böylece onlara rectangle zone oluşturuyor. En alttaki ise yakınında araç olup olmadığını kontrol ediyor.

https://www.techotopia.com/index.php/Objective-C_Looping_-_The_for_Statement

Üsttekinin mantığı anladım, fakat alttaki hala oturmadı. Biraz daha detaylandırabilir misin? For döngüsü ile nasıl yanında araç olmadığını kontrol ediyor? Oraya baktığımda anladığım şey şu; döngü i'nin 1 aldığı değerden başlıyor ve MAX_VEHİCLE'a eşit olmadığı değere kadar devam ediyor.
"for (new i = 1; i != MAX_VEHICLES; i ++)" bu kısımdan bahsediyorum.


Hasan Sangrento

Bütün vehicleID'leri check ettiğinden ötürü @lastmuchanos ^^


lastmuchanos

Alıntı yapılan: Hasan Sangrento - 15 Şubat 2022, 23:55:29
Bütün vehicleID'leri check ettiğinden ötürü @lastmuchanos ^^
İlgin için çok teşekkür ederim, programlama dilleri içerisinden en çok kafayı yiyip üzerinde düşündüğüm konu bu, sayende biraz daha oturttum kafamda, bir de bulmuşken daha basit bir örnek atmak istiyorum;
public OnPlayerConnect(playerid)
{
    for(new all = 0; all < MAX_PLAYERS; all++)
    {
        if(IsPlayerAdmin(all))
        {
            new playername[MAX_PLAYER_NAME], string[84];
            GetPlayerName(playerid, playername, sizeof(playername));
            format(string, sizeof(string), "*Player [%i] %s has connected to the server!", playerid, playername);
            SendClientMessage(all, 0xFF0000FF, string);
        }
    }
    return 1;
}

Burada şöyle bir kod var, bir oyuncu oyuna bağlanınca server içerisinde admin propu olan kullanıcılara bir mesaj yolluyor, şu kişi oyuna bağlandı. Burada da yine bir for loop var, yine aynı şekilde sıfırdan başlıyor ve maxplayer'a kadar bir bir artarak devam ediyor, burada amaç nedir? Yani neden yine bir for döngüsü söz konusu?
Son düzenlenme: 16 Şubat 2022, 00:31:24 lastmuchanos

Rodeiun

0 dan başlamasının sebebi samptaki oyuncu idleri 0 dan başlar. Şöyle anlatayım, 10 kişiyi yan yana diz. Baştan sona sayım yapıyosun admin olanları bi adım öne alıyosun mesajı verip geri yolluyosun ve bir arttırıyorsun çünki bi sonrakine geçmesi lazım. Bu kodu şöylede açabiliriz istersen:

PAWN Kodu: Seç
public OnPlayerConnect(playerid)
{
        if(IsPlayerAdmin(0))
        {
            new playername[MAX_PLAYER_NAME], string[84];
            GetPlayerName(playerid, playername, sizeof(playername));
            format(string, sizeof(string), "*Player [%i] %s has connected to the server!", playerid, playername);
            SendClientMessage(0, 0xFF0000FF, string);
        }
if(IsPlayerAdmin(1))
        {
            new playername[MAX_PLAYER_NAME], string[84];
            GetPlayerName(playerid, playername, sizeof(playername));
            format(string, sizeof(string), "*Player [%i] %s has connected to the server!", playerid, playername);
            SendClientMessage(1, 0xFF0000FF, string);
        }
if(IsPlayerAdmin(2))
        {
            new playername[MAX_PLAYER_NAME], string[84];
            GetPlayerName(playerid, playername, sizeof(playername));
            format(string, sizeof(string), "*Player [%i] %s has connected to the server!", playerid, playername);
            SendClientMessage(2, 0xFF0000FF, string);
        }
if(IsPlayerAdmin(3))
        {
            new playername[MAX_PLAYER_NAME], string[84];
            GetPlayerName(playerid, playername, sizeof(playername));
            format(string, sizeof(string), "*Player [%i] %s has connected to the server!", playerid, playername);
            SendClientMessage(3, 0xFF0000FF, string);
        }
.
.
.
    return 1;
}

Tek tek her idyi yazıpda gönderebilirsin for döngüsü bunu kolaylaştırır.


squarepants

Atmış olduğunuz 2.döngü amacından tamamen olmasa da bir miktar sapmış görünüyor. Komut kullanıma sunulmadan önce kaput durumu açık olan bir diğer araç olur ise, asıl tamir işleminin gerçekleşeceği araç yerine işlem diğer araç için gerçekleşecektir. Bu nedenle bu komutu tam anlamıyla düzgün kullanabilmek için IsPlayerInRangeOfPoint(); veya benzeri bir fonksiyon ile kontrol sağlamak çok daha verimli olacaktır. Yani göndermiş olduğun 2. örneğe kafanı fazla takma, 1. örnekte ise art arda işlenmesi gereken verilerin tek bir seferde işlenebilmesi için kullanıldığı bir durumdur. For döngüsü isminden de anlayabileceğin üzere bir döngü kurmaya dayalıdır. Çoklu işlemleri yerine getirmek için kullanılan hızlı ama bazen de performanssız olarak nitelendirilebilir. Bunun nedeni istenilen durum yerine tüm durumu kontrol etmesidir ve bu nedenle sunucu fazladan zaman kaybına uğrayacaktır. Bu durumun önüne geçebilmek için Foreach eklentisini kullanabilirsiniz, kullanım hakkında detaylı bilgileri aşağıda bulabilirsiniz :
https://github.com/karimcambridge/samp-foreach/blob/master/foreach.inc


lastmuchanos

Alıntı yapılan: AloneWarrioR - 16 Şubat 2022, 07:19:17
0 dan başlamasının sebebi samptaki oyuncu idleri 0 dan başlar. Şöyle anlatayım, 10 kişiyi yan yana diz. Baştan sona sayım yapıyosun admin olanları bi adım öne alıyosun mesajı verip geri yolluyosun ve bir arttırıyorsun çünki bi sonrakine geçmesi lazım. Bu kodu şöylede açabiliriz istersen:

PAWN Kodu: Seç
public OnPlayerConnect(playerid)
{
        if(IsPlayerAdmin(0))
        {
            new playername[MAX_PLAYER_NAME], string[84];
            GetPlayerName(playerid, playername, sizeof(playername));
            format(string, sizeof(string), "*Player [%i] %s has connected to the server!", playerid, playername);
            SendClientMessage(0, 0xFF0000FF, string);
        }
if(IsPlayerAdmin(1))
        {
            new playername[MAX_PLAYER_NAME], string[84];
            GetPlayerName(playerid, playername, sizeof(playername));
            format(string, sizeof(string), "*Player [%i] %s has connected to the server!", playerid, playername);
            SendClientMessage(1, 0xFF0000FF, string);
        }
if(IsPlayerAdmin(2))
        {
            new playername[MAX_PLAYER_NAME], string[84];
            GetPlayerName(playerid, playername, sizeof(playername));
            format(string, sizeof(string), "*Player [%i] %s has connected to the server!", playerid, playername);
            SendClientMessage(2, 0xFF0000FF, string);
        }
if(IsPlayerAdmin(3))
        {
            new playername[MAX_PLAYER_NAME], string[84];
            GetPlayerName(playerid, playername, sizeof(playername));
            format(string, sizeof(string), "*Player [%i] %s has connected to the server!", playerid, playername);
            SendClientMessage(3, 0xFF0000FF, string);
        }
.
.
.
    return 1;
}

Tek tek her idyi yazıpda gönderebilirsin for döngüsü bunu kolaylaştırır.

Alıntı yapılan: ThePosition - 16 Şubat 2022, 12:52:17
Atmış olduğunuz 2.döngü amacından tamamen olmasa da bir miktar sapmış görünüyor. Komut kullanıma sunulmadan önce kaput durumu açık olan bir diğer araç olur ise, asıl tamir işleminin gerçekleşeceği araç yerine işlem diğer araç için gerçekleşecektir. Bu nedenle bu komutu tam anlamıyla düzgün kullanabilmek için IsPlayerInRangeOfPoint(); veya benzeri bir fonksiyon ile kontrol sağlamak çok daha verimli olacaktır. Yani göndermiş olduğun 2. örneğe kafanı fazla takma, 1. örnekte ise art arda işlenmesi gereken verilerin tek bir seferde işlenebilmesi için kullanıldığı bir durumdur. For döngüsü isminden de anlayabileceğin üzere bir döngü kurmaya dayalıdır. Çoklu işlemleri yerine getirmek için kullanılan hızlı ama bazen de performanssız olarak nitelendirilebilir. Bunun nedeni istenilen durum yerine tüm durumu kontrol etmesidir ve bu nedenle sunucu fazladan zaman kaybına uğrayacaktır. Bu durumun önüne geçebilmek için Foreach eklentisini kullanabilirsiniz, kullanım hakkında detaylı bilgileri aşağıda bulabilirsiniz :
https://github.com/karimcambridge/samp-foreach/blob/master/foreach.inc

Yanıtlayan herkese çok çok teşekkür ederim, sayenizde kafamda oluşan soru işaretlerini çoğunlukla törpüledim. Ufak bir detay daha var, aslında basit bir konu ve sanıyorum ki biliyorum fakat yine de pekiştirmek açısından sizlerin fikirlerini almak isterim.
public OnPlayerConnect(playerid)
{
    for(new all = 0; all < MAX_PLAYERS; all++)
    {
        if(IsPlayerAdmin(all))
        {
            new playername[MAX_PLAYER_NAME], string[84];
            GetPlayerName(playerid, playername, sizeof(playername));
            format(string, sizeof(string), "*Player [%i] %s has connected to the server!", playerid, playername);
            SendClientMessage(all, 0xFF0000FF, string);
        }
    }
    return 1;
}

For döngüsü okey, for döngüsünde all değişkeni burada kullanıcıların yerini tutuyor. Kullanıcıları tek tek çağırıp gerekli kontrolü sağlıyoruz. Bunlar okay, fakat ilginç bir detayda takıldım. Biraz aptalca olabilir fakat, burada ki all değişkeni nasıl kullanıcı idlerin yerini tutuyor? Sonuçta herhangi bir değişken tanımlamadık ya da bununla alakalı bir func okutmadık. Biraz aptal bir program, ""new all = 0; all < MAX_PLAYERS; all++"" nasıl oluyor burada ki 0 sayısının bir id'e karşılık geldiğini anlayabiliyor? Nerede garip bir soru orada ben.


squarepants

@lastmuchanos aslında satır içerisinde bir değişken tanımlanıyor, dikkatli incelediğiniz zaman new all adında integer veri tipine sahip bir değişken tanımlı. Bu tip koşullu döngüllerin yapısı aşağıdaki gibidir :
for (başlangıç değeri; koşul; yineleyici)
{
    //Kod Bloğu
}
Başlangıç değeri - Döngünün başlayacağı değer.
Koşul - Döngüye girilebilmesi için sağlanması gereken koşul
Yineleyici (Artış Miktarı) - Belirtilen değerin artış miktarı, Her tur için aritmetik olarak artar.


R4IN

Alıntı yapılan: ThePosition - 16 Şubat 2022, 16:45:00
@lastmuchanos aslında satır içerisinde bir değişken tanımlanıyor, dikkatli incelediğiniz zaman new all adında integer veri tipine sahip bir değişken tanımlı. Bu tip koşullu döngüllerin yapısı aşağıdaki gibidir :
for (başlangıç değeri; koşul; yineleyici)
{
    //Kod Bloğu
}
Başlangıç değeri - Döngünün başlayacağı değer.
Koşul - Döngüye girilebilmesi için sağlanması gereken koşul
Yineleyici (Artış Miktarı) - Belirtilen değerin artış miktarı, Her tur için aritmetik olarak artar.

Artı olarak örnek bir kod aşağıda ;


PAWN Kodu: Seç
main ()
{
for(new i = 0; i < 10; i++)
{
printf("i degerleri: %d", i); // 0 ile 10 arasi sayacaktir
}
}

iyi forumlar  :helal:


mojo

Bu çok temel bir soru, her dilin giriş seviyesinde öğretilen bir şey aslında döngüler zaten. Bunu burada bir yorumla anlatmak bu yüzden bence mantıksız çünkü bunu öğrenmek istiyorsanız bunun hakkında zibilyon tane video var. Sizi yargılamıyorum, yanlış anlamayın.

Döngüler genel olarak bir kod bloğunu defalarca çalıştırmamızı sağlar. Bu tanımlamayı okuduktan sonra öğrenmiş veya kullanabilir durumda olmuyorsunuz, ilk paragrafta bundan bahsetmek istemiştim aslında.

Örneğin bir ev sistemi yazdınız ve oyun modunu çalıştırdığımız zaman tüm evleri yüklemesi için bir işlem yapmamız gerekiyor değil mi? Evleri tek tek mi ekleyeceğiz, hayır. Aşağıdaki gibi bir döngü oluşturup yapacağız. Gerçi burada MySQL eklentisini kullacaksak for yerine while döngüsünü tercih etmemiz daha mantıklı olabilirdi. Genel olarak kod bloğumuzun dışındaki verilerle işlem yapacaksak while döngüsü tercih edilir (for kullanabilirsiniz, ben genelden bahsediyorum).

https://tr.wikipedia.org/wiki/For_döngüsü
https://www.youtube.com/watch?v=1lkIv5rQ6s8

PAWN Kodu: Seç
for(new i = 0; i < sorgu; i++)
{
    EvYukle(i); // sallıyorum yani mesela :)
}

Alıntı yapılan: R4IN - 28 Şubat 2022, 01:19:39
Artı olarak örnek bir kod aşağıda ;


PAWN Kodu: Seç
main ()
{
for(new i = 0; i < 10; i++)
{
printf("i degerleri: %d", i); // 0 ile 10 arasi sayacaktir
}
}

iyi forumlar  :helal:
0 ile 10 arasını sayacaktır biraz yanlış olmuş. 0'dan 9'a kadar sayacak, 10 dahil değil.
Son düzenlenme: 28 Şubat 2022, 01:47:47 kaufman

R4IN

Alıntı yapılan: kaufman - 28 Şubat 2022, 01:46:14
Bu çok temel bir soru, her dilin giriş seviyesinde öğretilen bir şey aslında döngüler zaten. Bunu burada bir yorumla anlatmak bu yüzden bence mantıksız çünkü bunu öğrenmek istiyorsanız bunun hakkında zibilyon tane video var. Sizi yargılamıyorum, yanlış anlamayın.

Döngüler genel olarak bir kod bloğunu defalarca çalıştırmamızı sağlar. Bu tanımlamayı okuduktan sonra öğrenmiş veya kullanabilir durumda olmuyorsunuz, ilk paragrafta bundan bahsetmek istemiştim aslında.

Örneğin bir ev sistemi yazdınız ve oyun modunu çalıştırdığımız zaman tüm evleri yüklemesi için bir işlem yapmamız gerekiyor değil mi? Evleri tek tek mi ekleyeceğiz, hayır. Aşağıdaki gibi bir döngü oluşturup yapacağız. Gerçi burada MySQL eklentisini kullacaksak for yerine while döngüsünü tercih etmemiz daha mantıklı olabilirdi. Genel olarak kod bloğumuzun dışındaki verilerle işlem yapacaksak while döngüsü tercih edilir (for kullanabilirsiniz, ben genelden bahsediyorum).

https://tr.wikipedia.org/wiki/For_döngüsü
https://www.youtube.com/watch?v=1lkIv5rQ6s8

PAWN Kodu: Seç
for(new i = 0; i < sorgu; i++)
{
    EvYukle(i); // sallıyorum yani mesela :)
}

Alıntı yapılan: R4IN - 28 Şubat 2022, 01:19:39
Artı olarak örnek bir kod aşağıda ;


PAWN Kodu: Seç
main ()
{
for(new i = 0; i < 10; i++)
{
printf("i degerleri: %d", i); // 0 ile 10 arasi sayacaktir
}
}

iyi forumlar  :helal:
0 ile 10 arasını sayacaktır biraz yanlış olmuş. 0'dan 9'a kadar sayacak, 10 dahil değil.

Dalgınlık farketmemişim küçük eşittir gibi konulara