スロット

今回はちょっと前(2002年9月10日現在)に掲示板でスロットの質問があり、

講座で作ってみようかな、と言うことになり作り始めたのがキッカケです。

まずはいつものようにスクリーンショットから…。

前回までのようにとりあえず基本スクリプトを書き後で説明をしていきたいと思います。

	buffer 2,40,440
	font "MS ゴシック",40
	color 255,255,150
	repeat 11
		boxf 1,cnt*40+1,39,cnt*40+40-1
	loop
	color
	pos 0,  0 : mes "★"
	pos 0, 40 : mes "▲"
	pos 0, 80 : mes "♪"
	pos 0,120 : mes "◆"
	pos 0,160 : mes "●"
	pos 0,200 : mes "■"
	pos 0,240 : mes "▼"
	pos 0,280 : mes "◎"
	pos 0,320 : mes "×"
	pos 0,360 : mes "※"
	pos 0,400 : mes "★"
	screen 0,160,100
	dim roll,3
	dim move,3
	font "MS ゴシック",12 : objmode 2
	objsize 40,20
	repeat 3
		pos 40*cnt+(cnt+1*10),60 : button "STOP",rollstop
	loop

*main
	repeat
		repeat 3
			redraw 0
			pos 40*cnt+(cnt+1*10),10 : gcoPY 2,0,roll.cnt*10,40,40
			redraw
			if move.cnt=0 : roll.cnt- : if roll.cnt<=0 : roll.cnt=40 ; 動いてるロールは回転する
		loop
		wait 1 ; 数値を増やすと遅くなる
		if move=1 & (move.1=1) & (move.2=1) : break ; すべてのロールが止められたらループを抜ける
	loop

; 当たり判定をココに入れる

	goto *main

*rollstop
	move.stat=1
	goto *main

では説明に入ります。

まず試していただければ(見るだけでも)わかるかと思いますが当たり判定をしていません。

何が揃おうと関係ないのです。それだけでなくずれてしまいきちんと止めるのも難しいと思います。

一応ロール回転はきちんと続いており一枚一枚パッとは表示されていませんね。

3つ全部揃う当たりの種類は10種類となっていますが絵柄は11個ありますよね?

この「★」は一番初めのモノと同じです。

なぜこんなことをするのかと言うと、もし画像サイズが400の「※」までだとしたら、

一番初めの画面にパッと切り替わることとなるからです。一度自分の目で確かめてみるとわかります。

 

次に「rollstop」ラベルを見てください。

TIPS「オブジェクト編」にある押されたボタンが何かというやり方を使っています。

それでは次にコレを改良したいと思います。

main」ラベルだけを次のように変更してください。

*main
	repeat
		repeat 3
			redraw 0
			pos 40*cnt+(cnt+1*10),10 : gcoPY 2,0,roll.cnt*5,40,40
			redraw
			if move.cnt=0 : roll.cnt-=5
			if move.cnt=1 : if roll.cnt\8!=0 : roll.cnt-
			if roll.cnt<=0 : roll.cnt=80
		loop
		wait 6 ; 数値を増やすと遅くなる
		if move=1 & (move.1=1) & (move.2=1) : break
	loop

; 当たり判定

	goto *main

きちんと画像が表示されたらストップがかかるようにしたものです。

また「stop」ボタンを押して完全にストップするのがピタッと止まるのではなく

徐々に速度を落とし停止させるために全体的な回転速度を変更しました。

ウェイトの時間を変えるだけではマズイので移動する間隔(さっきは1だったのを6に変更)も変えています。

コレでどうでしょう?少しはスロットらしくなったのではないではしょうか?

 

さぁ仕上げの当たり判定に入ってみましょうか。

全体的に少し変更します(ほんのちょっとです)ので全体のスクリプトを表示します。

