Je traite l'échiquier sous forme de matrice carrée (8,8) (si vous préfère avec un tableau de 8 lignes et 8 colonnes ).
Reste le problème de mémorisé dans chaque case de la matrice le type de pion ainsi que sa couleur.
Voila entre autre à quoi peuvent servir les opérateurs logiques
Voila une exemple avec une partie (adapté pour l'exemple) de mon code.
Nb: Ne voulant pas vous imposé le chargement d'images les pions ne sont pas représentés visuellement mais seulement en mémoire
Utilisation: déplacez la souri à l'emplacement d'un pion, si vous avez déjà joué au échecs cela ne devrait pas posé de problème
Code : Tout sélectionner
Global Dim ChessBoard.l(8,8)
EnableExplicit
#CaseSize=64
#Rook=$00000001
#Knight=$00000002
#Bishop=$00000004
#King=$00000008
#Queen=$00000010
#Pawn=$00000020
#WhiteC=$01000000
#BlackC=$10000000
Enumeration
#MainForm
#Canvas
EndEnumeration
Declare OpenForm()
Declare DrawChessBoard()
Declare ManageStartChessPawn()
Declare Exit()
Declare ManageCanvas()
Declare WhoIsThere(Line,Column)
Procedure OpenForm()
Protected W=(8 * #CaseSize),H=(8 * #CaseSize)
OpenWindow(#MainForm,0,0,W,H,"Pb chess board",$CB0001)
CanvasGadget(#Canvas,0,0,W,H,#PB_Canvas_Key)
BindGadgetEvent(#Canvas,@ManageCanvas())
BindEvent(#PB_Event_CloseWindow,@Exit(),0)
AddKeyboardShortcut(0,#PB_Shortcut_Escape,0)
BindEvent(#PB_Event_Menu,@Exit(),0,0)
ManageStartChessPawn()
DrawChessBoard()
EndProcedure
Procedure DrawChessBoard()
Protected Dim Color(2),nColor=1,i,j,X,Y
Color(0)=$B5E4FF
Color(1)=$13458B
StartDrawing(CanvasOutput(#Canvas))
DrawingMode(#PB_2DDrawing_Default)
For i=0 To 7
X=0
nColor+1
If nColor>1
nColor=0
EndIf
For j=0 To 7
Box(X,Y,#CaseSize,#CaseSize,Color(nColor))
nColor+1
If nColor>1
nColor=0
EndIf
X+#CaseSize
Next
Y+#CaseSize
Next
StopDrawing()
EndProcedure
Procedure ManageStartChessPawn()
Protected i
; Black chess pawns
ChessBoard(0,0)=#BlackC|#Rook
ChessBoard(0,1)=#BlackC|#Knight
ChessBoard(0,2)=#BlackC|#Bishop
ChessBoard(0,3)=#BlackC|#Queen
ChessBoard(0,4)=#BlackC|#King
ChessBoard(0,5)=#BlackC|#Bishop
ChessBoard(0,6)=#BlackC|#Knight
ChessBoard(0,7)=#BlackC|#Rook
For i=0 To 7
ChessBoard(1,i)=#BlackC|#Pawn
Next
; white chess pawns
ChessBoard(7,0)=#WhiteC|#Rook
ChessBoard(7,1)=#WhiteC|#Knight
ChessBoard(7,2)=#WhiteC|#Bishop
ChessBoard(7,3)=#WhiteC|#Queen
ChessBoard(7,4)=#WhiteC|#King
ChessBoard(7,5)=#WhiteC|#Bishop
ChessBoard(7,6)=#WhiteC|#Knight
ChessBoard(7,7)=#WhiteC|#Rook
For i=0 To 7
ChessBoard(6,i)=#WhiteC|#Pawn
Next
EndProcedure
Procedure Exit()
CloseWindow(#MainForm)
End
EndProcedure
Procedure ManageCanvas()
Protected MousePosX,MousePosY,CurrentLine.w,CurrentColumn.w
MousePosY=GetGadgetAttribute(#Canvas,#PB_Canvas_MouseY)
MousePosX=GetGadgetAttribute(#Canvas,#PB_Canvas_MouseX)
CurrentLine=MousePosY/#CaseSize
CurrentColumn=MousePosX/#CaseSize
Select EventType()
Case #PB_EventType_MouseMove
WhoIsThere(CurrentLine,CurrentColumn)
EndSelect
EndProcedure
Procedure WhoIsThere(Line,Column)
Protected CurrentPiece,Message.s="Je suis "
If ChessBoard(Line,Column)>0
CurrentPiece=ChessBoard(Line,Column)&$00FFFFFF ; Extract the piece value only
Select CurrentPiece
Case #Pawn
Message+"un Pion"
Case #Rook
Message+"une Tour"
Case #King
Message+"le Roi"
Case #Queen
Message+"la Reine"
Case #Knight
Message+"un cavalier"
Case #Bishop
Message+"un Fou"
EndSelect
If ChessBoard(Line,Column)&#WhiteC
Message+" blanc"
Else
Message+" noir"
EndIf
Debug Message
EndIf
EndProcedure
OpenForm()
Repeat:WaitWindowEvent():ForEver