マスを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
これはさっぱりわからん…