के साथ कार्यात्मक रूप से चलता है मैं स्कैला का उपयोग करके लेखन रणनीति गेम को समझने की कोशिश कर रहा हूं, लेकिन दुर्भाग्यवश मुझे बहुत मूल बातें मिलती हैं। (यह घर का काम नहीं है, लेकिन कुछ नया, अर्थात् "शुद्ध" कार्यात्मक प्रोग्रामिंग जानने के लिए मेरे प्रयास।)जेनरेटिंग गेम स्काला
के निम्नलिखित सरल "खेल" लेते हैं: (एकमात्र) खिलाड़ी एक्स एक अंतहीन पंक्ति पर समान टुकड़े है वर्गों का टुकड़े वर्ग 0 पर शुरू होते हैं और प्रत्येक मोड़ वह एक टुकड़ा आगे एक वर्ग को स्थानांतरित कर सकता है।
डेटा संरचना के रूप में मैं List[Int]
का उपयोग करूंगा प्रत्येक आइटम एक टुकड़ा की स्थिति (वर्ग) था।
संभव चाल मैं के साथ आया था बनाने के लिए:
def moves(start: List[Int]) =
(0 until start.length).map({i => start.updated(i, start(i) + 1)});
val m1 = moves(List(0,0,0))
// m1 then contains Vector(List(1, 0, 0), List(0, 1, 0), List(0, 0, 1))
val m2 = moves(List(1,2,3))
// m1 then contains Vector(List(2, 2, 3), List(1, 3, 3), List(1, 2, 4))
क्या मुझे पसंद नहीं है सूचकांक पाश (0 until start.length)
का उपयोग है। यह मेरे लिए बहुत "कार्यात्मक" प्रतीत नहीं होता है। क्या यह करने का सही तरीका है या क्या कोई बेहतर तरीका है?
अब मेरी खेल उदाहरण में सभी टुकड़ों को समान है, इसलिए मामले m1
में सभी तीन संभावित चाल भी समान हैं और/एक कदम के रूप में घनीभूत किया जाना चाहिए सकता है। मैं moves
संशोधित, प्रत्येक चाल के आइटम सॉर्ट करने के लिए इतना है कि मैं अलग मदों की एक सूची प्राप्त कर सकते हैं:
def moves(start: List[Int]) =
(0 until start.length).map({i => start.updated(i, start(i) + 1).sorted}).distinct;
val m1 = moves(List(0,0,0))
// m1 then contains Vector(List(0, 0, 1))
val m2 = moves(List(1,2,3))
// m1 then contains Vector(List(2, 2, 3), List(1, 3, 3), List(1, 2, 4))
हालांकि इस sortable और मेरे "वास्तविक" आवेदन में होने की डेटा संरचना की आवश्यकता है, यह एक List[Int]
सबसे अधिक संभावना नहीं , लेकिन एक ट्यूपल या एक केस क्लास। मुझे लगता है कि मुझे एक distinct
विधि चाहिए, जो एक समानता को परिभाषित करता है जो समानता को परिभाषित करता है। मैं इसे कैसे कार्यान्वित करूं?
विधि चालों के वापसी प्रकार लिस्टिंग यह आसान को पढ़ने के लिए बनाता है। हां, मैं इसे एम 1 के लिए टिप्पणी से ले सकता हूं, लेकिन यह बहुत देर हो चुकी है ... – ziggystar