QB64 Phoenix Edition
QBJS - Chess API - Printable Version

+- QB64 Phoenix Edition (https://qb64phoenix.com/forum)
+-- Forum: QB64 Rising (https://qb64phoenix.com/forum/forumdisplay.php?fid=1)
+--- Forum: QBJS, BAM, and Other BASICs (https://qb64phoenix.com/forum/forumdisplay.php?fid=50)
+--- Thread: QBJS - Chess API (/showthread.php?tid=4453)

Pages: 1 2 3 4 5


RE: QBJS - Chess API - TempodiBasic - 02-09-2026

More feedback

the issue is related to checkmate

[Image: JS-Chess-engine-Human-vs-Engine-checkmat...-error.png]

-----------------------
about interface:
6. it is not clear how to change the move  that you are doing... only with an attempt I got that if a type a wrong input endmove the program let me choose another start move.
7. it needed a list of moves made, better if a list in two columns 
8. Takeback is not available

Good Job, expert level is stimulating also if the waiting time is a bit hypnotic. (In this it remembers me the waiting time of BattleChess.)


RE: QBJS - Chess API - TempodiBasic - 02-09-2026

@Bplus
Mark that work has been a joyful experience nevertheless the IA Engine . 
A good experience to translate a previous code made for console output in a graphic interface with mouse support, adaptable interface to view side, of player, the setup of a specific position of game, and let working IA engine for both sides.
Do you remember how well it danced tango when it played against itself?
:-) LOL


RE: QBJS - Chess API - dbox - 02-09-2026

(02-09-2026, 01:17 AM)TempodiBasic Wrote: More feedback

the issue is related to checkmate...
Thanks for all the great feedback!  Looks like I didn't test the win condition enough.  I've made some updates to fix this and provide a clearer game over message.  I've posted an update to the chess API to add the following methods:

RemovePiece
Removes a piece from the board at the specified location.
Code: (Select All)
Chess.RemovePiece "C2"

SetPiece
Sets a piece at the specified board location.
Code: (Select All)
Chess.SetPiece "F1", "k"

These methods make it a lot easier to test out different scenarios and end states.

History
Returns a listing of all moves from the current game.
Code: (Select All)
ReDim hist(0) As Object
hist = Chess.History
For i = 1 To UBound(hist)
    Print i; hist(i).turn; " "; hist.from; " -> "; hist.to
Next i
   

Here's the latest version with the changes:


As far as all of the other UI suggestions, I thought they were great.  Feel free to use this as a starting point.  I'd love to see a @TempodiBasic version.


RE: QBJS - Chess API - dbox - 02-10-2026

I created a consolidated programming reference for the Chess API here:

https://github.com/boxgaming/qbjs-lib/blob/main/chess/js-chess-engine.md


RE: QBJS - Chess API - bplus - 02-10-2026

lunch and a win for desert!
   


RE: QBJS - Chess API - dbox - 02-10-2026

(02-10-2026, 05:53 PM)bplus Wrote: lunch and a win for desert!
Well played!  I think you’re ready for level 2.


RE: QBJS - Chess API - bplus - 02-10-2026

LOL only at lunch time!

+1 I really like this Chess connection one of these days I will workup a proper interface with mouse, if someone else doesn't get there first.

I wonder if we can even work out an Undo, we can probably replay a game up to the previous last move.
I was wondering about an Undo when I started to move one piece but saw a better move, possibly, with another piece; though I won anyway.


RE: QBJS - Chess API - dbox - 02-11-2026

(02-10-2026, 11:14 PM)bplus Wrote: +1 I really like this Chess connection one of these days I will workup a proper interface with mouse, if someone else doesn't get there first.
I'd love to see a bplus version!


RE: QBJS - Chess API - bplus - 02-11-2026

me too!


RE: QBJS - Chess API - bplus - 02-12-2026

@dbox once again QBJS does not like something that works perfectly in QB64.

Code: (Select All)
Function GetMove$
    Dim As String boardX, boardY, retorn, k, b
    Dim As Long mx, my, mb, bx, by

    Do
        While _MouseInput: Wend
        mx = _MouseX: my = _MouseY ' convert into char cells
        mb = _MouseButton(1)
        If mb Then
            Locate 14, 50: Print Space$(15)
            Locate 14, 50: Print mx, my
            boardX = "": boardY = ""
            ' check mx
            If (mx Mod 4) <> 0 Then
                If mx > 4 And mx < 39 Then
                    bx = Int((mx - 4) / 4) + 1
                    boardX = Chr$(64 + bx)
                End If
            End If
            If my Mod 2 = 0 Then
                If my > 3 And my < 19 Then
                    by = Int((my - 2) / 2)
                    boardY = _Trim$(Str$(9 - by))
                End If
            End If
            Locate 15, 50: Print Space$(15)
            Locate 15, 50: Print boardX, boardY
        End If
        If (boardX <> "") And (boardY <> "") Then
            retorn = boardX + boardY
        Else
            k = InKey$
            If Len(k) = 1 And UCase$(k) = "Q" Then
                retorn = k
            Else
                b = b + k
                If Len(b) = 2 Then retorn = b
            End If
        End If
    Loop Until retorn <> ""
    GetMove$ = retorn
End Function

BTW I had to Dim all my variables in the function GetMove$ to get it accepted by QBJS. I thought you fixed all that!

After adding the above routine I commented out the input line in chess program and used GetMove$ to accept mouse clicks or keypresses.

Here is test GetMove$ for QB64, I sim the screen QBJS writes looks like screen 0 as not screen statements say otherwise is that the problem? QBJS has no screen 0. BTW _MouseX and _MouseY in screen 0 of QB64 does char cells not pixels, same with QBJS. Otherwise I dont know why the codes perfectly in QB64 but not QBJS????

Code: (Select All)
' test qbjs get move for chess ' b+ 2026-02-12
Do Until _KeyDown(27)
    PrintBoard
    gm$ = ""
    gm$ = GetMove$
    If gm$ <> "" Then
        Color 7, 0
        Locate 22, 50
        Print gm$; "   zzz... sleeping."
        Sleep
        Cls
        _KeyClear
    End If
Loop

Function GetMove$
    Dim As String boardX, boardY, retorn, k, b
    Dim As Long mx, my, mb, bx, by

    Do
        While _MouseInput: Wend
        mx = _MouseX: my = _MouseY ' convert into char cells
        mb = _MouseButton(1)
        If mb Then
            Locate 14, 50: Print Space$(15)
            Locate 14, 50: Print mx, my
            boardX = "": boardY = ""
            ' check mx
            If (mx Mod 4) <> 0 Then
                If mx > 4 And mx < 39 Then
                    bx = Int((mx - 4) / 4) + 1
                    boardX = Chr$(64 + bx)
                End If
            End If
            If my Mod 2 = 0 Then
                If my > 3 And my < 19 Then
                    by = Int((my - 2) / 2)
                    boardY = _Trim$(Str$(9 - by))
                End If
            End If
            Locate 15, 50: Print Space$(15)
            Locate 15, 50: Print boardX, boardY
        End If
        If (boardX <> "") And (boardY <> "") Then
            retorn = boardX + boardY
        Else
            k = InKey$
            If Len(k) = 1 And UCase$(k) = "Q" Then
                retorn = k
            Else
                b = b + k
                If Len(b) = 2 Then retorn = b
            End If
        End If
    Loop Until retorn <> ""
    GetMove$ = retorn
End Function


Sub PrintBoard ' rework in QB64 to model the board for get move

    Locate 4, 40: Print "Turn:  " '; Chess.Turn; "   "
    Locate 6, 40: Print "Level: " '; levels(aiLevel)
    'Locate 12, 40: Print "Enter 'Q' to Quit"
    'If Chess.IsCheckMate Then
    '    Locate 8, 40: Color 4: Print "Check Mate"
    'ElseIf Chess.IsCheck Then
    '    Locate 8, 40: Color 6: Print "Check"
    'End If

    'PrintHistory

    Locate 1, 1

    'Dim As String bstate, p, s
    'bstate = Chess.BoardPieces
    Dim p$, s$
    Dim As Integer rank, file
    Color 7: Print
    Print "     A   B   C   D   E   F   G   H"
    Print "   ";
    Color 8, 7: Print "|-------------------------------|"
    For file = 8 To 1 Step -1
        Color 7, 0
        Color 7, 0: Print " " + _Trim$(Str$(file)) + " ";


        For rank = Asc("A") To Asc("H")
            '    s$ = Chr$(rank) + _Trim$(Str$(file))
            '    p$ = "" ' bstate(s)
            '    If p$ = "" Then p$ = " "
            '    Color 8, 7: Print " ";
            '    If p$ > "A" And p$ < "Z" Then Color 15 Else Color 0
            '    Print p$;
            '    Print " "
            Color 8, 7: Print "|---";
            'Color 7, 0
        Next rank
        Print "|"
        If file > 1 Then
            Color 7, 0: Print "   ";
            Color 8, 7: Print "|-------------------------------|"
        End If
    Next file
    Color 7, 0: Print "   ";
    Color 8, 7: Print "|-------------------------------|"

End Sub



Note: it does takes the keypresses from the GetMove$ function but you have to Edit above, add () to GetMove function. But the point of all my labors today was todo mouse clicks! Sad