-
Notifications
You must be signed in to change notification settings - Fork 1
/
result.go
88 lines (75 loc) · 1.8 KB
/
result.go
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
package board
import "fmt"
// Result represents the result of a game, if any, with reason.
type Result struct {
Outcome Outcome
Reason Reason
}
func (r Result) IsKnown() bool {
return r.Outcome > Unknown
}
func (r Result) IsTerminal() bool {
return r.Outcome > Undecided
}
func (r Result) String() string {
switch {
case r.IsTerminal():
return fmt.Sprintf("%v { %v }", r.Outcome, r.Reason)
case r.IsKnown():
return r.Outcome.String()
default:
return "?"
}
}
// Outcome represents the result of a game, if any. Result include a special Unknown
// option to better support the lazy movegen approach, where we only discover the
// true result when no legal move exists. 3 bits.
type Outcome uint8
const (
Unknown Outcome = iota // = is one of the below options, but not known which yet
Undecided
WhiteWins
BlackWins
Draw
)
// Win returns a win outcome for the color.
func Win(c Color) Outcome {
if c == White {
return WhiteWins
}
return BlackWins
}
// Loss returns a loss outcome for the color.
func Loss(c Color) Outcome {
if c == White {
return BlackWins
}
return WhiteWins
}
func (o Outcome) String() string {
switch o {
case WhiteWins:
return "1-0"
case BlackWins:
return "0-1"
case Draw:
return "1/2-1/2"
case Undecided:
return "tbd"
default:
return "?"
}
}
// Reason is the reason for a terminal result.
type Reason string
const (
Checkmate Reason = "Checkmate"
Resigned Reason = "Opponent Resigned"
TimedOut Reason = "Opponent lost on time"
Stalemate Reason = "Stalemate"
Repetition3 Reason = "3-Fold Repetition" // can be claimed, but does not have to be
Repetition5 Reason = "5-Fold Repetition"
NoProgress Reason = "No progress"
InsufficientMaterial Reason = "Insufficient Material"
Agreement Reason = "Agreement"
)