Question about the way to use bitboards.

Discussion of chess software programming and technical issues.

Moderators: hgm, Rebel, chrisw

User avatar
Luis Babboni
Posts: 464
Joined: Sat Feb 28, 2015 4:37 pm
Location: Argentina

Question about the way to use bitboards.

Post by Luis Babboni »

Hi.

I started, the try, to redoing my chess engine Soberango now with bitboards.
I still not sure if I understand right the idea.
For the moment I just completed the move generator for pawns.

Below is the code.
Is in FreeBasic, "in spanish" and have some "Print" sentences to allow me to do some debug.

My question is if this way I choice to do it, is not a too great miss of the advantage of bitboards.

The idea:
I have 32 bitboards named PiezaPosicion that gives the position of the 32 pieces plus some other bitborads as Columna1 (row1); PiezasNegras (black pieces); etc. I have too an Array named ListaMovidas (MovesList) where I put the Desde (from) and Hacia (to) for each move.
I have too 32 integer variables named PiezaValor (PieceValue) that have an 1 for a pawn, a 2 for a knight, etc.

If someone have time to see just one of the Ifs, for example:

If Quienmueve=1 Then

'PEONES BLANCOS:

'Avanza 1:
If ((PiezaPosicion(pieza) And Fila7)=0) And (((PiezaPosicion(pieza) Shl 8) And TodasLasPiezas)=0) Then
Hacia=PiezaPosicion(pieza) Shl 8
ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
Movida=Movida+1
EndIf

I think is enough to understand my idea and give em an opinon if I´m doing a nonsense or something not as bad.

Thanks people for your time!

Code: Select all

Sub MovimientoPeon(ByRef Profundidad As Integer, ByRef Movida As Integer, ByVal pieza As Integer)
	
	Screen 20:Width ,96
	Cls
		
	'Desde:
	Desde=PiezaPosicion(pieza)
		
	If Quienmueve=1 Then
		
		'PEONES BLANCOS:
		
		'Avanza 1:
		If ((PiezaPosicion(pieza) And Fila7)=0) And (((PiezaPosicion(pieza) Shl 8) And TodasLasPiezas)=0) Then
			Hacia=PiezaPosicion(pieza) Shl 8
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering			
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
		EndIf
		
		'Avanza 2:
		If ((PiezaPosicion(pieza) And Fila2)<>0) And (((PiezaPosicion(pieza) Shl 8) And TodasLasPiezas)=0) And (((PiezaPosicion(pieza) Shl 16) And TodasLasPiezas)=0) Then
			Hacia=PiezaPosicion(pieza) Shl 16
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering			
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
		EndIf
 
 		'Come a su izquierda:
 		If ((PiezaPosicion(pieza) And Fila7)=0) And ((PiezaPosicion(pieza) And Columna1)=0) And (((PiezaPosicion(pieza) Shl 7) And PiezasNegras)<>0) Then
 			Hacia=PiezaPosicion(pieza) Shl 7
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
 			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
 			Movida=Movida+1
 		EndIf
 		
 		'Come a su derecha:
 		If ((PiezaPosicion(pieza) And Fila7)=0) And ((PiezaPosicion(pieza) And Columna8)=0) And (((PiezaPosicion(pieza) Shl 9) And PiezasNegras)<>0) Then
 			Hacia=PiezaPosicion(pieza) Shl 9
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
 			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
 			Movida=Movida+1
 		EndIf
 		
 		'Come al paso a su izquierda:
 		If ((PiezaPosicion(pieza) And Fila5)<>0) And ((PiezaPosicion(pieza) And Columna1)=0) And ((PiezaPosicion(pieza) Shr 1) = PeonAlPasoPosicion)  Then
 			Hacia=PiezaPosicion(pieza) Shl 7
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
 			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
 			Movida=Movida+1
 		EndIf
 		
 		'Come al paso a su derecha:
 		If ((PiezaPosicion(pieza) And Fila5)<>0) And ((PiezaPosicion(pieza) And Columna8)=0) And ((PiezaPosicion(pieza) Shl 1) = PeonAlPasoPosicion)  Then
 			Hacia=PiezaPosicion(pieza) Shl 9
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
 			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
 			Movida=Movida+1
 		EndIf
		
		'Corona avanzando:
		If ((PiezaPosicion(pieza) And Fila7)<>0) And (((PiezaPosicion(pieza) Shl 8) And TodasLasPiezas)=0) Then
			Hacia=PiezaPosicion(pieza) Shl 8
			'A Dama:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			ListaMovidas (Profundidad,Movida,3)=6 
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
			'A Torre:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			ListaMovidas (Profundidad,Movida,3)=5 
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
			'A Alfil:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			If BitScanForward64(Hacia) Mod 2<>1 Then
				ListaMovidas (Profundidad,Movida,3)=3	'En fila 8 casilla par es blanca.  
				'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			Else
				ListaMovidas (Profundidad,Movida,3)=4 	'En fila 8 casilla impar es negra.
				'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			EndIf 
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
			'A Caballo:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			ListaMovidas (Profundidad,Movida,3)=2 
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
		EndIf
		
		'Corona comiendo a su izquierda:
		If ((PiezaPosicion(pieza) And Fila7)<>0) And ((PiezaPosicion(pieza) And Columna1)=0) And (((PiezaPosicion(pieza) Shl 7) And PiezasNegras)<>0) Then
			Hacia=PiezaPosicion(pieza) Shl 7
			'A Dama:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			ListaMovidas (Profundidad,Movida,3)=6 
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
			'A Torre:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			ListaMovidas (Profundidad,Movida,3)=5 
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
			'A Alfil:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			If BitScanForward64(Hacia) Mod 2<>1 Then
				ListaMovidas (Profundidad,Movida,3)=3	'En fila 8 casilla par es blanca.  
				'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			Else
				ListaMovidas (Profundidad,Movida,3)=4 	'En fila 8 casilla impar es negra.
				'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			EndIf 
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
			'A Caballo:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			ListaMovidas (Profundidad,Movida,3)=2 
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
		EndIf
		
		'Corona comiendo a su derecha:
		If ((PiezaPosicion(pieza) And Fila7)<>0) And ((PiezaPosicion(pieza) And Columna8)=0) And (((PiezaPosicion(pieza) Shl 9) And PiezasNegras)<>0) Then
			Hacia=PiezaPosicion(pieza) Shl 9
			'A Dama:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			ListaMovidas (Profundidad,Movida,3)=6 
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
			'A Torre:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			ListaMovidas (Profundidad,Movida,3)=5 
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
			'A Alfil:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			If BitScanForward64(Hacia) Mod 2<>1 Then
				ListaMovidas (Profundidad,Movida,3)=3	'En fila 8 casilla par es blanca.  
				'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			Else
				ListaMovidas (Profundidad,Movida,3)=4 	'En fila 8 casilla impar es negra.
				'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			EndIf 
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
			'A Caballo:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			ListaMovidas (Profundidad,Movida,3)=2 
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
		EndIf
		
	Else
	
		'PEONES NEGROS:
