Advertisement
Guest User

Untitled

a guest
Apr 6th, 2018
272
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (*
  2. Esteban González Damazio
  3. Alejandro Jimenez Gamboa
  4. Lenguajes de programacion
  5. Proyecto 2 "Card Challenge"
  6. *)
  7.  
  8. (*Tipos de datos usados para el proyecto, simulan una baraja de naipes
  9.   dados por el profesor*)
  10. datatype suit = Clubs
  11.               | Diamonds
  12.               | Hearts
  13.               | Spades;
  14. datatype rank = Jack
  15.               | Queen
  16.               | King
  17.               | Ace
  18.               | Num of int;
  19. type card = suit * rank;
  20.  
  21. (*Estos tipos de datos son parte de las mecanicas del juego*)
  22. datatype color = Red | Black
  23. datatype move = Discard of card | Draw
  24. (*Excepcion usada cuando el jugador intenta hacer un movimiento no permitido*)
  25. exception IllegalMove
  26.  
  27. (*Funcion 1 Recibe una carta y dice si es de color Roja o Negra*)
  28. fun card_color c =
  29.     case c of
  30.        (Clubs, _) => Black
  31.      | (Diamonds, _) => Red
  32.      | (Hearts, _) => Red
  33.      | (Spades, _) => Black;
  34.      
  35. (*Funcion 2 Recibe una carta y retorna que valor tiene, los numeros valen igual, el as vale 11
  36.   y las demas valen 10*)  
  37. fun card_value c =
  38.     case c of
  39.        (_,Jack)  => 10
  40.      | (_,Queen) => 10
  41.      | (_,King) => 10
  42.      | (_,Ace) => 11
  43.      | (_, Num n)=> n;
  44.  
  45. (*Funcion 3 Recibe una lista de cartas y una carta, busca la carta en la lista y la elimina,
  46.   si la carta aparece mas de una vez solo elimina la primera aparicion, tira una excepcion
  47.   si la carta no esta*)  
  48. fun remove_card (cl: card list, c : card) =
  49.   case cl of
  50.       []=>e
  51.       | xs::ys => if c = xs then remove_card(ys,c)
  52.                   else xs::remove_card(ys,c);
  53.  
  54. (*Funcion 4 Recibe una lista de cartas, revisa los colores de cada carta de la lista,
  55.   retorna true si tienen el mismo color, apenas encuentra una de diferente color
  56.   retorna false*)  
  57. fun all_same_color cl =
  58.     case cl of
  59.        [] => true
  60.        | hd::nk::tl => (case card_color hd of
  61.                           Black => (card_color nk = Black) andalso (all_same_color (nk::tl))
  62.                         | Red => (card_color nk = Red) andalso (all_same_color (nk::tl)))
  63.       | hd::[] => true
  64.  
  65. (*Funcion 5 Recibe una lista, utiliza recursion de cola para sumar
  66.   los valores de las cartas que vengan en la lista*)  
  67. fun sum_cards [] = 0
  68.   | sum_cards (c as hd::tl) = card_value hd + sum_cards tl;
  69.  
  70. (*Funcion 6 Recibe una lista y un comodin
  71.   El score funciona de la siguiente manera:
  72.     sea sum la suma de los valores de held-cards. Si sum es mayor que goal,
  73.     entonces el preliminary score es tres veces (sum – goal), si no, entonces el preliminay score es
  74.     (goal – sum). Finalmente, se puede decir que score (el resultado final) es el preliminary score, a
  75.     menos de que todas las cartas en held-cards sean del mismo color, en ese caso, el score sería el
  76.     preliminary score dividido entre 2 (con redondeo de piso).  
  77. *)
  78. fun score ([], _) = 0
  79.   | score (held_cards as hd::tail, goal) =
  80.     let fun preliminaryScore (sum, goal) =
  81.       if sum > goal then 3*(sum-goal)
  82.       else (goal - sum);
  83.     in
  84.       if all_same_color held_cards then floor (real( preliminaryScore(sum_cards held_cards, goal))/ real 2)
  85.       else preliminaryScore(sum_cards held_cards, goal)
  86.     end
  87.    
  88. (*Pruebas de cada funcion, especificadas por el profesor*)    
  89. val test1 = card_color (Club, Num 2)
  90. val test2 = card_value (Club, Num 2)
  91. val test3 = remove_card ([(Heart, Ace)], (Heart, Ace), IllegalMove)
  92.             handle IllegalMove => false
  93. val test4 = all_same_color [(Heart, Ace), (Heart, Ace)]
  94. val test5 = sum_cards [(Club, Num 2),(Club, Num 2)]
  95. val test6 = score ([(Heart, Num 2),(Club, Num 4)],10)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement