begin jiang
This commit is contained in:
parent
8c4132e628
commit
042975e561
7 changed files with 134 additions and 16 deletions
7
jiang/Cargo.toml
Normal file
7
jiang/Cargo.toml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
[package]
|
||||
name = "jiang"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
jong-types.workspace = true
|
||||
68
jiang/src/lib.rs
Normal file
68
jiang/src/lib.rs
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
use std::collections::HashMap;
|
||||
|
||||
use jong_types::*;
|
||||
|
||||
// pub fn check_valid() {}
|
||||
|
||||
pub enum Meldable {
|
||||
Ron,
|
||||
Chii(Tile, Tile),
|
||||
Pon,
|
||||
Kan,
|
||||
}
|
||||
|
||||
pub fn find_meldables(hand: &[Tile], dealt: Tile) -> Vec<Meldable> {
|
||||
let counts = hand.iter().fold(HashMap::new(), |mut m, t| {
|
||||
let e = m.entry(t).or_insert(0);
|
||||
*e += 1;
|
||||
m
|
||||
});
|
||||
|
||||
let mut calls = vec![];
|
||||
|
||||
// find pon & kan
|
||||
if let Some(&count) = counts.get(&dealt) {
|
||||
if count == 3 {
|
||||
calls.push(Meldable::Kan)
|
||||
} else if count == 2 {
|
||||
calls.push(Meldable::Pon)
|
||||
}
|
||||
}
|
||||
|
||||
// find chii
|
||||
if let Some(next_outer) = dealt.next_rank() {
|
||||
if let Some(next_inner) = next_outer.next_rank()
|
||||
&& counts.contains_key(&next_outer)
|
||||
&& counts.contains_key(&next_inner)
|
||||
{
|
||||
calls.push(Meldable::Chii(next_outer, next_inner));
|
||||
}
|
||||
if let Some(prev_inner) = next_outer.prev_rank()
|
||||
&& counts.contains_key(&next_outer)
|
||||
&& counts.contains_key(&prev_inner)
|
||||
{
|
||||
calls.push(Meldable::Chii(next_outer, prev_inner));
|
||||
}
|
||||
}
|
||||
if let Some(prev_outer) = dealt.prev_rank()
|
||||
&& let Some(prev_inner) = prev_outer.prev_rank()
|
||||
&& counts.contains_key(&prev_outer)
|
||||
&& counts.contains_key(&prev_inner)
|
||||
{
|
||||
calls.push(Meldable::Chii(prev_outer, prev_inner));
|
||||
}
|
||||
|
||||
// find ron
|
||||
|
||||
calls
|
||||
}
|
||||
|
||||
fn count_shapes(hand: &[Tile]) {
|
||||
let hand = if !hand.is_sorted() {
|
||||
let mut hand = hand.to_vec();
|
||||
hand.sort();
|
||||
&hand
|
||||
} else {
|
||||
hand
|
||||
};
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue