के साथ टिक टैक पैर की अंगुली खेल में अगली चाल कैसे उत्पन्न करें I Haskell में n * n
बोर्ड के लिए एक टिक टैक पैर गेम लागू कर रहा हूं और मुझे अगले बोर्ड से सभी बोर्ड कॉन्फ़िगरेशन जेनरेट करने की आवश्यकता है।हास्केल - सूची मोनैड
मैं बोर्ड के रूप में परिभाषित किया है इस प्रकार है:
data Cell = E
| X
| O
deriving (Eq,Show)
type Row a = [a]
type Board = Row (Row Cell)
iniBoard :: Int -> Board
iniBoard n = let row = replicate n E in replicate n row
मैं निर्धारित कर सकते हैं, यह देखते हुए बोर्ड विन्यास खिलाड़ी x
के लिए जीत रहा है, तो मैं
win :: Cell -> Board -> Bool
win E _ = False
win x brd = any full $ diags brd ++ rows brd ++ cols brd
where
diags brd = mainDiag : [secondDiag]
mainDiag = zipWith (!!) brd [0..]
secondDiag = zipWith (!!) revBrd [0..]
revBrd = do
xs <- brd
return (reverse xs)
rows = id
cols = transpose
full xs = all (==x) xs
है लेकिन मुझे पता नहीं, कैसे करने के लिए है कि क्या सभी बोर्ड कॉन्फ़िगरेशन उत्पन्न करें जो खिलाड़ी x
अगले कदम के रूप में बना सकते हैं।
मैं समझता हूं कि मुझे सभी कोशिकाओं को पार करने और जांचने की आवश्यकता है, यदि सेल खाली है, तो मैं यहां चिह्न डाल सकता हूं और नई कॉन्फ़िगरेशन वापस कर सकता हूं। मैं पहले से ही विन्यास जीतने की है, तो वहाँ कोई अगला कदम है, और मैं खाली सूची
लौटना चाहिए मैं इस तरह एक कोड है:
nxt :: Cell -> Board -> [Board]
nxt x brd = do
if (win x brd || win (switch x) brd)
then
[]
else
undefined
कैसे मैं यह कर सकता, सूची इकाई का उपयोग कर? मदद के लिए धन्यवाद!
आदमी, मैं कुछ समय की जरूरत है यह महसूस करना, लेकिन फिर भी आपको बहुत धन्यवाद! – EdZhavoronkov
बस एक टाइपो: '[बोर्ड] 'होना चाहिए' [बोर्ड] 'मुझे लगता है। उस अच्छे समाधान के अलावा, मेरा अधिक तो सुरुचिपूर्ण;) – ThreeFx
(+1) लेकिन सभी बोर्ड क्यों बनाते हैं जब आप केवल 'ई' के अनुरूप होते हैं? (मेरे संपादित उत्तर देखें, जो आपके 'डू' नोटेशन से प्रेरित है)। –