View difference between Paste ID: xqZ4dXvw and Uj0mT4Vk
SHOW: | | - or go back to the newest paste.
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-
      []=>[]
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)