質問: flashでスロットゲームを作りたいのですが... macromedia flashmxかfrashmxを使ってスロットゲーム(3つのスロットを回して、全ての絵柄が揃ったら何か文字を表示するようなもの)を作りたいのですが、プログラミングに苦戦しています。 プログラムの組み方など、助言をして頂けたら幸いです。 参考になるサイトなどもありましたら、教えて下さい。 お願いします。
回答: ○ × ★ ---1段目 ■ ○ × ---2段目 △ ■ ○ ---3段目 b b b ---ストップボタン って感じのスロットをイメージしてください。 1,2,3段目はactionscriptで動的に作ります。 3個のストップボタンはステージに配置しておきます。 インスタンス名はstop0_mc、stop1_mc、stop2_mcとして下さい。 (※ボタンと表現してますがmovieclipで作成してください) 次に絵柄をmovieclipで5個用意してください。 とりあえず高さは40ピクセルで作成しといてください。 これはステージに配置せず、ライブラリ内でリンケージ識別子をつけます。 識別子はpic0_mc~pic4_mcとしてください。 //以下のactionscriptをステージに記述してください-------------------------- //絵柄の数 var pic_num = 5; //絵柄の高さ var h_num = 40; //深度 (※1) var depth = 0; //配列の配列を初期化(絵柄を消したり揃ったか見るのに使う) (※2) var mc_array = new array(); for (var i = 0; i<=2; i++) { mc_array[i] = new array(); } //ボタンを押した回数(3回押したら絵柄の揃いを判定) var cnt = 0; //ボタン押したときの動作設定--------------------------------- for (var i = 0; i<=2; i++) { _root["stop"+i+"_mc"].onrelease = release_me; //どのボタンが押されたかわかるように変数idxを作成し番号を保持 _root["stop"+i+"_mc"].idx = i; } //ボタンを押したときに呼び出す関数--------------------------- function release_me() { //ボタンを押した回数加算 _root.cnt++; //一度押したボタンは押せなくする this.enabled = false; //スロットを止める関数を呼ぶ _root.stop_slot(this); //3つのボタン全て押したとき if (cnt == 3) { //絵柄の揃いをチェックする関数を呼ぶ hit_check(); } } //スロットを止める関数---------------------------------------- //引数:押したボタン(mc) function stop_slot(btn_mc) { //1段目に表示する絵をランダムで決定 n = math.floor(math.random()*_root.pic_num); //縦方向の絵の順番は同じなので1段目が決まれば2,3段目も自動的に決まる //上図でいうと1段目に○が来たら、2段目は必ず■になる (※3) for (var row = 1; row<=3; row++) { //動的にmcをステージに配置 _root.mc_array[row-1][btn_mc.idx] =_root.attachmovie("pic"+n+"_mc", "pic"+row+"_"+btn_mc.idx, _root.depth); //x,y座標を設定 x座標は押したボタンのx座標と同じ _root.mc_array[row-1][btn_mc.idx]._x = btn_mc._x; _root.mc_array[row-1][btn_mc.idx]._y = btn_mc._y-btn_mc._height/2-_root.h_num*(4-row); //どの位置にどの絵柄を配置したかをわかりやすくするため、 //変数numを作成し絵柄の番号を代入 (※4) _root.mc_array[row-1][btn_mc.idx].num = n; //2、3段目の絵柄を取得(加算するだけ) n++; //絵柄の数を超えたら一周して先頭の絵柄にする if (n>=_root.pic_num) { n = 0; } //深度加算 _root.depth++; } } //絵柄の揃いをチェックする関数------------------------------- function hit_check() { //確認用に出力 for (var row = 0; row<=2; row++) { str = ""; for (var col = 0; col<=2; col++) { str += " "+_root.mc_array[row][col].num; } trace(str); } //斜め位置が揃っているか確認 (※5) if (_root.mc_array[0][0].num == _root.mc_array[1][1].num && _root.mc_array[1][1].num == _root.mc_array[2][2].num) { trace("斜めに揃った1"); } if (_root.mc_array[0][2].num == _root.mc_array[1][1].num && _root.mc_array[1][1].num == _root.mc_array[2][0].num) { trace("斜めに揃った2"); } //横 if (_root.mc_array[0][0].num == _root.mc_array[0][1].num && _root.mc_array[0][1].num == _root.mc_array[0][2].num) { trace("1段目揃った"); } if (_root.mc_array[1][0].num == _root.mc_array[1][1].num && _root.mc_array[1][1].num == _root.mc_array[1][2].num) { trace("2段目揃った"); } if (_root.mc_array[2][0].num == _root.mc_array[2][1].num && _root.mc_array[2][1].num == _root.mc_array[2][2].num) { trace("3段目揃った"); } } //絵柄をリセットする関数------------------------------------- //このas内ではどこにも記述してません。 //必要であればリセットボタンを作ってそこから呼んでください。 function reset() { //ボタンを押せるようにする //初期化 for (var i = 0; i<=2; i++) { _root["stop"+i+"_mc"].enabled = true; } _root.cnt = 0; for (var row = 0; row<=2; row++) { for (var col = 0; col<=2; col++) { _root.mc_array[row][col].removemovieclip(); } } } //------------------------------------------------------------------------ [補足] (※1) 深度を自動的に取得するgetnexthighestdepthは、 ライブラリ内にコンポーネントがあると使用できる深度より大きな値を返してくる。 そうするとその深度でattachmovieしたmcは消せなくなるので深度を自分で管理する。 (※2) 配列の配列≒2次元配列です (asに2次元配列は無いみたいなので同じようなものです) mc_array[行][列]として絵柄のmcを入れています。 1列目 2列目 3列目 1段目 [0][0] [0][1] [0][2] 2段目 [1][0] [1][1] [1][2] 3段目 [2][0] [2][1] [2][2] って感じになります。 (※3) 今回は、 ○ ■ △ ★ × という絵柄がぐるぐる回っていると仮定して作成しているため、 1段目が決まれば2,3段目も自動的に決まるってことです。 つまり1段目が揃うと2,3段目も揃うことになります。ですので、 本格的に作るなら1,2,3列目は違う順番(または違う数)の絵柄が 回るように考えないといけません。 特にこだわらないのであれば9つの絵柄を全部ランダムで決めてもいいと思います。 (※4) 絵柄の番号ってこはランダムで取得したnのことで、 n=0ならpic0_mcを、n=1ならpic1_mcをステージに配置しています。 この番号をみればどの列が揃ったのかが簡単に判断できます。 (※5) 3つの値(a,b,c)を比較するとき if(a==b==c){} という書き方だと (a==b)==c と解釈される これは a==b が true の場合 true==c の比較になるので正しい結果は得られません ですので a==b && b==c で判断します。 実行してみるとわかると思いますが、絵柄が回る部分は作っていません。 私は実際に回すよりも回っている様に見えるアニメを配置したほうがそれっぽく見えると思います。