質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

0回答

3951閲覧

スロットゲームのリールを4つの絵柄分移動させてから停止させたい

nosonosolife

総合スコア42

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

1クリップ

投稿2018/02/23 11:34

編集2018/02/27 21:47

javascript、css、htmlでスロットゲームを制作しています。
このゲームは実際のスロットのように内部抽選の結果によって3つのリールの停止絵柄を決めるシステムです。

まず、関数winLotteryで65536以内の乱数を生成し配列configTableを参照して、乱数がconfigTableで決められた6ついずれかの範囲内に入っていれば当たり、
関数wIcArrayRewriteで配列iconArrayをチェック、配列winIconArrayの当たった絵柄部分の数値を「1」に書き換えます。
ストップボタンを押した際に、リールの位置からwinIconArrayの数値を参照し、1であればその絵柄に止まるという仕組みです。

今回はこれに以下の機能を追加したいと思っています。
・リールを4コマ滑らせてから止める
現在のコードでは画面内に当たった絵柄が表示されるまで止まりませんが、実際のスロットではボタンを押した瞬間の位置から4コマ(4つの絵柄)以内に滑らせてから停止させているようですので、
ボタンを押した瞬間の位置から4つの絵柄の内に当たった絵柄がない場合、強制的に停止させるようにしたいです。
・停止位置を横三つ斜め二つに対応させる
現在、当たり絵柄の停止位置は中央の横3つにしか対応していませんが、上下横・左右斜め3つにも対応させたいです。

上手く説明できていない部分がありましたら申し訳ございません。どうかご教授よろしくお願いいたします。
【ソースコード】※質問内容と関係のない部分は省いています

css

1#slotmachinebox { 2 position: absolute; 3 top:50%; 4 left:50%; 5 display: block; 6 width: 460px; 7 height: 390px; 8 margin:0px auto; 9 padding: 0; 10 background-image: url(img/slotmainbg.png); 11} 12 13#slotmachinebox #reelbox { 14 position: absolute; 15 top: 64px; 16 left: 30px; 17 display: block; 18 overflow: hidden; 19 width: 430px; 20 height: 194px; 21 margin: 0; 22 padding: 0; 23} 24 25#slotmachinebox #reelbox .reel { 26 position: absolute; 27 z-index: 1; 28 display: block; 29 overflow: hidden; 30 width: 120px; 31 height: 180px; 32 margin-top: 5px; 33 margin-left: 15px; 34 padding: 0; 35} 36 37#slotmachinebox #reelbox .reel0{ 38 top: 0px; 39 left: 10px; 40} 41 42#slotmachinebox #reelbox .reel1{ 43 top: 0px; 44 left: 137px; 45} 46 47#slotmachinebox #reelbox .reel2{ 48 top: 0px; 49 left: 274px; 50} 51 52#slotmachinebox #reelbox .wrapper{ 53 list-style:none outside; 54 position: absolute; 55 top: 0px; 56 left: 0px; 57 width: 120px; 58 margin: 0; 59 padding: 0; 60} 61#slotmachinebox #reelbox .wrapper .icon0, 62#slotmachinebox #reelbox .wrapper .icon1, 63#slotmachinebox #reelbox .wrapper .icon2, 64#slotmachinebox #reelbox .wrapper .icon3, 65#slotmachinebox #reelbox .wrapper .icon4, 66#slotmachinebox #reelbox .wrapper .icon5, 67#slotmachinebox #reelbox .wrapper .icon6, 68#slotmachinebox #reelbox .wrapper .icon7, 69#slotmachinebox #reelbox .wrapper .icon8, 70#slotmachinebox #reelbox .wrapper .icon9, 71#slotmachinebox #reelbox .wrapper .icon10, 72#slotmachinebox #reelbox .wrapper .icon11, 73#slotmachinebox #reelbox .wrapper .icon12, 74#slotmachinebox #reelbox .wrapper .icon13, 75#slotmachinebox #reelbox .wrapper .icon14 { 76 display: block; 77 width: 120px; 78 height: 60px; 79 margin: 0; 80 padding: 0; 81 //text-indent: -10000px; 82 background-image: url(img/sloticons.png); 83} 84 85#slotmachinebox #reelbox .wrapper .icon0{ 86 background-position: 0 0px; 87} 88 89#slotmachinebox #reelbox .wrapper .icon1{ 90 background-position: 0 -60px; 91} 92 93#slotmachinebox #reelbox .wrapper .icon2{ 94 background-position: 0 -120px; 95} 96 97#slotmachinebox #reelbox .wrapper .icon3{ 98 background-position: 0 -180px; 99} 100 101#slotmachinebox #reelbox .wrapper .icon4{ 102 background-position: 0 -240px; 103} 104 105#slotmachinebox #reelbox .wrapper .icon5{ 106 background-position: 0 -300px; 107} 108 109#slotmachinebox #reelbox .wrapper .icon6{ 110 background-position: 0 -360px; 111}