Henk
Posts: 7220
Joined: Mon May 27, 2013 10:31 am

Re: Question about the way to use bitboards.

Post by Henk »

32? I only use 6 bitboards. Used to be 7 in previous version.

Can''t understand Spanish. But understanding other people's code always difficult.
User avatar
mvanthoor
Posts: 1784
Joined: Wed Jul 03, 2019 4:42 pm
Location: Netherlands
Full name: Marcel Vanthoor

Re: Question about the way to use bitboards.

Post by mvanthoor »

Luis Babboni wrote: Thu Mar 25, 2021 1:26 pm I have 32 bitboards
One bitboard for each piece?

You only need 12: one for each piece type (KQRBNP = 6 pieces), per color (2).

I also have two extra bitboards: 1 that holds all white pieces, and one for all the black pieces. They get updated incrementally when I move (or remove/capture) a piece. You often need the occupancy (= all pieces) of the board, or where all the pieces of one color are (to quickly determine if a piece is yours, or one of your opponent). By keeping these extra bitboards incrementally, you don't need to run through all the 12 bitboards each time you need to know occupancy per color, or of the entire board.
Author of Rustic, an engine written in Rust.
Releases | Code | Docs | Progress | CCRL
Sven
Posts: 4052
Joined: Thu May 15, 2008 9:57 pm
Location: Berlin, Germany
Full name: Sven Schüle

Re: Question about the way to use bitboards.

Post by Sven »

Luis Babboni wrote: Thu Mar 25, 2021 1:26 pm an opinon if I´m doing a nonsense
So you asked for the truth :P

A very good source of information for this purpose is of course the CPW.

