
学生の頃、ゲームプログラマーに憧れている時期がありまして、その反動でしょうかね……。
スロットゲーム(およびパチスロ)で遊んだことなんて数える程度ですが、jQueryでそれっぽいのをつくってみました。
目も当てられないような出来栄えで、誠に恐縮です。
とはいえ、プログラマー初心者の方(もしくは目指している方)はとりあえず「何かをつくってみる」のが、個人的には一番身につくと思います。
目指している方は、兎にも角にもレッツ!(^^)!プログラミング
あ…これがスロットゲームっぽいのです… もはや新感覚で羞恥の極み\(^o^)/
|
|
|
HTMLとCSS
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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | <html lang= "ja" > <head> <meta charset= "utf-8" > <script type= "text/javascript" src= "https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js" ></script> <style> .container_slot{ display : flex ; margin-top : 0 ; margin-bottom : 0 ; align-items : center ; width : 90% ; } .container_slot table { height : 100% ; border : none ; background-color : white ; margin-top : 0 ; margin-bottom : 0 ; table-layout : fixed ; } .container_slot table tr{ background-color : white ; height : 40% ; } .container_slot table td{ border : 1px solid #949495 ; } .container_slot .stop_slot_tr td div{ border-radius : 70% ; padding : 5px ; margin : 5px ; } .container_slot table input{ font-size : 4 vh; width : 100% ; border : none ; } .display_slot_tr,.stop_slot_tr{ height : 40% ; } .display_slot_td{ vertical-align : top ; position : relative ; height : 45 vh; padding : 0 ; } .display_slot 1 ,.display_slot 2 ,.display_slot 3 { position : absolute ; background-color : transparent ; text-align : center ; font-weight : bold ; border : none ; } .stop_slot_btn_ 1 ,.stop_slot_btn_ 2 ,.stop_slot_btn_ 3 { height : 100% ; background-color : transparent ; border : none ; } .score_text_tr{ height : 10% ; } .score_text_td{ padding : 0 ; margin : 0 ; } .scoer_text_ 1 ,.scoer_text_ 2 { height : 100% ; font-size : 1.5 vh; } .lever_btn{ border-radius : 50% ; font-size : 1.8 vh; height : 6em ; border : none ; font-weight : bold ; background-color : #000000 54; } </style> </head> <body> <div class= "container_slot" > < table > <tr class= "display_slot_tr" > <td class= "display_slot_td" ><input class= "display_slot1" type= "text" value= "" disabled></td> <td class= "display_slot_td" ><input class= "display_slot2" type= "text" value= "" disabled></td> <td class= "display_slot_td" ><input class= "display_slot3" type= "text" value= "" disabled></td> </tr> <tr class= "stop_slot_tr" > <td> <div style= "background-color:red;" > <input class= "stop_slot_btn_1" type= "button" value= "stop" > </div> </td> <td> <div style= "background-color:red;" > <input class= "stop_slot_btn_2" type= "button" value= "stop" > </div> </td> <td> <div style= "background-color:red;" > <input class= "stop_slot_btn_3" type= "button" value= "stop" > </div> </td> </tr> <tr class= "score_text_tr" > <td class= "score_text_td" colspan= "2" > <input class= "scoer_text_1" style= "font-size:1.5vh;" type= "text" value= "" disabled> </td> <td class= "score_text_td" colspan= "1" > <input class= "scoer_text_2" style= "font-size:1.5vh;" type= "text" value= "" disabled> </td> </tr> </ table > <button class= "lever_btn" type= "button" >GO!!</button> </div> </body> </html> |
スタイルシート(css)はゴチャゴチャしていますが、あんまり気にしないでください。wordpressのcssと競合しちゃってるもんだから割と力技でコーディングしています。本来ならもっとシンプルに書けるはずです。
あと命名規則とか結構、無視していますので……m(__)m
jQuery
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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 | <script type= "text/javascript" > /* ☆スロットゲーム ・スタートレバーで3つのリールが回転 ・3つ揃えたらポイント獲得 */ jQuery(document).ready( function ($) { let id_slot_1 = 0; //リール1のsetTimeoutを止めるためのIDを格納する変数 let id_slot_2 = 0; //リール2のsetTimeoutを止めるためのIDを格納する変数 let id_slot_3 = 0; //リール3のsetTimeoutを止めるためのIDを格納する変数 let score_point = 0; //スコアを格納する変数 let reel_1 = '☆' ; //リール1のパターン(絵柄) let reel_2 = '◇' ; //リール2のパターン(絵柄) let reel_3 = '◎' ; //リール3のパターン(絵柄) let pattern_data = '' ; //パターン(絵柄)を一時的に格納する変数 let stop_flag_reel_1 = true ; //ストップボタン_1の押下判定 let stop_flag_reel_2 = true ; //ストップボタン_2の押下判定 let stop_flag_reel_3 = true ; //ストップボタン_3の押下判定 let position_pattern_1 = 0; //パターン1(絵柄)の位置(topの余白) let position_pattern_2 = 0; //パターン2(絵柄)の位置(topの余白) let position_pattern_3 = 0; //パターン3(絵柄)の位置(topの余白) const message_1 = [ 'おしい!(>_<)' , 'あぁ!!(+_+)' , 'あとちょっと!(*_*)' ]; const message_2 = [ 'う~~ん、残念m(__)m' , '次があるさ(p_-)' , 'タイミングが難しいよね…(ーー゛)' ]; /* ■初期化 ・ストップボタンを無効にする ・スコアを表示する */ $( ".stop_slot_btn_1" ).prop( 'disabled' , true ); $( ".stop_slot_btn_2" ).prop( 'disabled' , true ); $( ".stop_slot_btn_3" ).prop( 'disabled' , true ); $( ".scoer_text_2" ).val( '計' + score_point + '点' ); /* ■(スタート)レバーボタン ・ストップボタンを有効にする ・各リールのストップボタン押下判定をfalse ・レバーのアニメーション ・各slotRotationで各リールを回す */ $( ".lever_btn" ).on( 'click' , function (){ $( ".lever_btn" ).prop( 'disabled' , true ); $( ".stop_slot_btn_1" ).prop( 'disabled' , false ); $( ".stop_slot_btn_2" ).prop( 'disabled' , false ); $( ".stop_slot_btn_3" ).prop( 'disabled' , false ); stop_flag_reel_1 = false ; stop_flag_reel_2 = false ; stop_flag_reel_3 = false ; $( ".lever_btn" ).animate({marginTop: '50%' },300, 'swing' , function (){ $( '.lever_btn' ).css( 'marginTop' , '0%' ); }); slotRotation_1(); slotRotation_2(); slotRotation_3(); }); /* ■ストップボタン ・押下されたらストップボタンを無効にする ・リールを止める【clearTimeout(id)でsetTimeoutを止める】 ・押下されたらリールの【ストップボタン押下判定】をtrueにする ・【ストップボタン押下判定】が全てtrueになったら絵柄(パターン)が3つ揃ったかどうかをgotAllThree()でチェックする */ $( ".stop_slot_btn_1" ).on( 'click' , function (){ $( ".stop_slot_btn_1" ).prop( 'disabled' , true ); clearTimeout(id_slot_1); stop_flag_reel_1 = true ; if (stop_flag_reel_1 && stop_flag_reel_2 && stop_flag_reel_3 )gotAllThree(); }); $( ".stop_slot_btn_2" ).on( 'click' , function (){ $( ".stop_slot_btn_2" ).prop( 'disabled' , true ); clearTimeout(id_slot_2); $( ".display_slot2" ).stop( false , false ); stop_flag_reel_2 = true ; if (stop_flag_reel_1 && stop_flag_reel_2 && stop_flag_reel_3 )gotAllThree(); }); $( ".stop_slot_btn_3" ).on( 'click' , function (){ $( ".stop_slot_btn_3" ).prop( 'disabled' , true ); clearTimeout(id_slot_3); $( ".display_slot3" ).stop( false , false ); stop_flag_reel_3 = true ; if (stop_flag_reel_1 && stop_flag_reel_2 && stop_flag_reel_3 )gotAllThree(); }); /* ■gotAllThree()【3つ揃ったかどうか】 ・☆は20点 ・◎は15点 ・◇は10点 ・△は5点 ・2つしか揃わなかった場合のメッセージ ・まったく揃わなかった場合のメッセージ */ function gotAllThree(){ if (reel_1 == reel_2 && reel_2 == reel_3 && reel_3 == reel_1){ switch (reel_1){ case '☆' : $( ".scoer_text_1" ).val( 'すごい!!(*_*) 20点獲得!' ); score_point += 20; $( ".scoer_text_2" ).val( '合計' + score_point + '点' ); break ; case '◎' : $( ".scoer_text_1" ).val( 'おぉ!(*^_^*) 15点獲得' ); score_point += 15; $( ".scoer_text_2" ).val( '合計' + score_point + '点' ); break ; case '◇' : $( ".scoer_text_1" ).val( 'よっしゃー(^o^) 10点獲得!' ); score_point += 10; $( ".scoer_text_2" ).val( '合計' + score_point + '点' ); break ; case '△' : $( ".scoer_text_1" ).val( 'いい感じ(^^) 5点獲得!' ); score_point += 5; $( ".scoer_text_2" ).val( '合計' + score_point + '点' ); break ; default : break ; } } else if (reel_1 == reel_2 || reel_1 == reel_3 || reel_2 == reel_3){ $( ".scoer_text_1" ).val(message_1[Math.ceil(Math.random()*3)-1]); } else { $( ".scoer_text_1" ).val(message_2[Math.ceil(Math.random()*3)-1]); } $( ".lever_btn" ).prop( 'disabled' , false ); } /* ■slotRotation_1,2,3() 【setTimeoutで下記内容をミリ秒毎に繰り返し、リールが回っているかのように表示】 ・setTimeoutを止める時に必要となるIDも取得しておく ・【却下】→×アニメーションを効かせながら表示する【上から下に移動】 ・moveDown_を使ってsetTimeoutで経過した時間だけ【上から下に移動】 */ function slotRotation_1(){ id_slot_1 = setTimeout(() => { slotRotation_1(); },5); $( '.display_slot1' ).css( 'top' , moveDown_1()+ '%' ); //$('.display_slot1').css('top', '0'); //$(".display_slot1").animate({top:'80%'},350,'swing'); } function slotRotation_2(){ id_slot_2 = setTimeout(() => { slotRotation_2(); },6); $( '.display_slot2' ).css( 'top' , moveDown_2()+ '%' ); //$('.display_slot2').css('top', '0'); //$(".display_slot2").animate({top:'80%'},350,'swing'); } function slotRotation_3(){ id_slot_3 = setTimeout(() => { slotRotation_3(); },5); $( '.display_slot3' ).css( 'top' , moveDown_3()+ '%' ); //$('.display_slot3').css('top', '0'); //$(".display_slot3").animate({top:'80%'},380,'swing'); } /* ■パターン(絵柄)選択 ・次に表示するパターンを選択する */ function reelPattern_1(pattern_data){ switch (pattern_data){ case '☆' : reel_1 = '◇' ; break ; case '◇' : reel_1 = '△' ; break ; case '△' : reel_1 = '◎' ; break ; case '◎' : reel_1 = '☆' ; break ; default : break ; } return reel_1; } /* ■リール2のパターン選択 */ function reelPattern_2(pattern_data){ switch (pattern_data){ case '◇' : reel_2 = '◎' ; break ; case '◎' : reel_2 = '☆' ; break ; case '☆' : reel_2 = '△' ; break ; case '△' : reel_2 = '◇' ; break ; default : break ; } return reel_2; } /* ■リール3のパターン選択 */ function reelPattern_3(pattern_data){ switch (pattern_data){ case '◎' : reel_3 = '☆' ; break ; case '☆' : reel_3 = '△' ; break ; case '△' : reel_3 = '◇' ; break ; case '◇' : reel_3 = '◎' ; break ; default : break ; } return reel_3; } /* ■上から下へのパターンの移動 ・タグの余白をミリ秒ごとに増加させることで、移動しているように見せる ・起点からの余白が80%確保できた時点で0%に戻す(一番上に戻す) ・一番上に戻ったら次のパターンを選択(reelPattern) */ function moveDown_1(){ position_pattern_1 += 1; if (position_pattern_1 > 80){ position_pattern_1 = 0; $( ".display_slot1" ).val(reelPattern_1(reel_1)); } return position_pattern_1; } /* ■上から下へのパターンの移動【リール2】 */ function moveDown_2(){ position_pattern_2 += 1; if (position_pattern_2 > 80){ position_pattern_2 = 0; $( ".display_slot2" ).val(reelPattern_2(reel_2)); } return position_pattern_2; } /* ■上から下へのパターンの移動【リール3】 */ function moveDown_3(){ position_pattern_3 += 1; if (position_pattern_3 > 80){ position_pattern_3 = 0; $( ".display_slot3" ).val(reelPattern_3(reel_3)); } return position_pattern_3; } }); </script> |
スロットを回すところは当初、jQueryのanimate関数を使って動かしていましたが、動きに違和感がありましたのでやめました(笑)。結局、setTimeoutでミリ秒ごとにタグの余白を増加させて動かしています。あ、でもレバーのところはアニメーションでやってますよ(^^)
とりあえず、今回も特筆すべき点はありませんが、強いて言うなら……
setTimeout(実行したい関数,何ミリ秒後に実行したいか)
この部分でしょうか。setTimeou関数はスロットゲームの心臓部分ですが、この関数については前回の記事を参考にしてください。
プログラマーを目指している方、まずは簡単なゲームづくりからやってみましょう!^o^わりと楽しいですよ~
どこでも食っていけるWeb人間になれる【Web食いオンラインスクール】