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: