2

マウスクリックイベントなしで、参照として PBE-Lighoutgame を使用して迷路を作成しようとしています。2 つのクラスがあります。

これらのクラスは両方とも RectangleMorph のサブクラスです

 VisibleSquare>>initialize
  "Visible borders with Some Color"

その他のクラス

  InvisbleSquare>>initialize
   "Everything is transparent Including Borders"

BorderedMorph のサブクラスである Maze Class の実装

 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 と InvisibleSquare の両方でマトリックスを集計するにはどうすればよいですか (または) これを行う他の方法はありますか??

4

1 に答える 1

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 に備わっていると思われる関数型プログラミング機能を実装するのが楽しいアルゴリズムがいくつかあるでしょう。ウィキペディアの Maze Generation Algorithms に関するページを見てみましょう。このページはこのページに基づいており、さまざまな言語のコード サンプルが掲載されています。

于 2013-02-28T06:49:13.657 に答える