1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
///////////////////////////////////////////////////////////////////////////////
// Lisaac Example //
// //
// LSIIT - ULP - CNRS - INRIA - FRANCE //
// //
// This program is free software: you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation, either version 3 of the License, or //
// (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
// //
// http://isaacproject.u-strasbg.fr/ //
///////////////////////////////////////////////////////////////////////////////
Section Header
+ name := TOWER;
- bibliography := "http://IsaacOS.com";
- author := "Sonntag Benoit (bsonntag@loria.fr)";
- comment := "The classic Tower of Hanoi game.";
Section Inherit
- parent_object:OBJECT := OBJECT;
Section Private
+ t:ARRAY[INTEGER];
+ top:INTEGER;
Section Public
- full n:INTEGER :SELF <-
( + result:SELF;
result := clone;
result.full_make n;
result
);
- full_make n:INTEGER <-
( ? {n >= 1};
t := ARRAY[INTEGER].create 1 to n;
n.downto 1 do { i:INTEGER;
t.put (n-i+1) to i;
};
top := n;
? {nb = n};
? {top = nb};
? {t.item top = 1};
);
- empty n:INTEGER :SELF <-
( + result:SELF;
result := clone;
result.empty_make n;
result
);
- empty_make n:INTEGER <-
( ? {n >= 1};
t := ARRAY[INTEGER].create 1 to n;
top := 1;
? {nb = n};
? {top = 1};
);
Section HANOI
- nb:INTEGER <- t.upper;
- show_a_discus d:INTEGER <-
( + nb_of_free_slots, nb_of_used_slots:INTEGER;
? {d.in_range d to nb};
nb_of_used_slots := t.item d;
nb_of_free_slots := nb - nb_of_used_slots;
nb_of_free_slots.downto 1 do { i:INTEGER;
' '.print;
};
nb_of_used_slots.downto 1 do { i:INTEGER;
'='.print;
};
'|'.print;
nb_of_used_slots.downto 1 do { i:INTEGER;
'='.print;
};
nb_of_free_slots.downto 1 do { i:INTEGER;
' '.print;
};
);
- remove_discus:INTEGER <-
( + result:INTEGER;
result := t.item top;
t.put 0 to top;
(top > 1).if {
top := top - 1;
};
? { top >= 1};
result
);
- add_discus d:INTEGER <-
(
(t.item top > d).if {
top := top + 1;
t.put d to top;
};
(t.item top = 0).if {
t.put d to top;
};
? { top <= nb };
);
|