From bea1e1e1bf7b965eac53fdd716862bc117db79f0 Mon Sep 17 00:00:00 2001 From: Arity-T Date: Sun, 10 Nov 2024 01:26:07 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=B8=D0=BB=D0=B5=D0=BC=D0=B0=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BA=D0=BB=D1=8E=D1=87=D1=91=D0=BD=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lab2/prisoner/.ghci | 1 + lab2/prisoner/game.hs | 65 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 lab2/prisoner/.ghci create mode 100644 lab2/prisoner/game.hs diff --git a/lab2/prisoner/.ghci b/lab2/prisoner/.ghci new file mode 100644 index 0000000..4c3bab8 --- /dev/null +++ b/lab2/prisoner/.ghci @@ -0,0 +1 @@ +:set -interactive-print=UnescapingPrint.uprint \ No newline at end of file diff --git a/lab2/prisoner/game.hs b/lab2/prisoner/game.hs new file mode 100644 index 0000000..fe87a86 --- /dev/null +++ b/lab2/prisoner/game.hs @@ -0,0 +1,65 @@ +forgivingStrategy :: (Ord t, Num t) => [Char] -> [Char] -> t -> [Char] +forgivingStrategy opponentMoves generatedMoves n = + if n <= 100 && length opponentMoves /= 1 + then + ( if n == 0 + then + forgivingStrategy opponentMoves (generatedMoves ++ ['С']) (n + 1) + else + if head opponentMoves == 'С' + then + forgivingStrategy (tail opponentMoves) (generatedMoves ++ ['С']) (n + 1) + else + forgivingStrategy (tail opponentMoves) (generatedMoves ++ ['П']) (n + 1) + ) + else generatedMoves + +indexOf :: (Eq t) => [t] -> t -> Int +indexOf [] _ = -1 +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 = + if n <= 100 && length opponentMoves > 0 + then + nashStrategy (tail opponentMoves) (generatedMoves ++ [nextStep]) (n + 1) + else generatedMoves + where + cases = [['П', 'С'], ['П', 'П']] + results = [[0, 10], [5, 5]] + result = + [ min (results !! 0 !! 1) (results !! 1 !! 1), + max (results !! 0 !! 0) (results !! 1 !! 0) + ] + nextStep = cases !! indexOf results result !! 1 + +getScore moves1 moves2 score1 score2 = + if length moves1 == 0 then (score1, score2) + else getScore (tail moves1) (tail moves2) newScore1 newScore2 + where + cases = [['С', 'С'], ['С', 'П'], ['П', 'С'], ['П', 'П']] + results = [[1, 1], [10, 0], [0, 10], [5, 5]] + newScore1 = score1 + results !! indexOf cases [head moves1, head moves2] !! 0 + newScore2 = score2 + results !! indexOf cases [head moves1, head moves2] !! 1 + + +game :: [Char] -> Int -> [Char] +game playerMoves gameStrategy + | null playerMoves = [] + | gameStrategy == 0 = forgivingStrategy playerMoves [] 0 + | gameStrategy == 1 = nashStrategy playerMoves [] 0 + | otherwise = [] + + +playerMoves = ['С', 'П', 'С', 'С', 'П', 'П', 'С', 'С', 'П', 'П'] +gameStrategy = 0 +computerMoves = game playerMoves gameStrategy +(score1, score2) = getScore playerMoves computerMoves 0 0 + +main :: IO () +main = do + putStrLn $ "Ходы компьютера: " ++ computerMoves + putStrLn $ "Очки: " ++ show score1 ++ " - " ++ show score2 +