설명 없음

card.rs 6.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. use std::fmt;
  2. use std::cmp::Ordering;
  3. #[derive(Debug, Copy, Clone, Eq, PartialEq, PartialOrd, Ord)]
  4. pub enum Suit {
  5. Clubs,
  6. Diamonds,
  7. Hearts,
  8. Spades,
  9. }
  10. impl fmt::Display for Suit {
  11. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  12. match self {
  13. &Suit::Clubs => write!(f, "trèfle"),
  14. &Suit::Diamonds => write!(f, "carreau"),
  15. &Suit::Hearts => write!(f, "cœur"),
  16. &Suit::Spades => write!(f, "pique"),
  17. }
  18. }
  19. }
  20. impl Suit {
  21. pub fn values() -> Vec<Suit> {
  22. vec![Suit::Clubs, Suit::Diamonds, Suit::Hearts, Suit::Spades]
  23. }
  24. }
  25. #[derive(Debug, Copy, Clone, Eq, PartialEq, PartialOrd, Ord)]
  26. pub enum Symbol {
  27. Ace,
  28. Two,
  29. Three,
  30. Four,
  31. Five,
  32. Six,
  33. Seven,
  34. Eight,
  35. Nine,
  36. Ten,
  37. Jack,
  38. Knight,
  39. Queen,
  40. King,
  41. }
  42. impl fmt::Display for Symbol {
  43. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  44. match self {
  45. &Symbol::Ace => write!(f, "as"),
  46. &Symbol::Two => write!(f, "2"),
  47. &Symbol::Three => write!(f, "3"),
  48. &Symbol::Four => write!(f, "4"),
  49. &Symbol::Five => write!(f, "5"),
  50. &Symbol::Six => write!(f, "6"),
  51. &Symbol::Seven => write!(f, "7"),
  52. &Symbol::Eight => write!(f, "8"),
  53. &Symbol::Nine => write!(f, "9"),
  54. &Symbol::Ten => write!(f, "10"),
  55. &Symbol::Jack => write!(f, "valet"),
  56. &Symbol::Knight => write!(f, "cavalier"),
  57. &Symbol::Queen => write!(f, "dame"),
  58. &Symbol::King => write!(f, "roi"),
  59. }
  60. }
  61. }
  62. impl Symbol {
  63. pub fn values() -> Vec<Symbol> {
  64. vec![Symbol::Ace,
  65. Symbol::Two,
  66. Symbol::Three,
  67. Symbol::Four,
  68. Symbol::Five,
  69. Symbol::Six,
  70. Symbol::Seven,
  71. Symbol::Eight,
  72. Symbol::Nine,
  73. Symbol::Ten,
  74. Symbol::Jack,
  75. Symbol::Knight,
  76. Symbol::Queen,
  77. Symbol::King]
  78. }
  79. }
  80. #[derive(Debug, Copy, Clone, Eq, PartialEq, PartialOrd)]
  81. pub struct Face {
  82. pub suit: Suit,
  83. pub symbol: Symbol,
  84. }
  85. impl Ord for Face {
  86. fn cmp(&self, face: &Face) -> Ordering {
  87. match self.symbol.cmp(&face.symbol) {
  88. Ordering::Equal => self.suit.cmp(&face.suit),
  89. Ordering::Less => Ordering::Less,
  90. Ordering::Greater => Ordering::Greater,
  91. }
  92. }
  93. }
  94. #[derive(Debug, Copy, Clone, Eq, PartialEq, PartialOrd, Ord)]
  95. pub enum Trump {
  96. One,
  97. Two,
  98. Three,
  99. Four,
  100. Five,
  101. Six,
  102. Seven,
  103. Eight,
  104. Nine,
  105. Ten,
  106. Eleven,
  107. Twelve,
  108. Thirteen,
  109. Fourteen,
  110. Fifteen,
  111. Sixteen,
  112. Seventeen,
  113. Eighteen,
  114. Nineteen,
  115. Twenty,
  116. TwentyOne,
  117. }
  118. impl fmt::Display for Trump {
  119. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  120. match self {
  121. &Trump::One => write!(f, "1"),
  122. &Trump::Two => write!(f, "2"),
  123. &Trump::Three => write!(f, "3"),
  124. &Trump::Four => write!(f, "4"),
  125. &Trump::Five => write!(f, "5"),
  126. &Trump::Six => write!(f, "6"),
  127. &Trump::Seven => write!(f, "7"),
  128. &Trump::Eight => write!(f, "8"),
  129. &Trump::Nine => write!(f, "9"),
  130. &Trump::Ten => write!(f, "10"),
  131. &Trump::Eleven => write!(f, "11"),
  132. &Trump::Twelve => write!(f, "12"),
  133. &Trump::Thirteen => write!(f, "13"),
  134. &Trump::Fourteen => write!(f, "14"),
  135. &Trump::Fifteen => write!(f, "15"),
  136. &Trump::Sixteen => write!(f, "16"),
  137. &Trump::Seventeen => write!(f, "17"),
  138. &Trump::Eighteen => write!(f, "18"),
  139. &Trump::Nineteen => write!(f, "19"),
  140. &Trump::Twenty => write!(f, "20"),
  141. &Trump::TwentyOne => write!(f, "21"),
  142. }
  143. }
  144. }
  145. impl Trump {
  146. pub fn values() -> Vec<Trump> {
  147. vec![Trump::One,
  148. Trump::Two,
  149. Trump::Three,
  150. Trump::Four,
  151. Trump::Five,
  152. Trump::Six,
  153. Trump::Seven,
  154. Trump::Eight,
  155. Trump::Nine,
  156. Trump::Ten,
  157. Trump::Eleven,
  158. Trump::Twelve,
  159. Trump::Thirteen,
  160. Trump::Fourteen,
  161. Trump::Fifteen,
  162. Trump::Sixteen,
  163. Trump::Seventeen,
  164. Trump::Eighteen,
  165. Trump::Nineteen,
  166. Trump::Twenty,
  167. Trump::TwentyOne]
  168. }
  169. }
  170. #[derive(Debug, Copy, Clone, Eq, PartialEq, PartialOrd)]
  171. pub enum Card {
  172. Face(Face),
  173. Trump(Trump),
  174. Fool,
  175. }
  176. impl fmt::Display for Card {
  177. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  178. match self {
  179. &Card::Fool => write!(f, "excuse"),
  180. &Card::Face(Face { ref suit, ref symbol }) => write!(f, "{} de {}", symbol, suit),
  181. &Card::Trump(Trump::One) => write!(f, "petit"),
  182. &Card::Trump(ref trump) => write!(f, "{} d'atout", trump),
  183. }
  184. }
  185. }
  186. impl Ord for Card {
  187. fn cmp(&self, card: &Card) -> Ordering {
  188. match (self, card) {
  189. (&Card::Fool, &Card::Fool) => Ordering::Equal,
  190. (&Card::Fool, _) => Ordering::Less,
  191. (_, &Card::Fool) => Ordering::Greater,
  192. (&Card::Trump(_), &Card::Face(_)) => Ordering::Greater,
  193. (&Card::Face(_), &Card::Trump(_)) => Ordering::Less,
  194. (&Card::Trump(trump1), &Card::Trump(trump2)) => trump1.cmp(&trump2),
  195. (&Card::Face(face1), &Card::Face(face2)) => face1.cmp(&face2),
  196. }
  197. }
  198. }
  199. pub fn potential_value(&card: &Card) -> i32 {
  200. match card {
  201. Card::Fool => 100,
  202. Card::Trump(Trump::One) => 100,
  203. Card::Trump(Trump::TwentyOne) => 100,
  204. Card::Face(Face { suit: _, symbol: Symbol::Jack }) => 10,
  205. Card::Face(Face { suit: _, symbol: Symbol::Knight }) => 20,
  206. Card::Face(Face { suit: _, symbol: Symbol::Queen }) => 30,
  207. Card::Face(Face { suit: _, symbol: Symbol::King }) => 40,
  208. Card::Trump(trump) => {
  209. 10 +
  210. match trump {
  211. Trump::Two => 2,
  212. Trump::Three => 3,
  213. Trump::Four => 4,
  214. Trump::Five => 5,
  215. Trump::Six => 6,
  216. Trump::Seven => 7,
  217. Trump::Eight => 8,
  218. Trump::Nine => 9,
  219. Trump::Ten => 10,
  220. Trump::Eleven => 11,
  221. Trump::Twelve => 12,
  222. Trump::Thirteen => 13,
  223. Trump::Fourteen => 14,
  224. Trump::Fifteen => 15,
  225. Trump::Sixteen => 16,
  226. Trump::Seventeen => 17,
  227. Trump::Eighteen => 18,
  228. Trump::Nineteen => 19,
  229. Trump::Twenty => 20,
  230. _ => 100,
  231. }
  232. }
  233. _ => 0,
  234. }
  235. }