このソース見た時、凄い感慨したんよね。絵柄と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ペア