Skip to content

Commit eb98f62

Browse files
committed
generate rook moves by a simple method
1 parent 0f75f85 commit eb98f62

File tree

2 files changed

+94
-18
lines changed

2 files changed

+94
-18
lines changed

moves.go

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,20 @@ package main
22

33
// directions
44
const (
5-
E = +1
6-
W = -1
7-
N = 8
8-
S = -8
9-
NW = +7
10-
NE = +9
11-
SW = -NE
12-
SE = -NW
5+
E = +1
6+
W = -1
7+
N = 8
8+
S = -8
9+
NW = +7
10+
NE = +9
11+
SW = -NE
12+
SE = -NW
13+
toShift = 6
14+
p12Shift = 6 + 6
15+
cpShift = 4 + 6 + 6
16+
prShift = 4 + 4 + 6 + 6
17+
epShift = 4 + 4 + 4 + 6 + 6
18+
castlShift = 6 + 4 + 4 + 4 + 6 + 6
1319
)
1420

1521
var pieceRules [nP][]int // not pawns
@@ -22,14 +28,21 @@ func init() {
2228
}
2329

2430
type move uint64
31+
32+
func (m *move) packMove(fr, to, p12, cp, pr, ep uint, castl castlings) {
33+
// 6 bits (fr), 6 bits (to), 4 bits (p12), 4 bits (cp), 4 bits (pr), 6 bits (ep), 4 bits (castl), x bits value
34+
*m = move(fr | (to << toShift) | (p12 | p12Shift) | (cp << cpShift) | (pr << prShift) | (ep << epShift) | uint(castl<<castlShift))
35+
}
36+
2537
type moveList []move
38+
2639
func (mvs *moveList) add(mv move) {
2740
*mvs = append(*mvs, mv)
2841
}
2942

3043
var ml = moveList{}
3144

32-
///////////////////////////////
45+
///////////////////////////////
3346
/*
3447
func (m move) pack(fr, to, cp, pr, ep, castl int) move {
3548
packed := uint32(0)
@@ -39,7 +52,7 @@ func (m move) pack(fr, to, cp, pr, ep, castl int) move {
3952
packed |= uint32(pr)<<(6+6+4) // cp needs 4 bits (with color = p12)
4053
packed |= uint32(ep)<<(6+6+4+4) // pr needs 4 bits
4154
packed |= uint32(castl)<<(6+6+4+4+6) // ep needs 6 bits ( and castl needs 4)
42-
// we use 6+6+4+4+6+4 = 30 That means we have 32 bits left for move value
55+
// we use 6+6+4+4+6+4 = 30 That means we have 32 bits left for move value
4356
return move(packed)
4457
}
45-
*/
58+
*/

position.go

Lines changed: 70 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ func (b *boardStruct) setSq(p12, s int) {
159159
}
160160
return
161161
}
162-
162+
163163
b.count[p12]++
164164

165165
p := piece(p12)
@@ -178,15 +178,78 @@ func (b *boardStruct) newGame() {
178178
b.clear()
179179
parseFEN(startpos)
180180
}
181-
func (b *boardStruct) genRookMoves() {
182-
sd := b.stm
183-
frBB := b.pieceBB[Rook] & b.wbBB[sd]
184-
p12 := pc2P12(Rook, sd)
185-
b.genFrMoves(p12, frBB, &ml)
181+
func (b *boardStruct) genRookMoves(ml *moveList, sd color) {
182+
// TODO: generate rook moves with simple method - Benchmark
183+
// TODO: create a non-uci-command pm (print all moves)
184+
// TODO: explain magic numbers/bitboards
185+
// TODO: create tables and methods to use magic numbers
186+
// TODO: generate rook moves with magic bitBoards - Benchmark
187+
188+
allRBB := b.pieceBB[Rook] & b.wbBB[sd]
189+
p12 := uint(pc2P12(Rook, color(sd)))
190+
ep := uint(b.ep)
191+
castl := b.castlings
192+
var mv move
193+
for fr := allRBB.firstOne(); fr != 64; fr = allRBB.firstOne() {
194+
rk := fr / 8
195+
fl := fr % 8
196+
//N
197+
for r := rk + 1; r < 8; r++ {
198+
to := uint(r*8 + fl)
199+
cp := uint(b.sq[to])
200+
if cp != empty && p12Color(int(cp)) == sd {
201+
break
202+
}
203+
mv.packMove(uint(fr), to, p12, cp, empty, ep, castl)
204+
ml.add(mv)
205+
if cp != empty {
206+
break
207+
}
208+
}
209+
//S
210+
for r := rk - 1; r >= 0; r-- {
211+
to := uint(r*8 + fl)
212+
cp := uint(b.sq[to])
213+
if cp != empty && p12Color(int(cp)) == sd {
214+
break
215+
}
216+
mv.packMove(uint(fr), to, p12, cp, empty, ep, castl)
217+
ml.add(mv)
218+
if cp != empty {
219+
break
220+
}
221+
}
222+
//E
223+
for f := fl + 1; f < 8; f++ {
224+
to := uint(rk*8 + f)
225+
cp := uint(b.sq[to])
226+
if cp != empty && p12Color(int(cp)) == sd {
227+
break
228+
}
229+
mv.packMove(uint(fr), to, p12, cp, empty, ep, castl)
230+
ml.add(mv)
231+
if cp != empty {
232+
break
233+
}
234+
}
235+
//W
236+
for f := fl - 1; f <= 0; f-- {
237+
to := uint(rk*8 + f)
238+
cp := uint(b.sq[to])
239+
if cp != empty && p12Color(int(cp)) == sd {
240+
break
241+
}
242+
mv.packMove(uint(fr), to, p12, cp, empty, ep, castl)
243+
ml.add(mv)
244+
if cp != empty {
245+
break
246+
}
247+
}
248+
}
186249
}
187250

188251
func (b *boardStruct) genFrMoves(p12 int, frBB bitBoard, ml *moveList) {
189-
// TODO finish genRookMoves
252+
190253
}
191254

192255
//////////////////////////////////// my own commands - NOT UCI /////////////////////////////////////

0 commit comments

Comments
 (0)