संपादित करें बाउंटी मेरे अनुवर्ती प्रश्न पुनः के बारे में है: कोड का सामान्य संस्करण। इस सूत्र, धन्यवाद में मेरे पिछले पोस्ट, जदथोड़ा सा सहायता इस पथ-खोज कोड को एफ-शार्पिंग करें, कृपया
हाय सब,
के अनुसार मैं सिर्फ एफ # में मेरी सी # 2 डी पथ खोजने कोड के कुछ पोर्टिंग की कोशिश की है। लेकिन मैं वर्तमान में सी # ओओ डेवलपर होने के 'लिम्बो' में हूं और शायद, मेरे एफ # के साथ पूरी तरह से कार्यात्मक होने के लिए बहुत कठिन प्रयास कर रहा हूं।
तो कोड का यह टुकड़ा लेना, शायद अब तक कम से कम छोटा एफ # मैंने लिखा है, मुझे इसे एफ # कोड का एक अच्छा टुकड़ा बनाने पर कुछ सलाह चाहिए। (क्षमा करें अगर यह थोड़ा है "मेरे लिए मेरा होमवर्क करें", लेकिन मुझे संदर्भ के लिए F # ए * पथ-खोज का अच्छा नमूना नहीं मिल रहा है।)।
एक बात जो तुरंत दिमाग में फैलती है वह है: क्या मेरा अत्यधिक उपयोग अगर/else/elseif "कार्यात्मक" पर्याप्त है?
कुछ नोट:
1) "निकालें" एक सरल उपयोगिता समारोह है कि एक सूची
2) "nodeToPathNode" बस एक बिंदु अंतरिक्ष में ले जाता है से तत्व निकाल देता है और एक पथ नोड बाहर बनाता है इसके बारे में
संपादित करें ((* ठेठ एक के अनुसार) एक माता पिता के संदर्भ, और एक ज, छ & च जोड़ने) (# 1): मैं (बिना दिए गए सुझावों के साथ कोड को नवीनीकृत किया है इसे सामान्य बनाने के बारे में, मैं उस पर बाद में प्राप्त करूंगा) ... बस कुछ लोग Google के माध्यम से यहां आते हैं और मेरे कोड को खराब स्वरूपण और तर्क त्रुटियों के साथ कॉपी करना चाहते थे।
एक पूर्ण, 2 डी टाइल विशिष्ट, कार्यान्वयन यहां पाया जा सकता: http://jdoig.net/blog/?p=81
संपादित करें (# 2) या जेनेरिक वर्जन यहां पाया जा सकता: http://jdoig.net/blog/?p=127
let rec pathFind (area:Map) goal start (openNodes:PathingNode list) (closedNodes:PathingNode list) =
let pointToPathNode = pointToPathNode openNodes.Head goal //localy specific version of nTPN
let rec checkNeighbours neighbours openNodeAcc= //Loop over list of neighbours accumalating a list of open nodes
match neighbours with
|[] -> openNodeAcc //When list of neighbours is exhausted return the open nodes.
|hd::tl ->
let checkNeighbours = checkNeighbours tl //localy specific version of cn
let node = {hd with parent = Some(openNodes.Head)}
if (List.exists (isShorter hd) openNodeAcc) then //if a higher costingnode is in open...
let shorterPath = remove openNodeAcc (nodePointEquals hd.point) //... remove it..
checkNeighbours (node::shorterPath)
elif not(List.exists (nodePointEquals hd.point) closedNodes) && not (List.exists (nodePointEquals hd.point) openNodeAcc) then //If path is not open or closed...
checkNeighbours (node::openNodeAcc)
else checkNeighbours openNodeAcc //Else carry on.
let neighbours =
area.GetNeighboursOf openNodes.Head.point //Get the neighbours of our current node (openNodes.Head) ...
|> List.filter isClear //...filter out collidable tiles...
|> List.map pointToPathNode //...for each neighbour we can walk to: generate a pathing node
let pathToGoal = List.tryFind (nodePointEquals goal) neighbours //Try and find the goal node in the walkable neighbours of this tile.
if pathToGoal.IsSome then pathToGoal //If we found our goal return it...
else
let nextSet =
checkNeighbours neighbours openNodes.Tail
|> List.sortBy(fun x -> x.f)
if nextSet.Length > 0 then
pathFind area goal start nextSet (nextSet.Head::closedNodes) //...Else carry on
else None
धन्यवाद,
जेडी
धन्यवाद ब्रायन, यह सिर्फ वही सामान है जो मैं बाद में था: ¬) – jdoig