-- / --
--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

10 / 06
Sun

また Scala です。 Java にはない新しいことがたくさんあるので、 調べてると飽きません。 そろそろドット絵も描かないとですね・・・。

RPG のマップを管理するクラスを作ってました。 タイルデータは 2 次元配列で管理しています。 配列の長さとか内容とかが変化する可能性があるので、 scala.collection.mutable パッケージにある ArrayBuffer クラスを使っています。 まず、 クラス内でこんな感じで初期化されます。

private var map: ArrayBuffer[ArrayBuffer[Int]] = new ArrayBuffer[ArrayBuffer[Int]]

で、 コンストラクタで外部ファイルを読み込んで、 タイルデータを格納していきます。

val source: Source = Source.fromFile("data/data/map/" + number + "-" + floor + ".txt")
val regexData: Regex = "([\\d\\s,]+)".r
try {
  for (line <- source.getLines) {
    line match {
    case regexData(data) =>
      map += ",".r.split(line).to[ArrayBuffer].map((string: String) => string.trim.toInt)
    case _ =>
    }
  }
} finally {
  source.close
}

この段階ではわざわざ case ~ match 構文を使う必要はないんですが、 今後ファイルから読み込むデータが増えたときに簡単に追加できるよう、 この構文を使って書いておきました。 あ、 number と floor は、 それぞれマップ番号と (ダンジョンなどの) 階層が格納してある変数です。

map += ~ の部分が複雑になっちゃったんですよね。 まず、 split メソッドでコンマごとに区切ったリストを生成し、 それを to メソッドで ArrayBuffer オブジェクトに変換した後、 map メソッドで要素を Int オブジェクトに変換してます。 (string: String) => string.trim.toInt_.trim.toInt と書けばそれで十分ですが、 アンダースコアはあまり使いたくないのです。

そうそう、 最初は string.trim.toIntstring.toInt だけにしていたので、エラー吐かれて困ってました。 どうやら先頭に空白があると変換できないみたいですね。 融通が利かないなぁ・・・。 Ruby では " 12".to_i はちゃんと機能しましたよ?

あ、 あと case _ => も書き忘れてて困ってました。 case ~ match 構文はパターンが網羅されてないとだめっぽいです。

スポンサーサイト

comment ×0
コメント
管理者にだけ表示を許可する
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。