Slider with limited Range Log Out | Topics | Search
Moderators | Register | Edit Profile

Zillions of Games Discussion Forum » Designing Games for Zillions » Slider with limited Range « Previous Next »

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)
)

Add Your Message Here
Post:
Username: Posting Information:
This is a private posting area. Only registered users and moderators may post messages here.
Password:
Options: Enable HTML code in message
Automatically activate URLs in message
Action: