〜 オブジェクト 〜
同一ジャンプ先のボタンを配置

ボタンは便利なコントロールで、配置位置とサイズ、ボタン押下時の処理を行うラベルを最低限指定すれば
プログラム利用者がボタンを押した時のイベントを処理させることが出来ます。
ボタンに結びつけるジャンプ先設定は必須であり、別々のラベルを指定できますが、
近似した処理である場合に別々のラベルをジャンプ先とすると、
スクリプトのサイズ・可読性、スクリプト変更時の手間等々がジャンプ先の数に比例して増えて面倒です。
同一ジャンプ先だと、どのボタンからジャンプされたのかわからないのではと
考える方もいると思うので書いておきますが、
ジャンプ先ラベルで「statに押されたボタンのオブジェクトIDがセットされる」ようになっていますので、
例えば「選択クイズの解答をボタンにした時の押された番号」や
「マインスイーパのような回答ボタンの配置」でも難なく処理させることが可能です。
下記のサンプルは「必要最低限の機能を備えたマインスイーパ」になります、参考にどうぞ。
	
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
	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 !!!"
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
	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
		r = rnd(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 !!!"
	end