マスを0と1で表現して、2進法の加算で判定する。
fn main() { println!("{:09b}", 0b111000000 & 0b000111111); println!("{:09b}", 0b111000000 & 0b101100010); println!("{:09b}", 0b111000000 & 0b111000010); }
000000000
101000000
111000000
ちなみに、0b111000000など2進数の型はi32
use rand::Rng; static goal:[i32; 8] = [ 0b111000000, 0b000111000, 0b000000111, 0b100100100, 0b010010010, 0b001001001, 0b100010001, 0b001010100]; fn check(player: i32) -> bool { for mask in goal { if player & mask == mask { return true } } return false } fn play(p1: i32, p2: i32) { if check(p2) { println!("{:09b}, {:09b}", p1, p2); return } let board: i32 = p1 | p2; if board == 0b111111111{ println!("{:09b}, {:09b}", p1, p2); return } let mut w = Vec::new(); for i in 0..9 { if board & (1 << i) == 0 { w.push(i); } } let n = w.len() + 1; let mut rnd = rand::thread_rng(); let r = rnd.gen_range(1..n); play(p2, p1 | (1 << r)); } fn main() { play(0, 0); }
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.30s
Running `target/debug/rust`
010001000, 001111000
これはさっぱりわからん…