From 34ddec0eb32a592c157650142130bf5d8dea619a Mon Sep 17 00:00:00 2001 From: Arity-T Date: Sun, 10 Nov 2024 01:39:52 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D1=80=D1=8F=D0=B4=D0=BE=D0=BA=20?= =?UTF-8?q?=D0=B2=20=D0=BA=D0=BE=D0=B4=D0=B5=20=D0=B8=D0=B3=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab2/prisoner/game.hs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/lab2/prisoner/game.hs b/lab2/prisoner/game.hs index 6256138..b6879c7 100644 --- a/lab2/prisoner/game.hs +++ b/lab2/prisoner/game.hs @@ -1,10 +1,12 @@ -forgivingStrategy :: (Ord t, Num t) => [Char] -> [Char] -> t -> [Char] +forgivingStrategy :: [Char] -> [Char] -> Int -> [Char] forgivingStrategy opponentMoves generatedMoves n | n > 100 || length opponentMoves == 1 = generatedMoves - | n == 0 = forgivingStrategy opponentMoves (generatedMoves ++ ['С']) (n + 1) - | head opponentMoves == 'С' = forgivingStrategy (tail opponentMoves) (generatedMoves ++ ['С']) (n + 1) - | otherwise = forgivingStrategy (tail opponentMoves) (generatedMoves ++ ['П']) (n + 1) - + | n == 0 + = forgivingStrategy opponentMoves (generatedMoves ++ ['С']) (n + 1) + | head opponentMoves == 'С' + = forgivingStrategy (tail opponentMoves) (generatedMoves ++ ['С']) (n + 1) + | otherwise + = forgivingStrategy (tail opponentMoves) (generatedMoves ++ ['П']) (n + 1) indexOf :: (Eq t) => [t] -> t -> Int indexOf [] _ = -1 @@ -12,11 +14,11 @@ indexOf (x : xs) target | x == target = 0 | otherwise = 1 + indexOf xs target -nashStrategy :: (Num t, Ord t) => [a] -> [Char] -> t -> [Char] -nashStrategy opponentMoves generatedMoves n = +nashEquilibriumStrategy :: [a] -> [Char] -> Int -> [Char] +nashEquilibriumStrategy opponentMoves generatedMoves n = if n <= 100 && length opponentMoves > 0 then - nashStrategy (tail opponentMoves) (generatedMoves ++ [nextStep]) (n + 1) + nashEquilibriumStrategy (tail opponentMoves) (generatedMoves ++ [nextStep]) (n + 1) else generatedMoves where cases = [['П', 'С'], ['П', 'П']] @@ -38,16 +40,14 @@ getScore moves1 moves2 score1 score2 = newScore2 = score2 + results !! indexOf cases [head moves1, head moves2] !! 1 -game :: [Char] -> Int -> [Char] +game :: [Char] -> ([Char] -> [Char] -> Int -> [Char]) -> [Char] game playerMoves gameStrategy | null playerMoves = [] - | gameStrategy == 0 = forgivingStrategy playerMoves [] 0 - | gameStrategy == 1 = nashStrategy playerMoves [] 0 - | otherwise = [] + | otherwise = gameStrategy playerMoves [] 0 playerMoves = ['С', 'П', 'С', 'С', 'П', 'П', 'С', 'С', 'П', 'П'] -gameStrategy = 0 +gameStrategy = forgivingStrategy -- forgivingStrategy, nashEquilibriumStrategy computerMoves = game playerMoves gameStrategy (score1, score2) = getScore playerMoves computerMoves 0 0