『カタンの開拓者』のアプリを作・・・れるかな?――マップをランダムに

大体の形はできた。資源の配置は、一枚づつ手で色を変更して、なんてことはもちろんせず、エクセル君にやってもらおう。やってもらおうという意気込みはいいが、でもどうやって?

 

資源の配置はランダムにする。トークン(資源タイルごとの生産力)は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を入れておかないと、純粋な乱数にならないらしい。

 

f:id:chamcham5628:20200914002152p:plain

右上の六角形を選んでいると、左上に「六角形1」と表示される。