| Author |
Message |
Roger J Cooper (Rogercooper)
New member Username: Rogercooper
Post Number: 39 Registered: 7-2000
| | Posted on Saturday, December 16, 2017 - 1:39 am: | |
I am working on a chess variant with pieces that move like rooks, but only to a maximum # of squares. I was able to create a piece that moves 5 with this ugly code. (define travel1 ($1 (available) add) ) (define travel2 ($1 (verify empty?) $1 (available) add) ) (define travel3 ($1 (verify empty?) $1 (verify empty?) $1 (available) add) ) (define travel4 ($1 (verify empty?) $1 (verify empty?) $1 (verify empty?) $1 (available) add) ) (define travel5 ($1 (verify empty?) $1 (verify empty?) $1 (verify empty?) $1 (verify empty?) $1 (available) add) ) & (moves (travel1 n) (travel2 n) (travel3 n) (travel4 n) (travel5 n) (travel1 e) (travel2 e) (travel3 e) (travel4 e) (travel5 e) (travel1 s) (travel2 s) (travel3 s) (travel4 s) (travel5 s) (travel1 w) (travel2 w) (travel3 w) (travel4 w) (travel5 w) ) There must be a more elegant solution. Any ideas? |
Mohamed El Mokhtar Messaoudi (Noggluggoid)
New member Username: Noggluggoid
Post Number: 20 Registered: 5-2016
| | Posted on Saturday, December 16, 2017 - 9:42 am: | |
Try this. Define a series of 6 flags, called 0step to 6steps, say. Initialize the lot before moving the Rook: (define init-flags (set-flag 0step true)(set-flag 1step false) (set-flag 2steps false)(set-flag 3steps false) (set-flag 6steps false)(set-flag 5steps false)) Update the flags after each step: (define go-once (if (flag? 0step)(set-flag 0step false)(set-flag 1step true) else (if (flag? 1step)(set-flag 1step false)(set-flag 2steps true) else (if (flag? 2steps)(set-flag 2steps false)(set-flag 3steps true) else (if (flag? 3steps)(set-flag 3steps false)(set-flag 4steps true) else (if (flag? 4steps)(set-flag 4steps false)(set-flag 5steps true) else (verify false))))))) ;as a safe-guard. Redefine the Rook move, and tweak the macro till desired result is achieved (if ever). For instance: (define travel ((init-flags) (while (empty? $1) $1 (go-once) (available) ;the content of (available) may meddle with things. add))) Alternatively, you could define 4*4=16 additional orthogonal directions, and retain your definitions above, which should be simplified to just the one (define travel ($1 (available) add) ), where $1 stands for one of the 20 directions. |
Mohamed El Mokhtar Messaoudi (Noggluggoid)
New member Username: Noggluggoid
Post Number: 21 Registered: 5-2016
| | Posted on Saturday, December 16, 2017 - 11:39 am: | |
Strike the last suggestion, by which rook moves are actually leaps; I overlooked the fact that all rook paths must be unobstructed. Sorry. |
Mats Winther (M_winther)
New member Username: M_winther
Post Number: 7 Registered: 5-2017
| | Posted on Thursday, December 21, 2017 - 4:58 am: | |
The code looks fine. |
Mohamed El Mokhtar Messaoudi (Noggluggoid)
New member Username: Noggluggoid
Post Number: 22 Registered: 5-2016
| | Posted on Friday, December 22, 2017 - 10:41 am: | |
(I trust you spotted the typo in the (init-flags) macro.) |
Malcolm James Webb (Mjw)
New member Username: Mjw
Post Number: 31 Registered: 5-2008
| | Posted on Monday, December 25, 2017 - 12:50 am: | |
What about the following: (define step5 ($1 (if empty? add $1) (if empty? add $1) (if empty? add $1) (if empty? add $1) (verify not-friend?) add) ) Then in the piece definition: (moves (step5 n) (step5 s) (step5 e) (step5 w) ) |