Mailing List Archive: 49091 messages
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search

[REBOL] "Towers of Hanoi" : Comments please

From: rgombert::essentiel::net at: 18-Feb-2001 21:05

Hi, This is one of my first scripts with REBOL. As i'm not sure of the "better" way to achieve things, i would be happy to receive your comments about this script, and how to code it better, or closer to the REBOL coding 'spirit'. Thanks, Renaud email: [rgombert--essentiel--net] ICQ# 2602184 REBOL [ Title: "Hanoi game (learnig Rebol with...)" Author: "Renaud GOMBERT" Email: "[rgombert--essentiel--net]" Purpose: { The "Towers of Hanoi" Game. Discs of different sizes stays on 3 sticks/stacks. Move one disc at a time from one stack to another. A move is possible only if the destination stick is empty or its top disc is greater than the the one you are moving. The goal is to move the initial stack from the first stick to an other. } ] init: func [ "Initialisation of the hanoi block" n [integer!] "Number of disc to use" /local tmp ][ count: make integer! 0; tmp: make block! [] hanoi: make block! [] for i 1 n 1 [tmp: append tmp i] hanoi: reduce [tmp make block! 0 make block! 0] ] first2: func [ "Return first item, otherwise 99999" blk [block!] ][ if (length? blk) = 0 [return 99999] return first blk ] move: func [ "Move one disc from one stick to another - does not care of game's rules" from [integer!] to [integer!] /local temp tmp ][ temp: make block! [[][][]] tmp: first pick hanoi from for i 1 3 1 [ poke temp i head either i = from [remove hanoi/:i] [either i = to [insert head hanoi/:i tmp][hanoi/:i]] ] count: count + 1 hanoi: copy temp print [count ": move from" from "to" to " : " mold hanoi] ] play: func [ "Play nb disc from one place to an other" from [integer!] "Place to start from" to [integer!] "Place to go to" nb [integer!] "How many disc to move" /local from_state to_state tmp n ][ tmp: pick [0 0 3 2 1] (from + to) either ((length? pick hanoi from) > 0) [ either nb = 1 [ from_state: pick hanoi from to_state: pick hanoi to either (first2 from_state) < (first2 to_state) move from to ][ move to from play from to 2 ] play from tmp (nb - 1) play from to 1 play tmp to (nb - 1) ] ][ print "Can't do that: nothing to move" ] ] ; init a game with 4 discs init 4 ;play the game play 1 3 4