『カタンの開拓者』のアプリを作・・・れるかな?――マップをランダムに
大体の形はできた。資源の配置は、一枚づつ手で色を変更して、なんてことはもちろんせず、エクセル君にやってもらおう。やってもらおうという意気込みはいいが、でもどうやって?
資源の配置はランダムにする。トークン(資源タイルごとの生産力)はABC順にする。もちろん、トークンもランダムにできるのだが、その際には、6と8が固まったらやり直し、とか特殊ルールが出てくるし、私が遊ぶほとんどの場所でABC順なので、それで行く。
では、タイルに資源を割り当てていこう。即ち、色塗りだ。試行錯誤した結果、なんとかやってみたのがこのコード。六角形一つ一つがShapeで、番号が振ってある。その番号のShapeを塗りつぶす色を指定する形。19枚を番号順に並べる必要があるが、一回やればそれでいい。Shapeの番号は、そのShapeを選んだ時に、右上の、通常セルの番号が表示される場所に出てくる。これを見ながら並べる。
次。1行目から19行目のB、C、D列に色の番号を入れる。黄色(255, 255, 0、麦)、緑(0, 176, 80、木)、青(0, 176, 240、羊)が4行ずつ。茶色(131,60,12、土)、灰色(165, 165, 165、鉄)が3行ずつ、黒(0, 0, 0、砂漠)が1行。後で並べ替えるから、入力する際はどういう順番でもいい。
そして、A1からA19 にランダムで数値を入れ、A1 からD19 までをA列を基準にしてソートする。かくしてランダムタイルの出来上がり。
Sub タイル配置()
dim i
‘ A1からA19 に乱数を入れる。
For i = 1 To 19
Randomize
Cells(i, 1).Value = Rnd
Next
‘ 乱数を値貼り付けで固定させる
Range("a1:a19").Copy
Range("a1:a19").PasteSpecial Paste:=xlPasteValues
‘ A列を基準に、A1からD19を昇順にソートする。
Call Range("a1:d19").Sort(key1:=Range("a1"), order1:=xlDescending)
‘ 各Shapeを塗りつぶす。
For i = 1 To 19
ActiveSheet.Shapes(i).Fill.ForeColor.RGB = RGB(Cells(i, 2), Cells(i, 3), Cells(i, 4))
Next
End Sub
乱数を使う際に、Randomizeを入れておかないと、純粋な乱数にならないらしい。
右上の六角形を選んでいると、左上に「六角形1」と表示される。