سؤال

وهكذا أعمل على تنفيذ مينيماكس لعبة الداما تشبه لمساعدة نفسي تعلم هاسكل أفضل. وظيفة أواجه مشكلة مع يأخذ على قائمة للدول لعبة، ويقوم بإنشاء قائمة الدول فورية لعبة خليفة. مثل لعبة الداما، إذا كان القفز هو متاح، ويجب على اللاعب أخذه. إذا كان هناك أكثر من واحد، ويمكن للاعب اختيار.

وبالنسبة للجزء الأكبر، وهذا يعمل بشكل جيد مع قائمة الكائن الدقيق الاحادي الخلية: حلقة على جميع الدول عبة المدخلات، حلقة على كل الرخام التي يمكن أن قفز، حلقة على كل يقفز من أن الرخام. هذه القائمة الكائن الدقيق الاحادي الخلية يسطح طيف جميع القوائم للخروج الى قائمة بسيطة من الدول في نهاية المطاف.

والحيلة هي أنه إذا لم يتم العثور على القفزات لعبة الدولة أعطيت، ولست بحاجة للعودة الدولة اللعبة الحالية، بدلا من قائمة فارغة. رمز أدناه هو أفضل وسيلة جئت مع من يفعل ذلك، ولكن يبدو القبيح حقا بالنسبة لي. أي اقتراحات بشأن كيفية تنظيفه؟

eHex :: Coord -> Coord -- Returns the coordinates immediately to the east on the board
nwHex :: Coord -> Coord -- Returns the coordinates immediately to the northwest on the board

generateJumpsIter :: [ZertzState] -> [ZertzState]
generateJumpsIter states = do
    ws <- states
    case children ws of
      [] -> return ws
      n@_ -> n
  where 
    children ws@(ZertzState s1 s2 b p) = do
      (c, color)  <- occupiedCoords ws
      (start, end) <- [(eHex, wHex), (wHex, eHex), (swHex, neHex),
                       (neHex, swHex), (nwHex, seHex), (seHex, nwHex)]
      if (hexOccupied b $ start c) && (hexOpen b $ end c)
        then case p of
          1 -> return $ ZertzState (scoreMarble s1 color) s2
                                   (jumpMarble (start c) c (end c) b) p
          (-1) -> return $ ZertzState s1 (scoreMarble s2 color)
                                      (jumpMarble (start c) c (end c) b) p
        else []

وتحرير: توفير سبيل المثال نوع التوقيعات لوظائف عرافة *

هل كانت مفيدة؟

المحلول

<اقتباس فقرة>   

والحيلة هي أنه إذا لم يتم العثور على القفزات لعبة الدولة أعطيت، ولست بحاجة للعودة الدولة اللعبة الحالية، بدلا من قائمة فارغة.

لماذا؟ لقد كتبت مينيماكس عدة مرات، وأنا لا أستطيع أن أتخيل طريقة لاستخدام هذه الوظيفة. لن تكون أفضل حالا مع وظيفة من نوع

nextStates :: [ZertzState] -> [Maybe [ZertzState]]

أو

nextStates :: [ZertzState] -> [[ZertzState]]

ولكن إذا كنت حقا تريد أن تعود "إما قائمة الدول المقبلة، أو إذا كان ذلك القائمة فارغة، وحالته الأصلية"، ثم نوع تريده هو

nextStates :: [ZertzState] -> [Either ZertzState [ZertzState]]

والتي يمكنك تتسطح بسهولة ثم بما فيه الكفاية.

وأما بالنسبة لكيفية تنفيذ وأوصي تحديد وظيفة مساعد من نوع

[ZertzState] -> [(ZertzState, [ZertzState])]

وومن يمكنك تعيين

(\(start, succs) -> if null succs then Left start else Right succs)

وعلى النتيجة، بالإضافة إلى أشياء أخرى مختلفة.

وكما قال فريد بروكس (إعادة صياغة)، وبمجرد الحصول على أنواع الحق، رمز يكتب عمليا نفسها.

نصائح أخرى

ولا يسيئون الكائنات الدقيقة الاحاديه الخلية تدوين لائحة، انها ثقيلة جدا من أجل لا شيء. وعلاوة على ذلك يمكنك استخدام الفهم القائمة بنفس الطريقة:

do x <- [1..3]
   y <- [2..5]      <=>  [ x + y | x <- [1..3], y <- [2..5] ]
   return x + y

والآن ل 'تبسيط'

listOfHex :: [(Coord -> Coord,Coord -> Coord)]
listOfHex = [ (eHex, wHex), (wHex, eHex), (swHex, neHex)
            , (neHex, swHex), (nwHex, seHex), (seHex, nwHex)]

generateJumpsIter :: [ZertzState] -> [ZertzState]
generateJumpsIter states =
    [if null ws then ws else children ws | ws <- states]
  where -- I named it foo because I don t know what it do....
    foo True   1  = ZertzState (scoreMarble s1 color) s2
                               (jumpMarble (start c) c (end c) b) p
    foo True (-1) = ZertzState s1 (scoreMarble s2 color)
                               (jumpMarble (start c) c (end c) b) p
    foo False  _  = []
    foo _ _ = error "Bleh"

    children ws@(ZertzState s1 s2 b p) =
      [ foo (valid c hex) p | (c, _)  <- occupiedCoords ws, hex <- listOfHex ]
        where valid c (start, end) =
                 (hexOccupied b $ start c) && (hexOpen b $ end c)

وجماعة عسكر طيبة في التمويلي في قائمة commprehension في أعلى يزعجني قليلا، ولكن كما قلت لم يكن لديك كافة التعليمات البرمجية، وأنا لا أعرف حقا كيف نفعل ذلك بطريقة أخرى. إذا يمكنك تعديل أكثر في العمق، وأنا أقترح عليك استخدام المزيد من combinators (خريطة، foldr، foldl 'الخ) لأنها حقا تقليل حجم التعليمات البرمجية في تجربتي.

ملحوظة، لا يتم اختبار رمز، وربما لا ترجمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top