In chess programming a bitboard usually represents a set of square numbers (or shortly: set of squares). "Sets" containing either zero or one element are not as useful as sets containing all elements of a given kind since you need a lot of additional logic to manage all those sets. So you should *not* use 32 bitboards ...

A very typical use of bitboards in a chess engine is as follows (there are certainly some variations on it, although they all follow the same basic idea):

- You store one bitboard per piece type (so six piece type bitboards).
- You store one bitboard per color (so two color bitboards).

- You access the set of all squares occupied by pieces of a given type and color by bitwise ANDing bitboard[pieceType] with bitboard[color]. (But there is no need to store that combination in memory!) So "all white pawns" is "bitboard[Pawn] AND bitboard[White]" and "all black rooks" is "bitboard[Rook] AND bitboard[Black]".

- You access the set of all occupied squares on the board by bitwise ORing bitboard[White] with bitboard[Black], and the set of all empty squares by bitwise negating that "all occupied" bitboard.

- When making/unmaking a move, you only have to update incrementally the following bitboards (with few exceptions for special moves like promotion, castling, ep): for a quiet move you XOR both the bitboard[movingPieceType] and the bitboard[movingPieceColor] with BIT(from) and also with BIT(to) (so you clear the "from" bit and set the "to" bit), and for a capture you additionally clear the BIT(to) in bitboard[capturedPieceType] and bitboard[opponentColor].

- When generating moves, you always process the whole set of (friendly) pieces of a given type. There are some differences between the chess piece types.

For instance, to create all pawn captures by White going to the "upper left" direction you take your bitboard of white pawns, mask away all bits on the A-file (since pawns on the A-file cannot capture to "upper left"), shift that whole bitboard by the constant that means "one rank up and one file to the left" (usually 8-1 = 7), AND the result with bitboard[Black], and have calculated the set of all target squares where a white pawn can capture a black piece. The second step would then be to loop over that resulting set and extract all bits, create a "move" from each bit position (i.e., from each target square) by calculating the "from" (Desde) square as "to" (Hacia) minus the "upper left" constant ("to - 7"), and store that "from/to" move in your move list.

To create all possible moves by black knights you would have two loops: an outer loop over your black knights bitboard that extracts all "from" squares, and for each "from" square an inner loop that extracts all corresponding "to" squares from a (usually precalculated, i.e. "constant") bitboard containing a "1" for each square reachable by a knight from the given "from" square. Of course friendly (here: black) pieces need to be excluded, you do this by ANDing with the negated bitboard[Black].

Generating sliding piece moves requires slightly more work than for pawns, knights and kings since the set of reachable squares heavily depends on the set of occupied squares on the board. There are several different solutions for that problem, where "magic bitboards" is probably the most famous one. See the CPW for more details.
Sven Schüle (engine author: Jumbo, KnockOut, Surprise)
User avatar
maksimKorzh
Posts: 771
Joined: Sat Sep 08, 2018 5:37 pm
Location: Ukraine
Full name: Maksim Korzh

Re: Question about the way to use bitboards.

Post by maksimKorzh »

Luis Babboni wrote: Thu Mar 25, 2021 1:26 pm Hi.

I started, the try, to redoing my chess engine Soberango now with bitboards.
I still not sure if I understand right the idea.
For the moment I just completed the move generator for pawns.

Below is the code.
Is in FreeBasic, "in spanish" and have some "Print" sentences to allow me to do some debug.

My question is if this way I choice to do it, is not a too great miss of the advantage of bitboards.

The idea:
I have 32 bitboards named PiezaPosicion that gives the position of the 32 pieces plus some other bitborads as Columna1 (row1); PiezasNegras (black pieces); etc. I have too an Array named ListaMovidas (MovesList) where I put the Desde (from) and Hacia (to) for each move.
I have too 32 integer variables named PiezaValor (PieceValue) that have an 1 for a pawn, a 2 for a knight, etc.

If someone have time to see just one of the Ifs, for example:

If Quienmueve=1 Then

'PEONES BLANCOS:

'Avanza 1:
If ((PiezaPosicion(pieza) And Fila7)=0) And (((PiezaPosicion(pieza) Shl 8) And TodasLasPiezas)=0) Then
Hacia=PiezaPosicion(pieza) Shl 8
ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
Movida=Movida+1
EndIf

I think is enough to understand my idea and give em an opinon if I´m doing a nonsense or something not as bad.

Thanks people for your time!

Code: Select all

