Bu çoğunlukla FP hakkında teorik bir sorudur, ama benim açımdan göstermek için metin maceraları (eski okul Zork gibi) alacağım. FP ile durumsal bir simülasyonu nasıl modelleyeceğiniz hakkındaki görüşlerinizi bilmek istiyorum.
Metin maceraları gerçekten OOP gerektiriyor gibi görünüyor. Örneğin, tüm "odalar" bir Room
sınıfın örnekleridir , taşıyabileceğiniz şeyler Item
gibi temel bir sınıfa ve arayüzlere sahip Item<Pickable>
olabilirsiniz.
FP'de dünya modellemesi farklı çalışır, özellikle oyun ilerledikçe değişmesi gereken bir dünyada değişmezliği zorlamak istiyorsanız (nesneler taşınır, düşmanlar yenilir, puanlama büyür, oyuncu yerini değiştirir). Her World
şeye sahip tek bir büyük nesne hayal ediyorum : keşfedebileceğiniz odalar, nasıl bağlantılı oldukları, oyuncunun ne taşıdığı, hangi kolların tetiklendiği.
Ben saf bir yaklaşım temelde bu büyük nesneyi herhangi bir fonksiyona geçmek ve onlar tarafından döndürmek (muhtemelen değiştirilmiş) olacağını düşünüyorum. Örneğin, ben moveToRoom
alır World
ve World.player.location
yeni odaya değiştirildi ile döndüren bir işlevi var , World.rooms[new_room].visited = True
vb.
Bu daha "doğru" yol olsa bile, bunun uğruna saflığı güçlendiriyor gibi görünüyor. Programlama diline bağlı olarak, bu potansiyel olarak çok büyük World
nesneyi ileri geri taşımak pahalı olabilir. Ayrıca, her işlevin herhangi bir World
nesneye erişimi olması gerekebilir . Örneğin, bir odaya su basmış olabileceği için başka bir odada tetiklenen bir kola bağlı olarak erişilebilir veya olmayabilir, ancak oyuncu can yeleği taşıyorsa, yine de girebilir. Bir canavar saldırgan olabilir veya oyuncunun kuzenini başka bir odada öldürüp öldürmediğine bağlı olabilir. O Bu araçlar roomCanBeEntered
işlev erişmesi gereken World.player.invetory
ve World.rooms
, describeMonster
erişim ihtiyaçları World.monsters
ve böylece temelde, siz (on gerekirtüm yükü çevirin). Bu, özellikle FP'de iyi bir programlama tarzı dışında olsa bile, küresel bir değişken çağırmak için bana gerçekten benziyor.
Bu sorunu nasıl çözersiniz?