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) |