Sub MovimientoPeon(ByRef Profundidad As Integer, ByRef Movida As Integer, ByVal pieza As Integer)
	
	Screen 20:Width ,96
	Cls
		
	'Desde:
	Desde=PiezaPosicion(pieza)
		
	If Quienmueve=1 Then
		
		'PEONES BLANCOS:
		
		'Avanza 1:
		If ((PiezaPosicion(pieza) And Fila7)=0) And (((PiezaPosicion(pieza) Shl 8) And TodasLasPiezas)=0) Then
			Hacia=PiezaPosicion(pieza) Shl 8
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering			
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
		EndIf
		
		'Avanza 2:
		If ((PiezaPosicion(pieza) And Fila2)<>0) And (((PiezaPosicion(pieza) Shl 8) And TodasLasPiezas)=0) And (((PiezaPosicion(pieza) Shl 16) And TodasLasPiezas)=0) Then
			Hacia=PiezaPosicion(pieza) Shl 16
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering			
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
		EndIf
 
 		'Come a su izquierda:
 		If ((PiezaPosicion(pieza) And Fila7)=0) And ((PiezaPosicion(pieza) And Columna1)=0) And (((PiezaPosicion(pieza) Shl 7) And PiezasNegras)<>0) Then
 			Hacia=PiezaPosicion(pieza) Shl 7
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
 			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
 			Movida=Movida+1
 		EndIf
 		
 		'Come a su derecha:
 		If ((PiezaPosicion(pieza) And Fila7)=0) And ((PiezaPosicion(pieza) And Columna8)=0) And (((PiezaPosicion(pieza) Shl 9) And PiezasNegras)<>0) Then
 			Hacia=PiezaPosicion(pieza) Shl 9
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
 			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
 			Movida=Movida+1
 		EndIf
 		
 		'Come al paso a su izquierda:
 		If ((PiezaPosicion(pieza) And Fila5)<>0) And ((PiezaPosicion(pieza) And Columna1)=0) And ((PiezaPosicion(pieza) Shr 1) = PeonAlPasoPosicion)  Then
 			Hacia=PiezaPosicion(pieza) Shl 7
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
 			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
 			Movida=Movida+1
 		EndIf
 		
 		'Come al paso a su derecha:
 		If ((PiezaPosicion(pieza) And Fila5)<>0) And ((PiezaPosicion(pieza) And Columna8)=0) And ((PiezaPosicion(pieza) Shl 1) = PeonAlPasoPosicion)  Then
 			Hacia=PiezaPosicion(pieza) Shl 9
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
 			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
 			Movida=Movida+1
 		EndIf
		
		'Corona avanzando:
		If ((PiezaPosicion(pieza) And Fila7)<>0) And (((PiezaPosicion(pieza) Shl 8) And TodasLasPiezas)=0) Then
			Hacia=PiezaPosicion(pieza) Shl 8
			'A Dama:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			ListaMovidas (Profundidad,Movida,3)=6 
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
			'A Torre:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			ListaMovidas (Profundidad,Movida,3)=5 
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
			'A Alfil:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			If BitScanForward64(Hacia) Mod 2<>1 Then
				ListaMovidas (Profundidad,Movida,3)=3	'En fila 8 casilla par es blanca.  
				'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			Else
				ListaMovidas (Profundidad,Movida,3)=4 	'En fila 8 casilla impar es negra.
				'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			EndIf 
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
			'A Caballo:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			ListaMovidas (Profundidad,Movida,3)=2 
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
		EndIf
		
		'Corona comiendo a su izquierda:
		If ((PiezaPosicion(pieza) And Fila7)<>0) And ((PiezaPosicion(pieza) And Columna1)=0) And (((PiezaPosicion(pieza) Shl 7) And PiezasNegras)<>0) Then
			Hacia=PiezaPosicion(pieza) Shl 7
			'A Dama:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			ListaMovidas (Profundidad,Movida,3)=6 
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
			'A Torre:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			ListaMovidas (Profundidad,Movida,3)=5 
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
			'A Alfil:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			If BitScanForward64(Hacia) Mod 2<>1 Then
				ListaMovidas (Profundidad,Movida,3)=3	'En fila 8 casilla par es blanca.  
				'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			Else
				ListaMovidas (Profundidad,Movida,3)=4 	'En fila 8 casilla impar es negra.
				'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			EndIf 
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
			'A Caballo:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			ListaMovidas (Profundidad,Movida,3)=2 
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
		EndIf
		
		'Corona comiendo a su derecha:
		If ((PiezaPosicion(pieza) And Fila7)<>0) And ((PiezaPosicion(pieza) And Columna8)=0) And (((PiezaPosicion(pieza) Shl 9) And PiezasNegras)<>0) Then
			Hacia=PiezaPosicion(pieza) Shl 9
			'A Dama:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			ListaMovidas (Profundidad,Movida,3)=6 
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
			'A Torre:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			ListaMovidas (Profundidad,Movida,3)=5 
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
			'A Alfil:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			If BitScanForward64(Hacia) Mod 2<>1 Then
				ListaMovidas (Profundidad,Movida,3)=3	'En fila 8 casilla par es blanca.  
				'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			Else
				ListaMovidas (Profundidad,Movida,3)=4 	'En fila 8 casilla impar es negra.
				'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			EndIf 
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
			'A Caballo:
			ListaMovidas (Profundidad,Movida,1)=BitScanForward64(Desde)
			ListaMovidas (Profundidad,Movida,2)=BitScanForward64(Hacia)
			ListaMovidas (Profundidad,Movida,3)=2 
			'ListaMovidas (Profundidad,Movida,4)=Valor para MoveOrdering
			'Print Movida, ListaMovidas (Profundidad,Movida,1),ListaMovidas (Profundidad,Movida,2),ListaMovidas (Profundidad,Movida,3)
			Movida=Movida+1
		EndIf
		
	Else
	
		'PEONES NEGROS:
