-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPosition.hs
More file actions
69 lines (53 loc) · 1.81 KB
/
Position.hs
File metadata and controls
69 lines (53 loc) · 1.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
------------------------------------------------------------
-- Position.hs
--
-- Types/functions for maintaining positions in a GameSetup
--
-- Author:
-- Ramin Rakhamimov
-- http://raminrakhamimov.tk
-- ramin32@gmail.com
-----------------------------------------------------------
module Position where
import Data.Char
data Position = Position {file :: Char, rank :: Int}
deriving (Eq, Ord, Show)
type Distance = (Int, Int)
data Move = Move {from :: Position, to :: Position} deriving (Eq)
fileOrd :: Position -> Int
fileOrd p = ord $ file p
distance :: Position -> Position -> Distance
distance p1 p2 = ((fileOrd p2) - (fileOrd p1), (rank p2) - (rank p1))
onBoard :: Position -> Bool
onBoard p
| file p < 'a' || file p > 'h' = False
| rank p < 1 || rank p > 8 = False
| otherwise = True
positionsByRank :: Int -> [Position]
positionsByRank r = [Position f r | f <- ['a'..'h']]
allPositions :: [Position]
allPositions = concat [positionsByRank r | r <- [1..8]]
positions :: Position -> Distance -> [Position]
positions p1 (0, 0) = p1 : []
positions p1 d = p1 : positions (Position (chr (f + xInc)) (r + yInc)) (fstD - xInc, sndD - yInc)
where f = fileOrd p1
r = rank p1
fstD = fst d
sndD = snd d
xInc = signum fstD
yInc = signum sndD
isEl :: Distance -> Bool
isEl d
| (abs $ fst d) == 1 && (abs $ snd d) == 2 = True
| (abs $ fst d) == 2 && (abs $ snd d) == 1 = True
| otherwise = False
isDiagnal :: Distance -> Bool
isDiagnal d = (abs $ fst d) == (abs $ snd d)
isLinear :: Distance -> Bool
isLinear (0, _) = True
isLinear (_, 0) = True
isLinear _ = False
isLinearXorDiagnal :: Distance -> Bool
isLinearXorDiagnal d = isLinear d || isDiagnal d
isSingleMover :: Distance -> Bool
isSingleMover d = (abs $ fst d) < 2 && (abs $ snd d) < 2