JavaScript

1 // 定数定義 2 var fps = 60; //FPS 3 var interval = 1 / fps * 1000; 4 5 var maxRand = 65536; //最大乱数 6 //11070 7 var configNum = 6; //設定数 8 var configTable = [ 9 // 0:BIG 1:REG 2:コイン 3:スイカ 4:ベル 5:チェリー 6:リプレイ 10 [[0,99],[100,149],[150,299],[300,549],[550,869],[870,2539],[2540,4500]], //設定1 11 [[0,99],[100,149],[150,299],[300,549],[550,869],[870,2539],[2540,4500]], //設定2 12 [[0,99],[100,149],[150,299],[300,549],[550,869],[870,2539],[2540,4500]], //設定3 13 [[0,99],[100,149],[150,299],[300,549],[550,869],[870,2539],[2540,4500]], //設定4 14 [[0,99],[100,149],[150,299],[300,549],[550,869],[870,2539],[2540,4500]], //設定5 15 [[0,99],[100,149],[150,299],[300,549],[550,869],[870,2539],[2540,4500]] //設定6 16 ]; 17 18 var iconNum = 21; //リールに表示する絵柄絵柄数 19 var iconWidth = 120; //絵柄の幅 20 var iconHeight = 60; //絵柄の高さ 21 22 var reelArray = new Array(); 23 var reelNum = 3; //リール数 24 var reelMargin = 5; 25 var reelBaseX = 18; 26 var reelBaseY = 92; 27 var reelHeight = (iconHeight * iconNum); //リールの高さ 28 var reelMoveSpeedY = Math.floor(iconHeight / 3); //リール移動スピード 29 30 var iconArray = [//絵柄配列 31 [4, 5, 1, 3, 4, 6, 1, 3, 2, 6, 4, 3, 5, 6, 2, 5, 6, 4, 3, 0, 6], 32 [6, 4, 1, 3, 6, 5, 4, 5, 6, 4, 2, 3, 6, 0, 4, 3, 6, 1, 4, 2, 5], 33 [5, 3, 1, 4, 6, 3, 4, 0, 6, 3, 5, 6, 2, 3, 4, 6, 5, 0, 3, 4, 6] 34 ]; 35 36 //変数定義 37 var configId = Math.floor(Math.random()*configNum); //設定を決める 38 39 var reelStopFlg = [null, null, null]; 40 var reelposY = [0, 0, 0]; //リールの移動量 41 42 var winIconArray = [ //当たり絵柄配列 43 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 44 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 45 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 46 ]; 47 var hitIcon = [ 48 [0, 0, 0], 49 [0, 0, 0], 50 [0, 0, 0] 51 ]; 52 53 // リール回転用 54 var reelmoveAnime; 55 56 addSlots(); 57 58 function slotStart() { 59 reelStopFlg = [false, false, false]; 60 winLottery(); 61 reelmoveAnime = setInterval(slotMove, interval); 62 $('[id^=stopbtn]').css("pointer-events", "auto"); 63 } 64 65 function slotStop(i) { 66 reelStopFlg[i] = true; 67 } 68 69 function winLottery() { 70 var iArray = [0,0,0]; 71 var rand = Math.floor(Math.random()*maxRand); 72 for (var i = 0; i < configTable[configId].length; i++) { 73 if(configTable[configId][i][0] >= rand || rand <= configTable[configId][i][1]){ 74 console.log("あたり"); 75 iArray = [i,i,i]; 76 wIcArrayRewrite(iArray); 77 break; 78 } 79 if(i == configTable[configId].length-1){ 80 console.log("はずれ"); 81 iArray[0] = Math.floor(Math.random()*configTable[configId].length); 82 iArray[1] = Math.floor(Math.random()*configTable[configId].length); 83 iArray[2] = Math.floor(Math.random()*configTable[configId].length); 84 wIcArrayRewrite(iArray); 85 } 86 } 87 } 88 89 function wIcArrayRewrite(iArray) { 90 for (var i = 0; i < reelNum; i++) { 91 for (var j = 0; j < iconNum; j++) { 92 if(iconArray[i][j] == iArray[i]){ 93 winIconArray[i][j] = 1; 94 }else{ 95 winIconArray[i][j] = 0; 96 } 97 } 98 } 99 } 100 101 //リール作成 102 function addSlots() { 103 reelStopFlg[i] = false; 104 for (var i = 0; i < reelNum; i++) { 105 $('.reel').eq(i).css("left", ((iconWidth + reelMargin) * i) + "px"); 106 $('.wrapper').eq(i).css("height", reelHeight + "px"); 107 $('.wrapper').eq(i).css("top", "-" + (iconHeight * Math.floor(Math.random()*iconNum)) + "px"); 108 for (var j = 0; j < 24; j++) { 109 if (j < iconNum) { 110 $('.wrapper').eq(i).append("<li class='icon icon" + iconArray[i][j] + 111 "'>" + iconArray[i][j] + "</li>"); 112 } else { 113 $('.wrapper').eq(i).append("<li class='icon icon" + iconArray[i][j - 21] + 114 "'>" + iconArray[i][j - 21] + "</li>"); 115 } 116 } 117 } 118 } 119 120 //リール回転 121 function slotMove() { 122 for (var i = 0, stopCount = 0; i < reelNum; i++) { 123 if (!reelStopFlg[i] || reelposY[i] % iconHeight || winIconArray[i][(-reelposY[i] / iconHeight)+1] != 1) { 124 reelposY[i] += reelMoveSpeedY; 125 if (reelposY[i] > 0) reelposY[i] -= reelHeight; 126 $('.wrapper').eq(i).css("top", reelposY[i] + "px"); 127 } else { 128 stopCount++; 129 } 130 if (stopCount == reelNum) { 131 $('#startbtn').css("pointer-events", "auto"); 132 clearInterval(reelmoveAnime); 133 slotHits(); 134 } 135 } 136 } 137 138 function slotHits() { 139 for (var i = 0; i < reelNum; i++) { 140 for (var j = 0; j < reelNum; j++) { 141 hitIcon[i][j] = ((-reelposY[i] / iconHeight) + j); 142 if (hitIcon[i][j] >= iconNum) { 143 hitIcon[i][j] -= iconNum; 144 } 145 } 146 } 147 if (iconArray[0][hitIcon[0][0]] == iconArray[1][hitIcon[1][0]] && 148 iconArray[1][hitIcon[1][0]] == iconArray[2][hitIcon[2][0]]) { 149 $("#result").html("上段が揃いました"); 150 } else if (iconArray[0][hitIcon[0][1]] == iconArray[1][hitIcon[1][1]] && 151 iconArray[1][hitIcon[1][1]] == iconArray[2][hitIcon[2][1]]) { 152 $("#result").html("中段が揃いました"); 153 } else if (iconArray[0][hitIcon[0][2]] == iconArray[1][hitIcon[1][2]] && 154 iconArray[1][hitIcon[1][2]] == iconArray[2][hitIcon[2][2]]) { 155 $("#result").html("下段が揃いました"); 156 } else if (iconArray[0][hitIcon[0][2]] == iconArray[1][hitIcon[1][1]] && 157 iconArray[1][hitIcon[1][1]] == iconArray[2][hitIcon[2][0]]) { 158 $("#result").html("左斜めが揃いました"); 159 } else if (iconArray[0][hitIcon[0][0]] == iconArray[1][hitIcon[1][1]] && 160 iconArray[1][hitIcon[1][1]] == iconArray[2][hitIcon[2][2]]) { 161 $("#result").html("右斜めが揃いました"); 162 } else { 163 $("#result").html("残念!!"); 164 } 165 } 166

html

1<html> 2 <body> 3 <div id="result"></div> 4 <div id="slotmachinebox"> 5 <div id="reelbox"> 6 <div class="reel reel0"> 7 <ul class="wrapper"> 8 </ul> 9 </div> 10 <div class="reel reel1"> 11 <ul class="wrapper"> 12 </ul> 13 </div> 14 <div class="reel reel2"> 15 <ul class="wrapper"> 16 </ul> 17 </div> 18 </div> 19 </div> 20 </body> 21</html>

【追記】
「・停止位置を横三つ斜め二つに対応させる」は

JavaScript

1var stopLineArray = [[1,1,1],[0,0,0],[2,2,2],[0,1,2],[2,1,0]]; //停止ライン配列 2var stopLineId = 0;

このような変数を作って、

JavaScript

1function winLottery() { 2 //省略 3 stopLineId = Math.floor(Math.random()*stopLineArray.length); 4 //省略 5} 6 7function slotMove() { 8 //省略 9 if (!reelStopFlg[i] || reelposY[i] % iconHeight || winIconArray[i][(-reelposY[i] / iconHeight)+stopLineArray[stopLineId][i]] != 1) { 10 //省略 11}

こうしたところ上手くいきました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問