Maybe this helps:


A step-by-step guide to create a bitboard based move generator in C from scratch in the easiest way possible.
User avatar
lithander
Posts: 881
Joined: Sun Dec 27, 2020 2:40 am
Location: Bremen, Germany
Full name: Thomas Jahn

Re: Question about the way to use bitboards.

Post by lithander »

Sven wrote: Thu Mar 25, 2021 5:28 pm A very typical use of bitboards in a chess engine is as follows [...]
That was a really great introduction! I hadn't looked into the topic yet as it seemed too advanced for what I had in mind with my first engine but you make it sound almost simple! Thanks! :)
Minimal Chess (simple, open source, C#) - Youtube & Github
Leorik (competitive, in active development, C#) - Github & Lichess
User avatar
Luis Babboni
Posts: 464
Joined: Sat Feb 28, 2015 4:37 pm
Location: Argentina

Re: Question about the way to use bitboards.

Post by Luis Babboni »

Thanks! So i did a nonsense. :D
Now I need to read all your info.
I´ll bother you soon again! :D
User avatar
Luis Babboni
Posts: 464
Joined: Sat Feb 28, 2015 4:37 pm
Location: Argentina

Re: Question about the way to use bitboards.

Post by Luis Babboni »

Sven wrote: Thu Mar 25, 2021 5:28 pm ...
The second step would then be to loop over that resulting set and extract all bits, create a "move" from each bit position (i.e., from each target square) by calculating the "from" (Desde) square as "to" (Hacia) minus the "upper left" constant ("to - 7"), and store that "from/to" move in your move list.
...
This seems the step I do not understand how to do it.
User avatar
Luis Babboni
Posts: 464
Joined: Sat Feb 28, 2015 4:37 pm
Location: Argentina

Re: Question about the way to use bitboards.

Post by Luis Babboni »

maksimKorzh wrote: Thu Mar 25, 2021 6:22 pm
Maybe this helps:


A step-by-step guide to create a bitboard based move generator in C from scratch in the easiest way possible.
Thanks maksimKorzh!
But part, important part, of my problem is that I do not know C and in this special case Im very bad listening english :-(
I´ll take a look anyway.
User avatar
Luis Babboni
Posts: 464
Joined: Sat Feb 28, 2015 4:37 pm
Location: Argentina

Re: Question about the way to use bitboards.

Post by Luis Babboni »

Luis Babboni wrote: Fri Mar 26, 2021 2:39 am
Sven wrote: Thu Mar 25, 2021 5:28 pm ...
The second step would then be to loop over that resulting set and extract all bits, create a "move" from each bit position (i.e., from each target square) by calculating the "from" (Desde) square as "to" (Hacia) minus the "upper left" constant ("to - 7"), and store that "from/to" move in your move list.
...
This seems the step I do not understand how to do it.
This is what it is named "serialization"?
I have no understand near nothing of this: :-(
https://www.chessprogramming.org/Bitboard_Serialization