1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
use std::hash::{Hash, Hasher};
#[derive(Clone, Copy, Debug, Hash, Eq, PartialEq)]
pub enum Mark {
X,
O,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Ply {
pub mark: Mark,
pub coordinates: (usize, usize),
}
impl Hash for Ply {
fn hash<H>(&self, state: &mut H) where H: Hasher {
let mut hash = match self.mark {
Mark::X => 1 as u64,
Mark::O => 0 as u64,
};
hash = (hash << 8) | self.coordinates.0 as u64;
hash = (hash << 8) | self.coordinates.1 as u64;
state.write_u64(hash);
}
}
#[derive(Debug)]
pub enum Resolution {
Win(Mark),
CatsGame,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Board(pub [Option<Mark>; 9], pub u8);
impl Board {
pub fn new() -> Board {
Board([None; 9], 0)
}
pub fn next_mark(&self) -> Mark {
if self.1 % 2 == 0 {
Mark::X
} else {
Mark::O
}
}
}
impl Hash for Board {
fn hash<H>(&self, state: &mut H) where H: Hasher {
self.0.hash(state);
if self.1 % 2 == 0 {
Mark::X.hash(state);
} else {
Mark::O.hash(state);
}
}
}
pub use self::zero_sum::Evaluator;
mod display;
mod zero_sum;