#define KIND 12 ; 画像の種類
#define PX 40 ; 画像Xサイズ
#define PY 40 ; 画像Yサイズ
	movement=PY/8 ; 移動量
	dim roll,3
	dim move,3
	dim dispmark,3 ; 結局何の画像が表示されているか
	dim point,KIND ; 当たった時に入手するポイント
	point=999,600,400,200,200,100,100,50,50,50,50
	dim mark,KIND ; 何の画像か
	mark=0,1,2,3,3,5,5,7,7,7,7,-1 ; 最後の-1はポイント表示のところには表示しないための番号
	sdim pict,2,KIND
	pict="★","▲","◆","●","●","■","■","▼","▼","▼","▼","★"
	buffer 2,PX,PY*KIND
	font "MS ゴシック",PX
	repeat KIND
		color 255,255,150 : boxf 1,cnt*PY+1,PX-1,cnt*PY+PY-1 : color
		pos 0,PY*cnt : mes pict.cnt
	loop
	screen 0,PX+15*3+134,PY+115
	title "スロットゲーム"
	font "MS ゴシック",12 : objmode 2
	objsize PX,20
	repeat 3
		pos PX*cnt+(cnt+1*15),PY+30 : button "STOP",rollstop
	loop
		posPX+(2*15),PY+80 : button"再開",start
	color 255,255,150 : boxf PX+15*3+15,15,PX+15*3+120,140 : color
	tmp=-1 ; 次のアタリ役表示用に使用しています(使いまわしの変数)
	tmp.1=0 ; 上に同じく表示用に使用しています(コチラは表示位置用)
	repeat KIND
		if mark.cnt==tmp|(mark.cnt==-1) : continue : else : tmp=mark.cnt
		pos PX+15*3+30,tmp.1*20+20 : mes ""+pict.tmp+""+pict.tmp+""+pict.tmp+"  "+point.tmp
		tmp.1+
	loop

*main
	repeat
		repeat 3
			redraw 0
			pos PX*cnt+(cnt+1*15),15 : gcoPY 2,0,movement*roll.cnt,PX,PY
			redraw
			if move.cnt=0 : roll.cnt-=movement
			if move.cnt=1 : if roll.cnt\(PY/movement)!=0 : roll.cnt- : else : move.cnt=2
			if roll.cnt<=0 : roll.cnt=KIND-1*PY/movement
		loop
		wait 3
		if move=2&(move.1=2)&(move.2=2) : break
	loop
	repeat 3
		tmp=roll.cnt/8
		dispmark.cnt=mark.tmp ; 表示している画像番号
	loop
	goto *judge

*rollstop
	move.stat=1
	goto *main

*judge
	if dispmark.0==dispmark.1&(dispmark.1==dispmark.2) {
		repeat KIND
			if dispmark==cnt : dialog "「"+pict.dispmark+"」がアタリました!\n入手ポイント : "+point.dispmark
	} else {
		dialog "ハズレでした"
	}
	stop

*start
	repeat 3
		move.cnt=0
	loop
	goto *main

先ほどのものよりいろいろな場所に変数が出てきていてわかりにくくなっていると思います。

なぜ数値でなく変数で指定しているのかと言うと後で拡張しやすいようにするためです。

こうしておかないと、例えば表示している画像の大きさを変えたいとなった時に、

いろいろな場所を修正しなくてはならず大きさを変更するだけでも非常に面倒です。

数値では指定している場所すべてを変えなくてはおかしくなってしまいますが、

変数だと一箇所変えるだけですべてが変わってくれるので便利ですよね。

内容の説明に入ります。

今回のものは画像の種類を減らして同じものを増やしています。

これは出る確率が同じで得点だけ違うのは不公平(?)だ、と言うことで得点の低いものほど出やすくしています。

アタリ役は3つすべてが同じ画像と言うのだけですので判定がとても楽チンです。

当たった時○ポイントもらえる、と出てきますが実際にはポイント制度を設けていませんので

当たっても表示されるだけで何ももらえません...。

後はコレの画像を自分で書いた画像に変えたり、開始・停止音を鳴らしたりしてゴージャスにしてください(^^;

すぐに実行できる用のスクリプトはコチラ。ポイントをスコアとして使用しています。

 

あ、初めのPX,PYを変えるだけで全体サイズが自動で変更されるようにしましたのでご確認ください。

画像をフォントのまま変更しない場合、PXとPYは同じ数値にしてください。異なるとブサイクですので(--;

それとコレの場合数値を8で割り切れるものにしないとエラーが出てしまいます。

スロット作りたい人はコレを元に頑張ってみてください...では。