ä»åã¯ãã·ã³ãã«ã«ãã©ã³ãã²ãŒã ã®ãããæãããäœã£ãŠãRustã®ããã°ã©ãã³ã°ã®é¢çœããå³ãããŸããããç¹ã«ãã«ãŒãã²ãŒã ãäœãã®ã«ã¯ãé«åºŠãªé åããŒã¿ã®æäœãå¿ èŠãšãªããããRustã®é å(Vecå)ã®æäœã«ãæ £ããããšãã§ããŸãã
ãããæãããäœãã
ãã©ã³ãã䜿ã£ãã²ãŒã ã®äžã§ããããæããã¯ãæãæåãªãã®ã®äžã€ã§ãã誰ããéãã ããšãããã®ã§ãRustã®ããã°ã©ã ãäœãã®ã«è¯ã顿ãšèšããŸãã
ããã§ã¯ãããã°ã©ã ãçãããããã«ããããæããã®ã²ãŒã ã®ã«ãŒã«ãã·ã³ãã«ã«ããããšã«ããŸããããããã§ãåå è ããã¬ã€ã€ãŒãšã³ã³ãã¥ãŒã¿ãŒã®2人ã«éå®ããŸãã
ããã§ã¯ãããã°ã©ã ãäœãã®ã«ããã£ãŠãã²ãŒã ã®æé ãç®æ¡æžãã«ããŠã¿ãŸãããã
1.ãžã§ãŒã«ãŒãå ããã«ãŒããã·ã£ããã«ããŠäºäººã®åå è
ã«åçã«é
ããŸãã
2.ããããã®ææã®ã«ãŒãã®äžã§ãåãçªå·ã®ã«ãŒããããã°ããã¢ã«ããŠæšãŠæã«ããŸãã
3.ãã¬ã€ã€ãŒãã³ã³ãã¥ãŒã¿ãŒã®ææãã1æãåŒããŠãåãæ°åãããã°æšãŠæã«ããŸãã
4.ã³ã³ãã¥ãŒã¿ãŒãã©ã³ãã ã«ãã¬ã€ã€ãŒã®ææãã1æåŒããŠãåãæ°åãããã°æšãŠæã«ããŸãã
5.ã©ã¡ããã®ææããªããªããŸã§ã3-4ãç¹°ãè¿ãè¡ããŸãã
ãããžã§ã¯ããäœæããã
ããã§ã¯ãcargoã³ãã³ããå©çšããŠãããžã§ã¯ããäœæããŸããããRustãã€ã³ã¹ããŒã«ãããšãcargoã³ãã³ãã䜿ããããã«ãªããŸããcargoã³ãã³ãã¯ããããžã§ã¯ãã®ã²ãªåœ¢ãäœæããããã©ã€ãã©ãªããããžã§ã¯ãã«è¿œå ããããã³ã³ãã€ã«ããããšãRustããã°ã©ãã³ã°ã«ã¯æ¬ ãããªãããŒã«ã§ãã
ã¿ãŒããã«(WindowsãªãPowerShellãmacOSãªãã¿ãŒããã«.app)ãèµ·åããŠãäžèšã®ã³ãã³ããå®è¡ããŸãããã
# ãããžã§ã¯ããã©ã«ããäœæ
mkdir old_maid
cd old_maid
cargo init
# ä¹±æ°ã®ãããlazyrandãã¯ã¬ãŒãã远å
cargo add lazyrand
以äžã®æé ã«ãããæ¬¡ã®ãããªãã¡ã€ã«ãäœæãããŸãã
.
âââ Cargo.lock
âââ Cargo.toml
âââ src
âââ main.rs
ãã®äžã®ãsrc/main.rsãã¡ã€ã³ãã¡ã€ã«ã§ãããã®ãã¡ã€ã«ãç·šéããŸããããä»åäœæããããæãã®ããã°ã©ã ã®å šäœã¯ããã¡ãã®Gist( https://gist.github.com/kujirahand/4cdc61414178d4044cce8cf724f45317 )ã«ã¢ããããŒãããŠããŸãã
ããã°ã©ã ãå®è¡ããã«ã¯ãã¿ãŒããã§äžèšã®ã³ãã³ããå®è¡ããŸãã
cargo run
å®è¡ãããšãäžèšã®ããã«ããæããå§ãŸããŸãããã¬ã€ã€ãŒã¯æç€ºã«åŸã£ãŠãçžæã®äœæç®ã®ã«ãŒããåŒãã®ããæ°åãå ¥åããŠ[Enter]ããŒãæŒããŸãããããšã²ãŒã ãé²ãã§ãããŸãã
ãã©ã³ãã«ãŒãã衚çŸããã
ä»åã®æå€§ã®ãã€ã³ããšãªãã®ãããã©ã³ããã©ã®ããã«è¡šçŸããããšããç¹ã«ãããŸãããã©ã³ãã®è¡šçŸæ¹æ³ã¯ãããããããŸãããä»åã¯ãã©ã³ãã®åã«ãŒãã0ãã52ã®ã«ãŒãçªå·ã§è¡šçŸããããšã«ããŸãããããªããRustã®u8åã§è¡šçŸã§ããŸãã
ãããŠã次ã®ç»åã®ããã«ãã«ãŒãçªå·ãšã«ãŒãã®æå³ã察å¿ãããããšã«ããŸãã
ãã®ãããªäžŠã³ã«ããŠããã°ã次ã®èšç®åŒã§ãã«ãŒãçªå·cnoãããããŒã¯ãšã«ãŒãã®æ°åãååŸã§ããŸãã
ã«ãŒãã®ããŒã¯: cno / 13
ã«ãŒãã®çªå·: cno % 13 + 1
ããã§ã次ã®ãããªããã°ã©ã ãäœããŸããã颿°get_card_labelã§ãæè»œã«ããŒã¯ãšæ°åãæååã§ååŸã§ããŸãã
const JORKER: u8 = 52; // ãžã§ãŒã«ãŒã¯52çª
const CARD_SUIT: [&str; 5] = ["â ", "â¥", "â£", "âŠ", ""]; // ã«ãŒãã®ããŒã¯
const CARD_NUMS: [&str; 14] = [ // ã«ãŒãã®æ°åã©ãã«
"Jok", "A", "2", "3", "4", "5", "6",
"7", "8", "9", "10", "J", "Q", "K"];
// ã«ãŒãçªå·ãäžããŠã«ãŒãã®æ°åãååŸãã
fn get_card_num(cno: u8) -> u8 {
if cno == JORKER { 0 } else { cno % 13 + 1 }
}
// ã«ãŒãçªå·ãäžããŠã«ãŒãã®ã©ãã«ãååŸãã
fn get_card_label(cno: u8) -> String {
format!("[{}{:>2}]",
CARD_SUIT[(cno / 13) as usize],
CARD_NUMS[get_card_num(cno) as usize])
}
// --- 颿°ããã¹ãããã³ãŒã ---
mod tests {
use super::*;
#[test]
fn test_get_card_label() {
assert_eq!(get_card_label(52), "[Jok]"); // cnoã52ããžã§ãŒã«ãŒ
assert_eq!(get_card_label(0), "[â A]"); // cnoã®0ã[â A]
assert_eq!(get_card_label(12), "[â K]");
assert_eq!(get_card_label(13), "[⥠A]");
}
}
ãã¢ã®ã«ãŒããèŠã€ããŠåé€ããã
次ã«ãåãæ°åã®ã«ãŒããæ¢ããŠããã¢ãããã°åé€ãã颿°remove_pairãäœã£ãŠã¿ãŸããããããã§ã¯ããã¢ã®æ€åºãšåé€ãå¹çããè¡ãããã«ãã€ã³ããã¯ã¹èšé²çšã®é å exists_nums ã䜿ã£ãŠãäžåºŠèŠã€ããã«ãŒãã®æ å ±ãèŠããŠãããåãæ°åãããäžåºŠåºãŠãããšãã«ãã®2æãåé€å¯Ÿè±¡ãšããŸãã
// ãã¢ãããã°åé€ããŠæšãŠãçµæ°ãè¿ã
fn remove_pair(cards: &mut Vec<u8>) -> usize {
let mut remove_cards = vec![]; // åé€çšã«ã«ãŒãçªå·ãèšé²
let mut exists_nums = [-1; 14]; // ååšããæ°åãèšé²(-1ã¯æªçºèŠ)
// ãã¹ãŠã®ã«ãŒãã調ã¹ãŠãã¢ãæ¢ã --- (â»1)
for i in 0..cards.len() {
let num = get_card_num(cards[i]);
if exists_nums[num as usize] < 0 {
exists_nums[num as usize] = i as isize; // ã€ã³ããã¯ã¹ãèšé²
continue;
}
// ãã§ã«åãæ°åã®ã«ãŒããååšããå Žåã¯åé€ããŒã¯ --- (â»2)
remove_cards.push(i);
remove_cards.push(exists_nums[num as usize] as usize);
exists_nums[num as usize] = -1; // åãæ°åã®ã«ãŒãã¯å逿žã¿
}
let remove_count = remove_cards.len();
// åé€ããŒã¯ã®ã«ãŒããåé€ --- (â»3)
remove_cards.sort();
for &i in remove_cards.iter().rev() {
cards.remove(i);
}
lazyrand::shuffle(cards); // åé€åŸã«ã·ã£ããã«
return remove_count / 2;
}
å ·äœçã«ã¯ã(â»1)ã§ææã®ã«ãŒã(cards)ãå é ãã1ã€ãã€èª¿ã¹ãŠãã£ãŠã倿°exists_numsã«ã«ãŒãã®ã€ã³ããã¯ã¹ãèšé²ããŠãããŸãããããåãæ°åãããã°ã(â»2)ã§åé€å¯Ÿè±¡ãèšé²ãã倿°remove_cardsã«ã«ãŒãã®ãã¢ã远å ããŸãã
ãããŠãæåŸ(â»3)ã«ãŠãremove_cardsãå ã«ã«ãŒããåé€ãããšããæµãã«ãªã£ãŠããŸããããã§æ³šæãå¿ èŠãªã®ã¯ãé åã®æ«å°ŸããèŠçŽ ãåé€ãããšããç¹ã§ããããã¯ã€ã³ããã¯ã¹çªå·ãå€ãããªãããã«ããããã«å¿ èŠãªåŠçã§ãã
ãã¬ã€ã€ãŒãšã³ã³ãã¥ãŒã¿ãŒã®ã¿ãŒã³ãäœãã
äžèšã§äœã£ã颿°ãå©çšããŠãã²ãŒã ã宿ãããŸããããããã€ãäžèšã§ç޹ä»ããŠããªã颿°ããããŸãããããã¯ãã¡ã( https://gist.github.com/kujirahand/4cdc61414178d4044cce8cf724f45317 )ã®æ¹ã§ç¢ºèªããŠãã ããã
fn main() {
// ãžã§ãŒã«ãŒãå ããã«ãŒã(53æ)ãäœæããŠã·ã£ããã« --- (â»1)
let mut cards = (0..53).collect::<Vec<u8>>();
shuffle(&mut cards);
// ããããã®ææã«åé
let mut user_hands = cards[0..26].to_vec();
let mut com_hands = cards[26..].to_vec();
print!("\x1b[2J\x1b[H"); // ç»é¢ãã¯ãªã¢
// ããããã®ææãããã¢ãåé€ --- (â»2)
println!("貎æ¹ã¯{}çµã®ã«ãŒããæšãŠãŸããã", remove_pair(&mut user_hands));
println!("çžæã¯{}çµã®ã«ãŒããæšãŠãŸããã", remove_pair(&mut com_hands));
// ã©ã¡ããã®ææã0ã«ãªããŸã§ç¹°ãè¿ã --- (â»3)
loop {
if check(&user_hands, &com_hands) { break; }
// ãŠãŒã¶ãŒã®å
¥åãååŸ --- (â»4)
let index = input_number(
">>> äœæç®ãåŒããŸãã", com_hands.len());
// ãŠãŒã¶ãŒã®ææã«ã«ãŒãã远å
let card = com_hands.remove(index - 1);
user_hands.push(card);
println!(">>> 貎æ¹ã¯{}ãåŒããŸãã", get_card_label(card));
if check(&user_hands, &com_hands) { break; }
if remove_pair(&mut user_hands) > 0 {
println!(">>> æå!! 貎æ¹ã¯ã«ãŒããæšãŠãŸããã");
if check(&user_hands, &com_hands) { break; }
}
input(">>> [Enter]ãæŒããŠãã ãã");
// ã³ã³ãã¥ãŒã¿ãŒã®çª --- (â»5)
let card = user_hands.remove(randint(0, user_hands.len() as i64 - 1) as usize);
com_hands.push(card);
println!("<<< çžæã貎æ¹ã®ã«ãŒã{}ãåŒããŸããã", get_card_label(card));
if check(&user_hands, &com_hands) { break; }
if remove_pair(&mut com_hands) > 0 {
println!("<<< æ®å¿µ.. çžæã¯ã«ãŒããæšãŠãŸããã");
if check(&user_hands, &com_hands) { break; }
}
}
println!("ã²ãŒã çµäºã§ãã");
}
ã¡ã€ã³ããã°ã©ã ã確èªããŠã¿ãŸãããã(â»1)ã§ã¯ããžã§ãŒã«ãŒãå«ãå šéšã§53æã®ã«ãŒããäœæããŠã·ã£ããã«ããŸãã0ãã51ãæ®éã®ã«ãŒãã§ã52ããžã§ãŒã«ãŒã§ãããã®åŸããŠãŒã¶ãŒã®ææ(user_hands)ãšãã³ã³ãã¥ãŒã¿ãŒã®ææ(com_hands)ã«åå²ããŸãã
(â»2)ã§ã¯ãããããã®ææããåãæ°åã®ã«ãŒããããã°åé€ããŸãã
(â»3)以éãã²ãŒã ã®ã¡ã€ã³ã«ãŒããšãªããŸãããã¬ã€ã€ãŒã®ã¿ãŒã³(â»4)ãšã³ã³ãã¥ãŒã¿ãŒã®ã¿ãŒã³(â»5)ã®åŠçãèšè¿°ããŠããŸãã
ãŸãšã
以äžãä»åã¯ããæããå®è£ ããŠã¿ãŸãããåããããããåªå ããã³ãŒãã«ããŠã¿ãŸããããã®ãããªã«ãŒãã²ãŒã ãäœæããå Žåãé åãVecåã®åºæ¬çãªæäœãé »åºããŸããèªåã§ãã²ãŒã ãå®è£ ããŠã¿ããšã楜ããRustããã°ã©ãã³ã°ã«ãªããããšãã§ããã§ããããæ¬çš¿ãåèã«ãã€ã€äœã£ãŠã¿ããšè¯ãã§ãããã
èªç±åããã°ã©ããŒããããã¯ãã©ã«ãŠãããã°ã©ãã³ã°ã®æ¥œãããäŒããæŽ»åãããŠããã代衚äœã«ãæ¥æ¬èªããã°ã©ãã³ã°èšèªããªã§ããã ãããã¹ã鳿¥œããµã¯ã©ããªã©ã2001幎ãªã³ã©ã€ã³ãœãã倧è³å ¥è³ã2004幎床æªèžãŠãŒã¹ ã¹ãŒããŒã¯ãªãšãŒã¿èªå®ã2010幎 OSSè²¢ç®è ç« åè³ããããŸã§50å以äžã®æè¡æžãå·çãããçŽè¿ã§ã¯ããå€§èŠæš¡èšèªã¢ãã«ã䜿ãããªãããã®ããã³ãããšã³ãžãã¢ãªã³ã°ã®æç§æž(ãã€ããåºç)ããPythonã§ã€ãããã¹ã¯ãããã¢ããª(ãœã·ã )ããå®è·µåã身ã«ã€ãã Pythonã®æç§æž 第2çããã·ãŽããã¯ãã©ã PythonèªååŠçã®æç§æž(ãã€ããåºç)ããªã©ã


