マインスイーパーを開発していてタイル(マス)の状態管理を検討したところ、見たまんまのイメージ通り2次元配列で管理すればやりやすそうです。
配列はイテレータでアクセスする方が安全かつスマートですが、わざわざ2次元配列を使用する場合は、インデックスでアクセスしたいケースが多そうだと想像します。
Kotlinでの実装例として、タイルの状態を表すデータクラス(TileElement)を8 x 16の2次元配列(mTiles)に確保して、爆弾をランダムにセットするコードを記載します。
ソースコード
開発環境は次の通りです。
PC | MacBook Pro(2016年モデル) |
IDE | Android Studio 4.0.1 |
Android SDK | minSdkVersion 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++
}
}
}
}
そそたた
実装方法は、色々あります。
ここでの記載はそれらの一例となります。
コメント