← Back to context

Comment by stevage

2 years ago

Yes, I found those rules unclear.

My version:

1. The goal is to capture all the black pieces, which never move.

2. Move one white piece each turn, using the basic rules of chess piece movement. You can't move through red obstacles. Pawns don't promote. There is no check.

3. When you capture a piece (black or white), your white piece turns into the type of piece you just captured.

Here is the updated code. Push D to destroy the selected white piece (if it meets the criteria for being destroyed).

  ; Echo Chess
  
  (InputXY)
  
  (Control
    (INIT $Cursor 1 1 0 0 Create =@cur)
  )
  
  ($Cursor
    Player
    (Image "Cursor0" "Cursor1")
    (DefaultImage ())
    (Density -10)
    (CREATE LOOP 0 1 50 Animate)
  )
  
  ($Tile
    (Image "Tile0" "Tile1")
    (Density 10)
    (INIT Loc + 1 band =Image)
    (CLICK @cur ,ObjBelow #Move Loc ,Send . 1)
  )
  
  ($White
    Input
    (Image "P" "N" "B" "R" "Q" "K")
    (CLICK @cur Loc ,MoveTo)
    (#Move
      ,:movable
      if
        Arg1 Arg2 MoveTo .
        Arg3 if
          From ,Image =Image
          From ,Destroy .
          (=P $Black) lnot if WinLevel then
        then
        @cur Loc ,MoveTo .
      then
    )
    (:movable
      Image (case
        (0 :pawn)
        (1 :knight)
        (2 :bishop)
        (3 :rook)
        (4 :queen)
        (5 :king)
      )
    )
    (:pawn Yloc Arg2 1 + eq Xloc Arg1 Delta Arg3 eq land)
    (:knight Xloc Arg1 Delta dup * Yloc Arg2 Delta dup * + 5 eq)
    (:bishop Xloc Arg1 Delta Yloc Arg2 Delta eq if =:queen else 0 then)
    (:rook Xloc Arg1 Delta Yloc Arg2 Delta land if 0 else =:queen then)
    (:queen From Seek =%d Loc begin %d NewXY over over ObjTopAt dup From eq if . . ret then ,Class $Tile ne until . . 0)
    (:king From Chebyshev 1 eq)
    (#Destroy
      From Self ne if
        From #Move Loc 1 ,SendEx .
      then
      Destroyed lnot
    )
    ('D
      @cur Coloc if
        $White #Destroy Loc BroadcastAnd .
      then
    )
  )
  
  ($Black
    (Image "PB" "NB" "BB" "RB" "QB" "KB")
    (CLICK @cur ,ObjBelow #Move Loc 1 ,SendEx . 1)
  )

It is also possible to add more pieces e.g. Chinese cannon, or other kind of changes if desired.

Yes, that is much better.

Then, the code that I wrote is OK (I think) except I did not implement capturing white pieces (although if white pieces can capture white pieces and change into the same piece, then effectively the white piece can become vacant if it can reach another white piece).