randomize
num = 7, 8 // 一列の数(X, Y)
size = 40, 30 // ボタンサイズ(X, Y)
jirai = 10 // 地雷数
dim no, num.0 * num.1 // -2:開放済 -1:地雷 0-9:周辺地雷数
screen 0, size.0 * num.0, size.1 * num.1
font "", size.1
objsize size.0, size.1
*init
flg = 0 // 0:未クリア 1:アウト 2:クリア
timer = 150 // 残り時間
zan = num.0 * num.1 - jirai
// 地雷埋め込み
memset no, 0, num.0 * num.1 * 4
repeat jirai
rnd r, num.0 * num.1
if no.r : continue cnt : else : no.r = -1
loop
// 地雷の隣接数ヒント埋め込み
repeat num.0 * num.1
if no.cnt = -1 {
// 左部の地雷数を増やす
i = cnt - 1
if i >= 0 & (i \ num.0 ! (num.0 - 1)) : if no.i ! -1 : no.i++
// 上部の地雷数を増やす
i = cnt - num.0
if i >= 0 : if no.i ! -1 : no.i++
// 右部の地雷数を増やす
i = cnt + 1
if i < (num.0 * num.1) & (i \ num.0 ! 0) : if no.i ! -1 : no.i++
// 下部の地雷数を増やす
i = cnt + num.0
if i < (num.0 * num.1) : if no.i ! -1 : no.i++
// 左上の地雷数を増やす
i = cnt - num.0 - 1
if i >= 0 & (i \ num.0 ! (num.0 - 1)) : if no.i ! -1 : no.i++
// 右上の地雷数を増やす
i = cnt - num.0 + 1
if i >= 0 & (i \ num.0 ! 0) : if no.i ! -1 : no.i++
// 左下の地雷数を増やす
i = cnt + num.0 - 1
if i < (num.0 * num.1) & (i \ num.0 ! (num.0 - 1)) : if no.i ! -1 : no.i++
// 右下の地雷数を増やす
i = cnt + num.0 + 1
if i < (num.0 * num.1) & (i \ num.0 ! 0) : if no.i ! -1 : no.i++
}
loop
// ボタンとヒントを配置
redraw 0
color 255, 255, 255 : boxf : color
repeat num.0 * num.1
pos cnt \ num.0 * size.0 + (size.1 / 3), cnt / num.0 * size.1
if no.cnt = -1 : mes "*" : else : if no.cnt : mes no.cnt
pos cnt \ num.0 * size.0, cnt / num.0 * size.1 : button "", *push
loop
redraw 1
*main
title "残開放数:" + zan + " 残り時間:" + timer
wait 100
if timer <= 1 : flg = 1 : else : timer--
if flg : goto *finish : else : goto *main
*push
id = stat // 押されたボタンID
zan--
clrobj id, id // 一括消去ロジックは入れない
// 地雷を踏んだ
if no.id = -1 {
flg = 1
// 安全マスを踏んだ
} else {
if zan < 1 : flg = 2 : else : goto *main // 残りマスが地雷だけならクリア
}
*finish
clrobj
if flg = 1 {
dialog "Game Over !", 1
} else {
dialog "Game Clear !"
}
dialog "Play Again ?", 2
if stat = 6 : goto *init
dialog "Thanks for Playing !!!"
|