Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
QBJS - Chess API
#11
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.)
Reply
#12
@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
Reply
#13
(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.
Reply
#14
I created a consolidated programming reference for the Chess API here:

https://github.com/boxgaming/qbjs-lib/bl...-engine.md
Reply
#15
lunch and a win for desert!
   
  724  855  599  923  575  468  400  206  147  564  878  823  652  556 bxor cross forever
Reply
#16
(02-10-2026, 05:53 PM)bplus Wrote: lunch and a win for desert!
Well played!  I think you’re ready for level 2.
Reply
#17
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.
  724  855  599  923  575  468  400  206  147  564  878  823  652  556 bxor cross forever
Reply
#18
(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!
Reply
#19
me too!
  724  855  599  923  575  468  400  206  147  564  878  823  652  556 bxor cross forever
Reply
#20
@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
   
  724  855  599  923  575  468  400  206  147  564  878  823  652  556 bxor cross forever
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Amazing Grace to test out Web Audio API CharlieJV 0 441 11-30-2022, 03:09 AM
Last Post: CharlieJV

Forum Jump:


Users browsing this thread: 2 Guest(s)