5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-16

はじめに

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

定義

  • 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を用いているので、一応分割的ではあるが、斜めに分割されると、部屋が被るときがある
    • これに関しては、点と点をうまく結ぶことで回避は可能

まとめ

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

ソース

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?