Дилема заключённого
This commit is contained in:
1
lab2/prisoner/.ghci
Normal file
1
lab2/prisoner/.ghci
Normal file
@@ -0,0 +1 @@
|
|||||||
|
:set -interactive-print=UnescapingPrint.uprint
|
||||||
65
lab2/prisoner/game.hs
Normal file
65
lab2/prisoner/game.hs
Normal file
@@ -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
|
||||||
|
|
||||||
Reference in New Issue
Block a user