【Android & Kotlin】2次元配列で確保したデータクラスをインデックス(添字)でアクセスしてみた

Android & Kotlin

マインスイーパーを開発していてタイル(マス)の状態管理を検討したところ、見たまんまのイメージ通り2次元配列で管理すればやりやすそうです。

配列はイテレータでアクセスする方が安全かつスマートですが、わざわざ2次元配列を使用する場合は、インデックスでアクセスしたいケースが多そうだと想像します。

Kotlinでの実装例として、タイルの状態を表すデータクラス(TileElement)を8 x 16の2次元配列(mTiles)に確保して、爆弾をランダムにセットするコードを記載します。

ソースコード

開発環境は次の通りです。

PCMacBook Pro(2016年モデル)
IDEAndroid Studio 4.0.1
Android SDKminSdkVersion 21
targetSdkVersion 30
言語Kotlin 1.3.72
package com.sosotata.minesweeper.ui.main

/**
 * マインスイーパータイル管理(四角形)
 */
class SquareTileManager {
    /** タイル状態定義 */
    private enum class TileState(val state: Int) {
        NUM0(0),
        NUM1(1),
        NUM2(2),
        NUM3(3),
        NUM4(4),
        NUM5(5),
        NUM6(6),
        NUM7(7),
        NUM8(8),
        TILE(9),
        TILE_FLAG(10),
        TILE_QUESTION(11),
        BOMB(12),
        BOMB_HIT(13),
        BOMB_NG(14),
        BOMB_OK(15)
    }

    /** タイル要素  */
    private data class TileElement(var state: TileState, var isBomb: Boolean)

    /** タイル状態管理配列 */
    private var mTiles: Array<Array<TileElement>>

    /** X方向のタイル数 */
    private var mNumX: Int = 0

    /** Y方向のタイル数*/
    private var mNumY: Int = 0

    /** 爆弾数*/
    private var mNumBomb: Int = 0

    init {
        mNumX = 8
        mNumY = 16
        mNumBomb = 20
        mTiles = Array(mNumY) {Array(mNumX) { TileElement(TileState.TILE, false) } }

        // 爆弾をランダムにセット
        var count: Int = 0
        while (count < mNumBomb) {
            val x: Int = (0 until mNumX).random()
            val y: Int = (0 until mNumY).random()
            if (!mTiles[y][x].isBomb) {
                mTiles[y][x].isBomb = true
                count++
            }
        }
    }
}
そそたた
そそたた

実装方法は、色々あります。

ここでの記載はそれらの一例となります。

コメント

タイトルとURLをコピーしました