Selamlar, bir problemim var bunu sizinle paylaşmak istedim..
Bir sistem düşünün, bir dizin bahçemiz var ve bu bahçeleri bir kod bloğu içerisinde oyunculara satacağız. Detay; bahçe verilerini tutan bir enum var, ve bir array.. Bu array'de bahçenin posları yazıyor, yani ben tanıtıyorum, bir bahçeye sadece bir kişi sahip olabiliyor, yanii bahçe birisine satılınca, enum içerisinde duran bool değerim, true'ya dönüyor.
Örnek kodlar;
enum Bos_Bahce
{
Float: baPosX,
Float: baPosY,
Float: baPosZ,
bool: kullanim
};
new RandomBahceler[3][Bos_Bahce] =
{
{-1159.5569, -1113.5679, 128.2656},
{1550.1328, -28.8244, 21.3337},
{-391.1916, -1150.3652, 69.4478}
};
Buraya kadar bu şekilde, şimdi bir kod bloğu içerisinde satıldığını farz edelim.
cmd:bahcesat(playerid, params[])
{
koşullar sorgular vesayre...
for(new i = 0; i != sizeof(RandomBahceler); i++)
{
if(!RandomBahceler[i][kullanim])
{
RandomBahceler[i][kullanim] = true // artık diğer insanlar tarafından satın alınamaz..
diğer kod satıları vs..
return i;
}
else {
SendClientMessage(playerid, -1, "Şu an satılacak bir arsa yok.");
}
return -1;
}
Bu şekilde, şimdi denediğim zaman şu şekilde bir problem oluşuyor. bahcesat komutunu çağırdığımızı farz edelim, döngü girdi değeri false olan bir bahçeyi aldı ve aşağıda true'ya çevirdi. Evet, bu sadece bir bahçede olması gerekiyor, fakat array'da belirttiğim tüm bahçeler true'ya dönüyor, yani artık satılacak bir bahçe kalmamış oluyor.. Ve farklı bir kişiye satmaya çalışınca ya da farklı bir kişi bahçeyi almaya çalışınca else bloğu devreye giriyor.. Hatanın nerede olduğu konusunda yardımlarınızı bekliyorum. Kişisel fikrim, dönen değerlerde bir problem yapıyorum, return değerini ne olarak vermem gerekiyor? Bu konuda hata yapıyorum sanırım.. Yardımlarınız için çok teşekkür ederim, iyi günler..
Telefondan yazdım düzeltebilirsin..
Arrayı 3 yerine #define MAX_BAHCE 3 yap
stock BahceBosArrayID()
{
for (new i; i < MAX_BAHCE; i++) if (RandomBahceler[i][kullanim] == false)
{
return i;
}
return -1;
}
cmd:bahcesat(playerid, params[])
{
new id;
if ((id = BahceBosArrayID()) == -1) return hatamesajı
RandomBahceler[id][kullanim] = true;
return 1;
}
Alternatif :
cmd:bahcesat(playerid, params[])
{
for(new i = 0; i != sizeof(RandomBahceler); i++)
{
if(!RandomBahceler[i][kullanim])
{
RandomBahceler[i][kullanim] = true;
goto SON_DONGU;
}
else { SendClientMessage(playerid, -1, "Şu an satılacak bir arsa yok."); }
}
SON_DONGU:
return 1;
}
Alıntı yapılan: Murat Budak - 23 Mart 2022, 00:41:20Telefondan yazdım düzeltebilirsin..
Arrayı 3 yerine #define MAX_BAHCE 3 yap
stock BahceBosArrayID()
{
for (new i; i < MAX_BAHCE; i++) if (RandomBahceler[i][kullanim] == false)
{
return i;
}
return -1;
}
cmd:bahcesat(playerid, params[])
{
new id;
if ((id = BahceBosArrayID()) == -1) return hatamesajı
RandomBahceler[id][kullanim] = true;
return 1;
}
Minnettarım, eve geçince bir bakacağım..
Alıntı yapılan: ThePosition - 23 Mart 2022, 14:43:42Alternatif :
cmd:bahcesat(playerid, params[])
{
for(new i = 0; i != sizeof(RandomBahceler); i++)
{
if(!RandomBahceler[i][kullanim])
{
RandomBahceler[i][kullanim] = true;
goto SON_DONGU;
}
else { SendClientMessage(playerid, -1, "Şu an satılacak bir arsa yok."); }
}
SON_DONGU:
return 1;
}
for döngüsü içerisinde goto kullanmayı akıl edememek benim salaklığım oldu biraz sanırım.. çok teşekkürler.