PageRenderTime 1ms CodeModel.GetById 63ms app.highlight 7ms RepoModel.GetById 1ms app.codeStats 1ms

/tuberia.hs

http://tpfuncional.googlecode.com/
Haskell | 132 lines | 80 code | 37 blank | 15 comment | 24 complexity | 11c59b8dfc2d6462df4494fcf9790d3f MD5 | raw file
  1type Pos= (Int, Int)
  2data Card= N | S | E | O deriving (Show)
  3data Tubo= Tub Pos Card Card | Ini Pos Card | Fin Pos Card deriving (Show)
  4type Final= Tubo
  5type Inicio= Tubo
  6type Jugada= Tubo
  7data Estrategia= AB | RAND | VEC deriving (Show)
  8data Jugador= Jug String Estrategia [Jugada] 
  9data Tablero= T [Jugada] [Pos] Inicio Final Jugador
 10
 11-- Configuracion del juego 
 12confFil::Int
 13confFil= 8
 14
 15confCol::Int
 16confCol=8
 17
 18confIni::Tubo
 19confIni= (Ini (3,2) N)
 20
 21
 22confFin::Tubo
 23confFin= (Fin (8,7) E)
 24--confFin= (Fin (3,4) S)
 25
 26--------------------------
 27
 28generarTubos::Pos->[Tubo]
 29generarTubos (x,y)= (Tub (x,y) N S):(Tub (x,y) E O):(Tub (x,y) S O):(Tub (x,y) N O):(Tub (x,y) E S):(Tub (x,y) E N):[]
 30
 31generarPos::Int->Int->[Pos]
 32generarPos fil col=[(x,y) | x<-[0..fil], y<-[0..col]]
 33
 34sacarPos::Pos->[Pos]->[Pos]
 35sacarPos xy xys= filter (\vw-> vw/=xy) xys
 36
 37--Recorre una tuberia y dice si esta completa
 38tuberiaCompleta::Inicio->Final->[Jugada]->Bool
 39tuberiaCompleta ini fin []= conectada ini fin
 40tuberiaCompleta ini fin xs= if (conectada ini fin) then True
 41				else
 42				case siguienteTubo ini xs of
 43					Nothing-> conectada ini fin
 44					Just value->tuberiaCompleta value fin (sacarTubo value xs)
 45
 46--saca un tubo de una lista de tubos
 47sacarTubo::Tubo->[Tubo]->[Tubo]
 48sacarTubo (Ini xy _) vws= filter (\(Tub mn _ _)-> mn/=xy) vws
 49sacarTubo (Tub xy _ _) vws= filter (\(Tub mn _ _)-> mn/=xy) vws
 50
 51-- Me dice si 2 tubos estan conectados
 52conectada::Tubo->Final->Bool
 53conectada (Ini xy card1) (Fin vw card)= if ((adjacentes xy vw) && (sentido card card1)) then True else False
 54conectada (Tub xy card1 card2) (Fin vw card)= if ((adjacentes xy vw) && ((sentido card card1) || (sentido card card2))) then True else False
 55
 56sentido:: Card->Card->Bool
 57sentido N S= True
 58sentido S N= True
 59sentido E O= True
 60sentido O E= True
 61sentido _ _= False
 62
 63adjacentes::Pos->Pos->Bool
 64adjacentes (x,y) (v,w)= if ((x==v && abs(y-w)==1) || (y==w && abs(x-v)==1)) then True else False
 65
 66--Retorna el tubo q continua
 67siguienteTubo::Inicio->[Tubo]->Maybe Inicio
 68siguienteTubo (Ini xy card) tubos= case filter (\(Tub vw card1 card2)-> adjacentes xy vw) tubos of
 69					[]-> Nothing
 70					value-> dameConectado (Ini xy card) value
 71
 72
 73--Recibe una lista de tubos adjacentes
 74dameConectado::Inicio->[Tubo]-> Maybe Inicio
 75dameConectado (Ini xy card) []= Nothing
 76dameConectado (Ini xy card) ((Tub vw card1 card2):vws)= if (sentido card card1) then Just (Ini vw card2) 
 77							else if (sentido card card2) then Just (Ini vw card1) 
 78							else dameConectado (Ini xy card) vws
 79
 80
 81-- las posiciones se generan por unica vez cuando se crea el tablero
 82jugadasPosibles :: Tablero -> [Jugada]
 83jugadasPosibles (T vw pos ini fin _)= map (\x-> Tub x N S) pos
 84
 85
 86-- El juego se da por terminado cuando si se conecta la tuberia completa o no hay mas posiciones disponibles
 87juegoTerminado  :: Tablero -> Bool
 88juegoTerminado (T vw pos ini fin (Jug _ VEC []))= True
 89juegoTerminado (T vw pos ini fin _)= if (tuberiaCompleta ini fin vw) || pos==[] then True else False
 90
 91
 92-- El jugador resulta ganador cuando se completa la tuberia
 93jugadorGanador  :: Tablero -> Maybe Jugador
 94jugadorGanador (T vw pos ini fin jug)= if (tuberiaCompleta ini fin vw) then Just jug else Nothing
 95
 96
 97-- le llega un tablero y una jugada valida
 98aplicar:: Tablero -> Jugada -> Tablero
 99aplicar (T vw pos ini fin (Jug nom VEC xs)) (Tub xy card1 card2)= T ((Tub xy card1 card2):vw) (sacarPos xy pos) ini fin (Jug nom VEC (sacarTubo (Tub xy card1 card2) xs))
100aplicar (T vw pos ini fin jug) (Tub xy card1 card2)= T ((Tub xy card1 card2):vw) (sacarPos xy pos) ini fin jug
101
102
103elegirJugada :: Jugador -> [Jugada] -> Jugada
104elegirJugada (Jug nombre estr (x:[])) _= x
105elegirJugada (Jug nombre estr (x:xs)) _= case estr of
106					--	AB ->
107					--	RAND ->
108						VEC -> x
109
110proxJugada:: Tablero->Jugada
111proxJugada (T vw pos ini fin jug)= elegirJugada jug (jugadasPosibles (T vw pos ini fin jug))
112
113
114nombre:: Jugador -> String
115nombre (Jug nombre _ _)= nombre
116
117-- Arma el tablero segun la configuracion
118tableroInicial :: [Jugador] -> Tablero
119tableroInicial (x:[])= (T [] (generarPos confFil confCol) confIni confFin x)
120
121
122
123jugar:: Tablero -> Maybe Jugador
124jugar tablero= if (juegoTerminado  tablero) then jugadorGanador tablero 
125		else jugar (aplicar tablero (proxJugada tablero))
126
127resultado::Maybe Jugador->String
128resultado x= case x of
129		Nothing-> "El jugador perdio"
130		Just value-> "El ganador es: " ++ (nombre value)
131
132