Merhaba,
Hafta sonu, oynadığım ve bir süredir kafama takılan oyundaki sistemi kodlamaya başladım. Ancak kafamı toparlayabildiğim; şu ocak ayının son haftasının, ilk gününün, ilk saatlerinde bitirebildim...:)
'http://static.r2games.com/newsimg/wartune_g_wt_g_astro2.jpg'
Aşağıdaki kodda D'nin aralıkları dahil bir çok olanağını kullandım ve mutluyum! Muhtemelen oyunda daha farklı bir kodlama yapılmış olmalı. Zaten kader küresi değeri ve türü gibi kavramlara girmedim. Ama oyunu oynamamışlar için kısaca tarif edersek...
Öncelikle rasgele çıkan 1 + 4 küre var. Bunlardan en zor çıkanı ve de en değerli olanı sarı renkli küre. Zaman zaman şansızlık küreleri ile mücadele ederken, işimize yarayan mavi ve mor küreleri toplayıp sarı üzerine sürükleyerek birleştiriyoruz. Böylece sarının değeri artıyor. Aslında Şansızlık hariç tüm kürelerin bir değeri (EXP) ve de türü var. Ama yeşilleri satmak ve elde edilen altın ile şansı arttırmak kısmen mantıklı görünüyor. Çünkü seviye arttıkça her küreyi açma masrafı biner biner (başlangıç 4000 altın) artıyor!
İşte olasılıkları analiz etmeye yarayan ve rakamların ötesine geçen sistem aşağıda. Her şey enum'u yazmak ile başladı ve görünüşe göre çok güzel çalışıyor...:D
/*
* Kader Küresi v1 - 28 Ocak 2013
*
* Legend Online* oyununda yer alan ve
* karakter gelişimini sağlayan sistemden**
* esinlenilmiştir...
*
* (*): http://lotr.oasgames.com
* (**): http://wartune.wikia.com/wiki/Astral
*
* Yazan: salihdb@gmail.com
*/
import std.stdio,
std.random,
std.range : replicate;
enum Küreler : int { Şansızlık, Yeşil, Mavi, Mor, Sarı }
class Rulet (T) {
int[T] küreAdeti;
int adet, seviye = 1;
public:
this(uint adet) {
this.adet = adet;
temizleKüre();
}
bool empty() {
return !adet;
}
void popFront() {
adet--;
temizleKüre();
}
int[2] front() {
/* Herhangi bir kürenin, seviyeye göre değerini arttır */
int sayaç = seviye; // seviye arttıkça şans oranı artabilir!
do {
küreAdeti[rasgeleKüre(cast(T)seviye)]++;
} while(--sayaç);
/* Küreleri değerlendir ve en yüksek olanını seç */
int küre = seçKüre(küreAdeti);
/* Sonraki seviyeyi 0/1 şansına göre belirle */
scope(exit) {
int arttırayım_mı = uniform(0, int.max) % 2;
if(arttırayım_mı) { // seviye sınıra ulaşmadıysa arttır,
if(seviye < T.max) {
seviye++;
} else seviye = T.max;
} else seviye = 1; // veya başa dön...
}
return [ seviye, küre ];
}
private:
int seçKüre(int[T] olasılıklar) {
int sonuç;
with(Küreler) {
alias olasılıklar O;
if( !O[Şansızlık] ) {
if( O[Sarı] > O[Mor] ) sonuç = Sarı;
else if( O[Mor] > O[Mavi] ) sonuç = Mor;
else if( O[Mavi] > O[Yeşil] ) sonuç = Mavi;
else sonuç = Yeşil;
}
}
return sonuç;
}
T rasgeleKüre(T sınır = T.max) {
auto sayı = uniform(0, sınır + 1);
return cast(Küreler)sayı;
}
void temizleKüre() @safe {
auto xSay = Küreler.max;
do küreAdeti[xSay] = 0; while(xSay--);
}
}
void main () {
auto tıklamaAdeti = 10;
foreach(r; new Rulet!Küreler(tıklamaAdeti)) {
foreach(s; replicate("#", r[0])) s.write();
"\t: ".writeln(cast(Küreler)r[1]);
}
}/* Çıktısı:
[atelyeweb@sdb Belgeler]$ d.sh kaderküresi.d
# : Yeşil
# : Şansızlık
## : Mavi
# : Yeşil
# : Şansızlık
# : Yeşil
## : Şansızlık
### : Mavi
#### : Mor
#### : Sarı
*/
Dip Not: Oyun, ülkemizde ve Portekiz'de Legend Online olarak tanınıyor. Orijinal ismi Wartune ve konu olan kader küreleri hakkında şurada (http://lotr.oasgames.com/legend_online/?a=sq&m=content&id=97) Türkçe bilgi mevcut. İngilizcesi ise burada (http://wartune.r2games.com/guide/view?id=196) (DİKKAT: official site ama Google Plus'dan dolayı JS hatası var, en azından Firefox'da) ve şurada (http://blackrabbit2999.blogspot.com/2012/10/wartune-optimizing-your-astral-guide.html)...:)
Sevgiler, saygılar...
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]