module Datatypes where
|
|
|
|
import Data.Hashable (Hashable(..))
|
|
import qualified Data.List as List
|
|
import Data.Set (Set)
|
|
import qualified Data.Set as Set
|
|
|
|
type Cell = (Int, Int)
|
|
|
|
data Board = Board {
|
|
boardWidth :: Int,
|
|
boardHeight :: Int,
|
|
boardFilled :: Set Cell
|
|
}
|
|
deriving Show
|
|
|
|
data Unit = Unit {
|
|
unitMembers :: Set Cell,
|
|
unitPivot :: Cell
|
|
}
|
|
deriving Show
|
|
|
|
data Command = MoveW
|
|
| MoveE
|
|
| MoveSW
|
|
| MoveSE
|
|
| RotateClockwise
|
|
| RotateCounterclockwise
|
|
deriving (Show,Eq)
|
|
|
|
cmdToString :: [Command] -> String
|
|
cmdToString (MoveW:cs) = 'p' : cmdToString cs
|
|
cmdToString (MoveE:cs) = 'b' : cmdToString cs
|
|
cmdToString (MoveSW:cs) = 'a' : cmdToString cs
|
|
cmdToString (MoveSE:cs) = 'l' : cmdToString cs
|
|
cmdToString (RotateClockwise:cs) = 'd' : cmdToString cs
|
|
cmdToString (RotateCounterclockwise:cs) = 'k' : cmdToString cs
|
|
cmdToString [] = []
|
|
|
|
data Game = Game {
|
|
gameBoard :: Board,
|
|
gameUnits :: [Unit],
|
|
oldPositions :: Set Int,
|
|
oldLines :: Int,
|
|
points :: Int
|
|
}
|
|
deriving Show
|
|
|
|
data Notes = OK
|
|
| Ended
|
|
| Collision
|
|
| CollisionWithRowElision
|
|
| ErrorZero
|
|
deriving (Show,Eq)
|
|
|
|
instance Hashable Unit where
|
|
hashWithSalt salt (Unit members pivot) =
|
|
hashWithSalt salt (List.sort (Set.toList members), pivot)
|