rust
CUI
clustering
Rogue
ncurses

クラスタリングでRogue風MAP(部屋の部分)生成

はじめに

クラスタリングを覚えたのでなんかに応用してしてみたいと思った結果こうなりました。

定義

  • Mapのサイズ
    • 幅: 64
    • 高さ: 32
  • 部屋の数
    • 2 ~ 9個をランダムに決定
  • 使用したライブラリ
    • ncurses v5.86.0
    • rand v0.3
  • クラスタリングアルゴリズム
    • K-Means

実装内容

  1. マップの中に点をランダムにいくつか生成する
  2. 生成した点をクラスタリングする
  3. クラスタリングされた点の群から、最小のx,yを左上、最大のx,yを右下として四角く部屋とする

動作イメージ

点を生成

  • 数値はlabelに相当します
  • 数値の隣にドット(.)がついているのはそのラベルのセントロイドです

点をクラスタリング

クラスタリングした点から部屋のサイズを取得

  • label内の点の最小のx,yが左上、最大のx,yが右下の四角い部屋を作成したいので、その値を取得
  • ここでは、左上のx,yとそこからのwidthとheightを取得しています

point.png

部屋のサイズから、実際にマップに描画

問題点

  • 部屋数を現在ランダムで決定しているので、クラスタリングが失敗するときがある
  • K-Meansを用いているので、一応分割的ではあるが、斜めに分割されると、部屋が被るときがある
    • これに関しては、点と点をうまく結ぶことで回避は可能

まとめ

  • クラスタリングで部屋生成することができた
  • 他のクラスタリング手法を使えばバリエーションも増やせそうに感じた

ソース