このソース見た時、凄い感慨したんよね。絵柄と1~13の数字でdeckを作るところ。
pocker chaseの裏側ってどうやってんだろうずっと思ってたんだけど、これを見ると、カードの配り方や、最後の役完成時の判定をどうやってるかがわかる。素晴らしい!
use rand::seq::SliceRandom; #[derive(Debug, Clone, Copy, PartialEq)] enum Suit { Club, Diamond, Heart, Spade, } #[derive(Debug, Clone, Copy, PartialEq)] struct Card { suit: Suit, rank: i32, } fn main() { let mut deck: Vec<Card> = Vec::new(); let suits = [Suit::Club, Suit::Diamond, Suit::Heart, Suit::Spade]; for suit in suits { for rank in 1..=13 { deck.push(Card {suit, rank}); } } let mut rng = rand::thread_rng(); deck.shuffle(&mut rng); let mut hand: Vec<Card> = Vec::new(); for _ in 0..5 { hand.push(deck.pop().unwrap()); } hand.sort_by(|a, b| a.rank.cmp(&b.rank)); for (i, card) in hand.iter().enumerate() { println!("{:}: {:?} {:}", i +1, card.suit, card.rank); } println!("入れ替えたいカードの番号を入力してください(例: 1 2 3)"); let mut input = String::new(); std::io::stdin().read_line(&mut input).unwrap(); let numbers : Vec<usize> = input.split_whitespace() .map(|x| x.parse().unwrap()) .collect::<Vec<usize>>(); for number in numbers { hand[number - 1] = deck.pop().unwrap(); } hand.sort_by(|a, b| a.rank.cmp(&b.rank)); for (i, card) in hand.iter().enumerate() { println!("{:}: {:?} {:}", i +1, card.suit, card.rank); } let suit = hand.first().unwrap().suit; let flash = hand.iter().all(|c| c.suit == suit); let mut count = 0; for i in 0..hand.len() - 1 { for j in i + 1..hand.len() { if hand[i].rank == hand[j].rank { count += 1; } } } if flash { println!("flash!"); } else if count >= 3 { println!("スリーカード!"); } else if count == 2 { println!("2ペア"); } else if count == 1 { println!("1ペア"); } else { println!("役なし..."); } }
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.62s
Running `target/debug/app`
1: Spade 3
2: Spade 4
3: Club 5
4: Diamond 8
5: Spade 13
入れ替えたいカードの番号を入力してください(例: 1 2 3)
1 2 3 4
1: Diamond 10
2: Club 10
3: Diamond 12
4: Heart 12
5: Spade 13
2ペア