Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.17 KB | None | 0 0
  1. #![allow(dead_code)]
  2.  
  3. use rand::seq::SliceRandom;
  4. use rand::thread_rng;
  5. use std::fmt;
  6.  
  7. fn main() {
  8. let mut deck = Deck::new();
  9. println!("{}", deck.draw(5));
  10. }
  11.  
  12. struct Deck {
  13. cards: Vec<Card>,
  14. }
  15.  
  16. impl Default for Deck {
  17. fn default() -> Self {
  18. Deck {
  19. cards: build_deck(suits(), ranks()).to_vec(),
  20. }
  21. }
  22. }
  23.  
  24. impl fmt::Debug for Deck {
  25. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  26. self.cards[..].fmt(f)
  27. }
  28. }
  29.  
  30. impl fmt::Display for Deck {
  31. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  32. display_vec(f, &self.cards)
  33. }
  34. }
  35.  
  36. impl Deck {
  37. fn new() ->Self {
  38. let mut deck = Deck::default();
  39. deck.shuffle();
  40. deck
  41. }
  42.  
  43. fn shuffle(&mut self) -> &Self {
  44. self.cards.shuffle(&mut thread_rng());
  45. self
  46. }
  47.  
  48. fn draw(&mut self, n: usize) -> Hand {
  49. let cards: Vec<Card> = self.cards.iter().cloned().take(n).collect();
  50. self.cards.retain(|c| !cards.contains(c));
  51. Hand { cards }
  52. }
  53.  
  54. fn len(&self) -> usize {
  55. self.cards.len()
  56. }
  57. }
  58.  
  59. struct Hand {
  60. cards: Vec<Card>
  61. }
  62.  
  63. impl fmt::Display for Hand {
  64. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  65. display_vec(f, &self.cards)
  66. }
  67. }
  68.  
  69. #[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Copy, Clone)]
  70. struct Card {
  71. suit: Suit,
  72. rank: Rank,
  73. }
  74.  
  75. impl Default for Card {
  76. fn default() -> Self {
  77. Card {
  78. suit: Suit::Club,
  79. rank: Rank::Ace,
  80. }
  81. }
  82. }
  83.  
  84. impl fmt::Display for Card {
  85. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  86. write!(f, "{}{}", rank_to_str(&self.rank), suit_to_char(self.suit))
  87. }
  88. }
  89.  
  90. #[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Copy, Clone)]
  91. enum Suit {
  92. Spade = 4,
  93. Club = 3,
  94. Heart = 2,
  95. Diamond = 1,
  96. }
  97.  
  98. #[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Copy, Clone)]
  99. enum Rank {
  100. Ace = 14,
  101. King = 13,
  102. Queen = 12,
  103. Jack = 11,
  104. Ten = 10,
  105. Nine = 9,
  106. Eight = 8,
  107. Seven = 7,
  108. Six = 6,
  109. Five = 5,
  110. Four = 4,
  111. Three = 3,
  112. Two = 2,
  113. }
  114.  
  115. fn suit_to_char(suit: Suit) -> char {
  116. match suit {
  117. Suit::Spade => '♠',
  118. Suit::Club => '♣',
  119. Suit::Heart => '♥',
  120. Suit::Diamond => '♦',
  121. }
  122. }
  123.  
  124. fn rank_to_str(rank: &Rank) -> &str {
  125. match rank {
  126. Rank::Ace => "A",
  127. Rank::King => "K",
  128. Rank::Queen => "Q",
  129. Rank::Jack => "J",
  130. Rank::Ten => "10",
  131. Rank::Nine => "9",
  132. Rank::Eight => "8",
  133. Rank::Seven => "7",
  134. Rank::Six => "6",
  135. Rank::Five => "5",
  136. Rank::Four => "4",
  137. Rank::Three => "3",
  138. Rank::Two => "2",
  139. }
  140. }
  141.  
  142. fn suits() -> [Suit; 4] {
  143. [Suit::Spade, Suit::Club, Suit::Heart, Suit::Diamond]
  144. }
  145.  
  146. fn ranks() -> [Rank; 13] {
  147. [
  148. Rank::Ace,
  149. Rank::King,
  150. Rank::Queen,
  151. Rank::Jack,
  152. Rank::Ten,
  153. Rank::Nine,
  154. Rank::Eight,
  155. Rank::Seven,
  156. Rank::Six,
  157. Rank::Five,
  158. Rank::Four,
  159. Rank::Three,
  160. Rank::Two,
  161. ]
  162. }
  163.  
  164. fn build_deck(a: [Suit; 4], b: [Rank; 13]) -> [Card; 52] {
  165. let mut deck: [Card; 52] = [Card::default(); 52];
  166.  
  167. let mut i = 0;
  168.  
  169. for suit in &a {
  170. for rank in &b {
  171. deck[i] = Card {
  172. suit: *suit,
  173. rank: *rank,
  174. };
  175. i += 1;
  176. }
  177. }
  178.  
  179. deck
  180. }
  181.  
  182. fn display_vec<T: fmt::Display>(f: &mut fmt::Formatter, v: &Vec<T>) -> fmt::Result {
  183. let mut ret = String::new();
  184. let len = v.len();
  185.  
  186. for (i, item) in v.iter().enumerate() {
  187. let comma = if i == len - 1 { "" } else { ", " };
  188. ret.push_str(&format!("{}{}", item, comma));
  189. }
  190. write!(f, "{}", ret)
  191. }
  192.  
  193. #[test]
  194. fn test_suit_to_char() {
  195. let char = '♠';
  196. let suit = Suit::Spade;
  197. assert_eq!(char, suit_to_char(&suit));
  198. }
  199.  
  200. #[test]
  201. fn test_rank_to_str() {
  202. let queen_str = "Q";
  203. let queen_rank = Rank::Queen;
  204. assert_eq!(queen_str, rank_to_str(&queen_rank));
  205. }
  206.  
  207. #[test]
  208. fn test_suit_order() {
  209. let spade = Suit::Spade;
  210. let diamond = Suit::Diamond;
  211. assert!(spade > diamond);
  212. }
  213.  
  214. #[test]
  215. fn test_rank_order() {
  216. let queen = Rank::Queen;
  217. let jack = Rank::Jack;
  218.  
  219. assert!(queen > jack);
  220. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement