创造一个迷宫

时间:2013-02-28 04:54:58

标签: smalltalk pharo morphic

我正在尝试使用PBE-Lighoutgame创建一个迷宫作为我的参考,没有鼠标点击事件 我有2个班级

这两个类都是RectangleMorph的子类

 VisibleSquare>>initialize
  "Visible borders with Some Color"

其他班级

  InvisbleSquare>>initialize
   "Everything is transparent Including Borders"

实现作为BorderedMorph

的子类的Maze类
 Maze>>initialize
 initialize
|sampleCell width height n sample|
super initialize.
self borderWidth: 0.   
n := self cellsPerSide.
sampleCell := VisibleSquare  new.
sample:= InvisibleSquare new.
width := sampleCell width.
height := sample height.
self bounds: (5@5 extent: ((width + n) @ (height + n)) + (2 * self borderWidth)).
cells := Matrix new: n tabulate: [:i :j | self newCellAt: i at: j].

其他方法

Maze>>  newCellAt: i at: j
"Create a cell for position (i,j) and add it to my on-screen
representation at the appropriate screen position. Answer the new cell"
|c origin b |
c := VisibleSquare   new.
origin := self innerBounds origin.
self addMorph: c.
c position: ((i - 1) * c width) @ ((j - 1) * c height) + origin.
 ^ c

如何使用VisibleSquare和& amp; InvisibleSquare这样它们可以随机添加到网格中(或者)有没有其他方法可以做到这一点?

1 个答案:

答案 0 :(得分:2)

不会生成一个随机数就是这样吗?

rnd := (1 to: 100) atRandom.

获得后,您可以将其他消息分配给接收方c

(rnd > 50) ifTrue:[c := VisibleSquare new]
(rnd < 51) ifTrue:[c := InvisibleSquare new]

......我认为也可以表达为

c := rnd > 50 ifTrue[VisibleSquare new] ifFalse:[InVisibleSquare new]

也许这就是你想知道的。然而,由于这是为了生成迷宫布局,你可能应该想出一些比随意放置墙壁更复杂的东西。可能有一些算法很有趣,实现了smalltalk似乎配备的功能编程功能。考虑查看Wikipedia page on Maze Generation Algorithms所基于的this page,其中包含各种语言的代码示例。