人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

マップを読み込む

マップをファイルから読み込めるようにMapクラスを拡張します。基本的にRPGのマップの読み込みと同じです。これで自由にステージを作れるようになります。

mariolike06.jar

マップファイルの構造

マップファイル(map01.dat)の中身は次のようになってます。スクロール処理を実装しているので画面の大きさより大きくても大丈夫です。

20
60
111111111111111111111111111111111111111111111111111111111111
100000000000000000000000000000000000000000000000000000000001
100000000000000000000000000000000000000000000000000000000001
100000000000000000000000000000000000000000000000000000000001
100000000000000000000000000000000000000000000000000000000001
100000000000000000000000000000000000000000000000000000000001
100000000000000000000000000000000000000000000000000000000001
100000000000000000000000000000000000000000000000000000000001
100000111110000000000000000000000000000000000000111111111111
100000000000000000000000000000000000000000000000000000000001
100000000000000000000000000000000000000011111111000000000001
100000000000000000000000000000001110000000000000000000000001
100000000000000000000000000000000000000000000000000000000001
100000000000000000000000011100000000000000000000000000000001
100000000000000000011100000000000000000000000000001000000001
100000000000000000000000000000000000000000000000000000000001
100001110000011100000000000000000000000001000000000000000001
100000000000000000000000011111111110000001000000000000000001
100000000000000000000000000000000000000001000000000000000001
111111111111111111111111111111111111111111111111111111111111

20は行数、60は列数です。マップは0が何もない空間で1はブロックブロックのイメージを表しています。まあマップに見えますよね。

マップの読み込み

マップを読み込む処理はMapクラスにまとめています。

    // マップ
    private int[][] map;

    // 行数
    private int row;
    // 列数
    private int col;
    // 幅
    private int width;
    // 高さ
    private int height;

幅はマップ全体の幅をピクセルで表した大きさです。高さも同様です。マップを読み込んでいるのはload()です。

    /**
     * マップをロードする
     * 
     * @param filename マップファイル
     */
    private void load(String filename) {
        try {
            // ファイルを開く
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    getClass().getResourceAsStream("map/" + filename)));

            // 行数を読み込む
            String line = br.readLine();
            row = Integer.parseInt(line);
            // 列数を読み込む
            line = br.readLine();
            col = Integer.parseInt(line);
            // マップを作成
            map = new int[row][col];
            for (int i = 0; i < row; i++) {
                line = br.readLine();
                for (int j = 0; j < col; j++) {
                    map[i][j] = Integer.parseInt(line.charAt(j) + "");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

特に改めて解説することもないかな。コメントのとおりです。RPGの追記でも書きましたがテキストファイルでマップを作るのはファイルサイズの問題から好ましくないです。マップエディタを作ってバイナリ形式で保存するのがいいと思います。