example:Chess

This is the start of a chess game for RETRO.

It's based heavily on an earlier, two player system for Retro 11.

Begin a private namespace.

~~~{{   ~~~

Setup the default board.

We use an ASCII character for each piece.

| Char | Represents | | ---- | ---------- | | r | Rook | | n | Knight | | b | Bishop | | q | Queen | | k | King | | p | Pawn |

Lowercase is used for black pieces, UPPERCASE for white.

~~~  :str:, (s-)    [ , ] s:for-each ;        'Blank d:create   'rnbqkbnrpppppppp str:,   '................ str:,   '................ str:,   'PPPPPPPPRNBQKBNR str:, #0 , ~~~

The default board (named Blank) won't be directly used. I create a second board for the actual gameplay.

~~~  'Board d:create   #64 allot   ~~~

Next up, the fundamentals of the display.

It'll display like this:

    0_1_2_3_4_5_6_7   +-----------------+ 0 | r n b q k b n r | 1 | p p p p p p p p | 2 | . . . . . . . . | 3 | . . . . . . . . | 4 | . . . . . . . . | 5 | . . . . . . . . | 6 | P P P P P P P P | 7 | R N B Q K B N R |   +-----------------+     0_1_2_3_4_5_6_7

So first up, the columns.

~~~  :cols (-)     '____0_1_2_3_4_5_6_7 s:put nl ; ~~~

Then a horizontal separator.

~~~  :--- (-)       '__+-----------------+ s:put nl ; ~~~

And then a row.

Possible Future:

~~~  :row (a-a)     '%n_|_ s:format s:put     #8 [ fetch-next c:put sp ] times     $| c:put nl ; ~~~

These will be tied together a little later into the top level display word.

~~~  :get (rc-a) swap #8 * &Board + + ; ---reveal---   :chess:display (-)     nl cols ---     &Board #0 row            #1 row            #2 row            #3 row            #4 row            #5 row            #6 row            #7 row drop     --- cols nl ;   :chess:new (-)     &Blank &Board #64 copy ;   :chess:move (rcrc-)     get [ get ] dip swap     dup fetch swap $. swap store     swap store ; ~~~

Close the private namespace.

~~~}} ~~~

~~~  chess:new   #0 #0 #2 #1 chess:move chess:display ~~~