28 czerwca 2009

Labirynt cz II

Normalnie bym nie pisał - bo sesja, ale udało mi się odratować kod źródłowy słynnego już labiryntu. Oto i on:

Rysuj
| form pen ile i |
form := Display.
pen := Pen newOnForm: form.
pen up.
form fillWhite.

ile := lab size.
i := 1.
[i <= ile] whileTrue:
[
pen goto: (lab at: i).
pen down.
pen goto: (lab at: (i+1)).
pen up.
i := i + 2.
]

pen goto: 0@0.
pen down.
pen goto: (10*xsize)@0.
pen goto: (10*xsize)@(10*(ysize // 2)).
pen goto: 0@(10*(ysize // 2)).
pen goto: 0@0.
pen up.

pen goto: 0@(10*((ysize // 2) +1)).
pen down.
pen goto: (10*xsize)@(10*((ysize // 2) +1)).
pen goto: (10*xsize)@(10*ysize).
pen goto: 0@(10*ysize).
pen goto: 0@(10*((ysize // 2) +1)).
pen up.

pen goto: 0@(10*((ysize // 2) +1) + 1).
pen down.
pen goto: (10*xsize)@(10*((ysize // 2) +1) + 1).
pen up.

pen goto: 0@(10*((ysize // 2)) - 1).
pen down.
pen goto: (10*xsize)@(10*((ysize // 2)) - 1).
pen up.

[Sensor keyboardPressed] whileFalse: [].
Display restore.

Stworz: x y: y
| r v |
xsize := x.
ysize := y.
r := Random new.
lab := OrderedCollection new.
0 to: (x-1) do:
[:x1 |
0 to: (y-1) do:
[:y1 |
(y1 = (y // 2)) ifFalse:
[
v := r nextInt: 5.
(v > 2) ifTrue:
[ lab addLast: (10*x1)@(10*y1)
lab addLast: (10*(x1+1))@(10*y1) ].
(v < 4) ifTrue:
[ lab addLast: (10*x1)@(10*y1)
lab addLast: (10*x1)@(10*(y1+1)) ].
].
].
].

Brak komentarzy: