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

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

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

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

jQuery

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

Q&A

解決済

8回答

899閲覧

スロットゲームでハズレの際は絶対に絵柄が揃わないようにしたい

nosonosolife

総合スコア42

JavaScript

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

jQuery

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

1グッド

0クリップ

投稿2018/03/08 19:47

編集2018/03/13 10:32

javascript、css、htmlでスロットゲームを制作しています。
3つの回転するリールを3つのボタンで1つづつ止めて、リールに描かれた絵柄が横3つ・左右斜3つに揃えば当たりという方式で、
当たりハズレの抽選はwinLottery関数で行なっており、最大65536の乱数を生成し、配列configTableで指定した範囲内であれば当たりで、3つのリールともに当たった絵柄に止まります。
それ以外はハズレで、3つのリールとも乱数で適当に選んだ絵柄に止まるのですが、
時々ハズレの場合でも意図しない形で横3つ・左右斜3つに絵柄が揃ってしまうことがあります。
ハズレの際は絵柄が全く揃わないようにするにはどの様な乱数の決め方やチェックを行えばいいでしょうか。
どうかご提示よろしくお願いいたします。

【ソースコード】

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 var stopLineArray = [[1,1,1],[0,0,0],[2,2,2],[0,1,2],[2,1,0]]; //停止ライン配列 36 var stopLineId = 0; 37 38 //変数定義 39 var configId = Math.floor(Math.random()*configNum); //設定を決める 40 41 var reelStopFlg = [null, null, null]; 42 var reelposY = [0, 0, 0]; //リールの移動量 43 44 var winIconArray = [ //当たり絵柄配列 45 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 46 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 47 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 48 ]; 49 var hitIcon = [ 50 [0, 0, 0], 51 [0, 0, 0], 52 [0, 0, 0] 53 ]; 54 55 // リール回転用 56 var reelmoveAnime; 57 58 addSlots(); 59 60 function slotStart() { 61 reelStopFlg = [false, false, false]; 62 winLottery(); 63 reelmoveAnime = setInterval(slotMove, interval); 64 $('[id^=stopbtn]').css("pointer-events", "auto"); 65 } 66 67 function slotStop(i) { 68 reelStopFlg[i] = true; 69 } 70 71 function winLottery() { 72 var iArray = [0,0,0]; 73 var rand = Math.floor(Math.random()*maxRand); 74 for (var i = 0; i < configTable[configId].length; i++) { 75 if(configTable[configId][i][0] >= rand || rand <= configTable[configId][i][1]){ 76 console.log("あたり"); 77 iArray = [i,i,i]; 78 wIcArrayRewrite(iArray); 79 break; 80 } 81 if(i == configTable[configId].length-1){ 82 console.log("はずれ"); 83 iArray[0] = Math.floor(Math.random()*configTable[configId].length); 84 iArray[1] = Math.floor(Math.random()*configTable[configId].length); 85 iArray[2] = Math.floor(Math.random()*configTable[configId].length); 86 wIcArrayRewrite(iArray); 87 } 88 } 89 } 90 91 function wIcArrayRewrite(iArray) { 92 for (var i = 0; i < reelNum; i++) { 93 for (var j = 0; j < iconNum; j++) { 94 if(iconArray[i][j] == iArray[i]){ 95 winIconArray[i][j] = 1; 96 }else{ 97 winIconArray[i][j] = 0; 98 } 99 } 100 } 101 } 102 103 //リール作成 104 function addSlots() { 105 reelStopFlg[i] = false; 106 for (var i = 0; i < reelNum; i++) { 107 $('.reel').eq(i).css("left", ((iconWidth + reelMargin) * i) + "px"); 108 $('.wrapper').eq(i).css("height", reelHeight + "px"); 109 $('.wrapper').eq(i).css("top", "-" + (iconHeight * Math.floor(Math.random()*iconNum)) + "px"); 110 for (var j = 0; j < 24; j++) { 111 if (j < iconNum) { 112 $('.wrapper').eq(i).append("<li class='icon icon" + iconArray[i][j] + 113 "'>" + iconArray[i][j] + "</li>"); 114 } else { 115 $('.wrapper').eq(i).append("<li class='icon icon" + iconArray[i][j - 21] + 116 "'>" + iconArray[i][j - 21] + "</li>"); 117 } 118 } 119 } 120 } 121 122 //リール回転 123 function slotMove() { 124 for (var i = 0, stopCount = 0; i < reelNum; i++) { 125 if (!reelStopFlg[i] || reelposY[i] % iconHeight || winIconArray[i][(-reelposY[i] / iconHeight)+stopLineArray[stopLineId][i]] != 1) { 126 reelposY[i] += reelMoveSpeedY; 127 if (reelposY[i] > 0) reelposY[i] -= reelHeight; 128 $('.wrapper').eq(i).css("top", reelposY[i] + "px"); 129 } else { 130 stopCount++; 131 } 132 if (stopCount == reelNum) { 133 $('#startbtn').css("pointer-events", "auto"); 134 clearInterval(reelmoveAnime); 135 slotHits(); 136 } 137 } 138 } 139 140 function slotHits() { 141 for (var i = 0; i < reelNum; i++) { 142 for (var j = 0; j < reelNum; j++) { 143 hitIcon[i][j] = ((-reelposY[i] / iconHeight) + j); 144 if (hitIcon[i][j] >= iconNum) { 145 hitIcon[i][j] -= iconNum; 146 } 147 } 148 } 149 if (iconArray[0][hitIcon[0][0]] == iconArray[1][hitIcon[1][0]] && 150 iconArray[1][hitIcon[1][0]] == iconArray[2][hitIcon[2][0]]) { 151 $("#result").html("上段が揃いました"); 152 } else if (iconArray[0][hitIcon[0][1]] == iconArray[1][hitIcon[1][1]] && 153 iconArray[1][hitIcon[1][1]] == iconArray[2][hitIcon[2][1]]) { 154 $("#result").html("中段が揃いました"); 155 } else if (iconArray[0][hitIcon[0][2]] == iconArray[1][hitIcon[1][2]] && 156 iconArray[1][hitIcon[1][2]] == iconArray[2][hitIcon[2][2]]) { 157 $("#result").html("下段が揃いました"); 158 } else if (iconArray[0][hitIcon[0][2]] == iconArray[1][hitIcon[1][1]] && 159 iconArray[1][hitIcon[1][1]] == iconArray[2][hitIcon[2][0]]) { 160 $("#result").html("左斜めが揃いました"); 161 } else if (iconArray[0][hitIcon[0][0]] == iconArray[1][hitIcon[1][1]] && 162 iconArray[1][hitIcon[1][1]] == iconArray[2][hitIcon[2][2]]) { 163 $("#result").html("右斜めが揃いました"); 164 } else { 165 $("#result").html("残念!!"); 166 } 167 } 168

もしお時間があればこちらの質問にも回答していただければ幸いです。
https://teratail.com/questions/114846

【追記】
ご回答された方申し訳ありません。もう少し詳細な説明をするべきでした。

このスロットは、縦3つ・左右斜め3つのラインに絵柄を揃えるルールですので、画面上はこのようになっています。
[2][4][6]
[5][8][3]
[9][7][1]
ハズレの際の絵柄を決める部分はこうなっています。

javascript

1iArray[0] = Math.floor(Math.random()*configTable[configId].length); 2 iArray[1] = Math.floor(Math.random()*configTable[configId].length); 3 iArray[2] = Math.floor(Math.random()*configTable[configId].length);

その結果出力された乱数は例えば
iArray[1,3,5]
だとすると、中央のラインは揃いませんが、画面では
[2][2][2]
[1][3][5]
[4][8][7]
と、上ラインに2の絵柄が揃ってしまいます。
※これは例ですので、実際のリールの配列とは違います

乱数は中央ラインにしか対応しておらず、上下ライン・左右斜めラインが予期しない形で揃ってしまうことがあるので、それを解消したいというわけです。

中央ラインだけ揃わないようにする方法は簡単ですが、これはリール配列の参照を行わないと実現できないと思うのですが、そのロジックが思いつきません。

実際のコードは記載していただかなくても構いませんので、考え方のヒントやアドバイスなどを
よろしくお願い致します。
【追記 2018/03/10】
この部分を

javascript

1iArray[0] = Math.floor(Math.random()*configTable[configId].length); 2 iArray[1] = Math.floor(Math.random()*configTable[configId].length); 3 iArray[2] = Math.floor(Math.random()*configTable[configId].length);

こうしてみたのですが、

JavaScript

1var stopLineArray = [[1,1,1],[0,0,0],[2,2,2],[0,1,2],[2,1,0]]; //停止ライン配列 2 3stopLineId = Math.floor(Math.random()*stopLineArray.length); 4for (var i = 0; i < iconNum; i++) { 5 if (iconArray[0][stopLineArray[stopLineId][i]] != iconArray[1][stopLineArray[stopLineId][i]] && 6 iconArray[1][stopLineArray[stopLineId][i]] != iconArray[2][stopLineArray[stopLineId][i]]) { 7 iArray[0] = iconArray[0][stopLineArray[stopLineId][i]]; 8 iArray[1] = iconArray[1][stopLineArray[stopLineId][i]]; 9 iArray[2] = iconArray[2][stopLineArray[stopLineId][i]]; 10 break; 11 } 12}

時々止まってしまったり、ボタンを押したときにリールが止まらないことがあります。
【追記 2018/03/12】
以下のような関数を作って、

javascript

1 2function slotAdjust(reelId) { 3 var hitIcon = [[0, 0, 0],[0, 0, 0],[0, 0, 0]]; 4 for (var i = 0; i < reelNum; i++) { 5 for (var j = 0; j < reelNum; j++) { 6 hitIcon[i][j] = ((-reelposY[i] / iconHeight) + j); 7 if (hitIcon[i][j] >= iconNum) { 8 hitIcon[i][j] -= iconNum; 9 } 10 } 11 } 12 13 for (var c = 0; c < stopLineNum; c++) { 14 if (iconArray[0][hitIcon[0][stopLineArray[c][0]]] == iconArray[1][hitIcon[1][stopLineArray[c][1]]] && 15 iconArray[1][hitIcon[1][stopLineArray[c][1]]] == iconArray[2][hitIcon[2][stopLineArray[c][2]]]) { 16 return false; 17 }else{ 18 return true; 19 } 20 } 21}

slotMove関数を以下のように変更してみたのですが、

javascript

1//リール回転 2function slotMove() { 3//省略 4 var adjust = slotAdjust(); 5//省略 6if (stopCount == reelNum) { 7 if(adjust){ 8 $('#startbtn').css("pointer-events", "auto"); 9 clearInterval(reelmoveAnime); 10 slotHits(); 11 }else{ 12 reelposY[i] += reelMoveSpeedY; 13 if (reelposY[i] > 0) reelposY[i] -= reelHeight; 14 $('.wrapper').eq(i).css("top", reelposY[i] + "px"); 15 } 16}

これでも揃ってしまうことがあります。
【追記 2018/03/13】
以下のように変更してみたのですが、

javascript

1var slipPosY = [0, 0, 0]; 2 function slotStop(i) { 3 //省略 4 slipPosY[i] = 0; 5 //省略 6 } 7 function slotMove() { 8//省略 9 for (var i = 0, stopCount = 0; i < reelNum; i++) { 10 if (!reelStopFlg[i] || reelposY[i] % iconHeight){ 11//省略 12 } else { 13 if(winFlg && winIconArray[i][(reelposY[i] / iconHeight)+stopLineArray[stopLineId][i]] != 1 || 14 stopCount == reelNum-1 && !winFlg && !adjust) { 15 if(slipPosY[i] < (iconHeight*3)){ 16 adjust = slotAdjust(); 17 slipPosY[i] += iconHeight; 18 reelposY[i] += reelMoveSpeedY; 19 if (reelposY[i] > 0) reelposY[i] -= reelHeight; 20 $('.wrapper').eq(i).css("top", reelposY[i] + "px"); 21 }else{ 22 stopCount++; 23 } 24 }else{ 25 stopCount++; 26 } 27 } 28//省略 29 } 30 } 31

これでもダメでした。

defghi1977👍を押しています

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

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

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

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

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

guest

回答8

0

乱数で適当に選んでから絵柄のチェックを行い、揃っていたらも一度やり直すってテしかないでしょうね

投稿2018/03/08 22:04

y_waiwai

総合スコア87774

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

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

guest

0

スロットゲームは本来、「ドラムが回って、止まったところで絵柄が揃っていれば当たり」ですよね。
ですが貴方のやっていることは、「ドラムを回さずに当たり外れを決めて、あとからドラムを調整する」ですよね。

因果が逆転しているからおかしなことになってしまうのでは?

投稿2018/03/09 03:40

tacsheaven

総合スコア13703

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

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

y_waiwai

2018/03/09 03:52

ま、まあ、、お気持ちはわかります。 が、この世の中にあるゲーム機、スロット機も含め、ガチャとかなんとかもひっくるめ、当落を決定してから回してたりするので。
miyabi-sun

2018/03/09 07:56

パチスロのスロットはBarが画面内に来るギリギリで左を押さないと、 リプレイやベル等を取りこぼして、負ける確率が高くなるような台もあります。 最終的にそのレベルまで延々質問するんじゃないですかね…
guest

0

あまりコードは読んでいませんが純粋な疑問があります。

そもそもなんですが
「高速回転しているリールを任意のタイミングで止めて必ず外れる」
ということはありえないと思います。どのような乱数を生成をしても同様です。

「必ず外れる」のは「乱数ではない」と思います。

まず考えるべきなのは
「必ず外れるリールの止め方、ロジック」ではないんですか?

#追記
質問文が追記されていたのでこちらも修正
差し当たってはハズレの時に
「ただ一つのハズレリール」に止まるようにしてみては?
あたりの逆みたいな感じですね。
あとはハズレリールの組み合わせ方を増やしていけばいいのでは?

投稿2018/03/09 00:41

編集2018/03/12 01:53
sousuke

総合スコア3828

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

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

y_waiwai

2018/03/09 01:08

いや、まー、そのー、、 世の中のゲーム機やスロット機は、当落が決められてからまわしてますんで
sousuke

2018/03/09 01:24

それはもちろんです。私が言っているのは「当落を決めて回しているのに、乱数を用いてリールを止めようとする」というアプローチがおかしいのではと言っています。当落が決まっているのであればリールの組み合わせも決まっているはずです。
y_waiwai

2018/03/09 01:31

ハズレは決まっていてもハズレの絵柄は決まってないわけで、 それを乱数で決めようというはなしかと。
sousuke

2018/03/09 01:53

ハズレの絵柄のうちから選ぶという話なら「あたりでないのにあたってしまう」という質問と不一致になります。 質問者は「あたりかハズレかは決まっているが、リールをランダムで止めているのであたってしまう。外れるように乱数を生成するなりなんだりして止まるリールをコントロールする」ということをしようとしているように見えます。 要するに私は「ハズレの絵柄を決めてしまうのが先では?」と言っています。
Lhankor_Mhy

2018/03/09 02:23

横からすみません。 質問者は「ハズレの絵柄の決め方」を質問していると思いますよ。 コードを見ると抽選から外れた時は、絵柄を乱数で3つ選んでいるけれどそのやり方だと必ずは外れないので、ランダム性を持たせた「ハズレの絵柄の決め方」はないですか?という質問でしょう。
Lhankor_Mhy

2018/03/09 02:26

あ、もしかして「抽選から外れた」時点で「ハズレの絵柄」は決まっているはず、とお考えなのですね。 コードを見る限り、そういうアルゴリズムではないですね。 「そもそもそのアルゴリズムがおかしい」とおっしゃるかもしれませんが、これはたぶん現実のスロットの仕様のシミュレータなので、「そもそも論」は質問者も困ってしまうかもしれませんね。
sousuke

2018/03/09 04:18

『「抽選から外れた」時点で「ハズレの絵柄」は決まっているはず』 ↑そういう風にしたほうがいいのではということです。絵柄を確定する必要はありませんが「ハズレの中から乱数で選ばない」と「ハズレにならない」はずです。 なので「絵柄を乱数で3つ選んで外れさせる」ということがおかしいと思います。 絵柄を乱数で選べば結果がランダムになるのは当たり前で、どういう風に乱数を生成しようが乱数である限りランダムになるはずで、ランダムであるということは当たる可能性もあるということです。
Lhankor_Mhy

2018/03/09 04:27

では、「ハズレの中から乱数で選」ぶ方法をご回答されればよろしいのでは。 それが質問者が求めているものでもあると思いますので。
sousuke

2018/03/09 04:44

なので「必ず外れるリールの止め方、ロジック」を考えるのが先と申し上げています。そのやり方までこちらが教える必要はないと思います。
Lhankor_Mhy

2018/03/09 05:15

『絵柄が全く揃わないようにするにはどの様な乱数の決め方やチェックを行えば』という質問に対し、「必ず外れるリールの止め方やロジックは自分で考えろ」という回答なのですね? つまり、「この質問には答えたくない」という回答を記述された、と理解してよろしいですか?
sousuke

2018/03/09 05:41

『絵柄が全く揃わないようにするにはどの様な乱数の決め方』に対して「そんな乱数は存在しない」という私の意見は変わりません。 『絵柄が全く揃わない乱数』ってなんですか? 「仕様がおかしいのでは?」というのを「質問に答えたくない」と感じられるのならそうでしょうね。 逆に私の読解力が足りなくて「ハズレの中からどう選べばいいんですか?」ともし問うているなら「ハズレ絵柄の候補から乱数で1つ選ぶ」ことに対して乱数の決め方やチェックなど不要でしょう。どの乱数を選んでも必ず外れるんですからね。極端な話ハズレの柄が固定の1種類でも100種類でも「ゲーム性」は全く変わりませんよ。飽きさせないようにハズレの柄を増やしているだけです。
Lhankor_Mhy

2018/03/09 07:43

用語は不適切なのかもしれませんが、文意から「乱数をどのようにマッピングすればいいのか」「どのように当たり絵柄を除外すればいいのか」という質問であることは読み取れると思うのですが…… まあ、感覚の違い、ということなのでしょうね。 長々と失礼致しました。
sousuke

2018/03/09 07:57

乱数を使うということは「結果がランダムでいい」からです。 結果がハズレと決まっていて「ランダムではいけない」のに「乱数を使う」というのはおかしくないですか? と最初から言っているだけなんですが… まあ、感覚の違い、ということでしょうね。
Zuishin

2018/03/11 00:24 編集

スロットは絵柄が何種類かあってそれが縦横斜めのいずれか一つでも揃うと当たりになります。 つまり外れは一種類ではないので乱数の入る余地はあります。 仮に前二つで次のように揃っていたとします。 1 2 9 1 1 1 この場合、右上か右下に 1 が来れば当たりですが、それ以外だと外れになります。 絵柄が 0 から 9 だとするとそのような組み合わせは 9 * 10 * 9 = 810 通りあることになります。 この時、あらかじめ外れの 810 通りを求めてから乱数でそのうちの一つを選ぶ方法もありますし、とりあえず全ての組み合わせから選んで当たっていたらやり直す方法もあります。 実装はやり直す方法の方が簡単ですが、最悪の偏りを引いた場合に時間がかかることがあります。ただしこの場合は演算も簡単で外れの確率も多いのでそれは無視してもいいと思います。 最初に外れの組み合わせを選ぶ方法は少しだけハードルが上がりますがそれほど難しいというほどでもありません。 どちらでも構わないと思います。 しかしどちらにしても乱数は必要ではないでしょうか。
sousuke

2018/03/11 01:35

私は乱数がいらないと言っているのではなく、外れさせたいのにランダム要素に頼るのはどうなのかと疑問を投げているだけです。特に今の質問文ではリール配列に途中でアクセスすらしたくないような印象を受けます。 Zuishin氏の仰るような「ハズレのロジック」が先にあるのであれば問題ないです。 質問者さんは「ハズレのロジック」がないのに「乱数でハズレを引く」ということをやろうとしているように見えたためそう言ったまでです。
guest

0

追記の回答

リールがいずれか揃っている、という判定は当然どこかで行ってるわけですよね?
それが行えないと、肝心な点数計算もできないわけですし。
それを、ハズレのときの乱数でのリール位置決定のときに実行すればいいのです。

1---> 乱数によりリール位置決定

  リールの当たり判定実行
当たりがあるか?あれば1へ
終わり

と、こういう手順でハズレのリール位置が決定できます

投稿2018/03/09 11:22

y_waiwai

総合スコア87774

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

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

nosonosolife

2018/03/09 13:25

ご回答ありがとうございます。 「リールの当たり判定実行」の部分を詳しく教えていただけると幸いです。
y_waiwai

2018/03/11 00:35

そもそも当たりの判定ができる、という前提の上でのハズレですから、それができないとそもそもこの質問が成立しませんねー
guest

0

自己解決

皆様ご回答ありがとうございました。以下のようにしたところ上手くいきました。
※以下のコードは重要な部分だけ抜き出しています

javascript

1var reelStopFlg = [null, null, null]; 2var reelStopOrder = [null, null, null]; 3var reelStopCount = 0; 4var slipPosY = [0, 0, 0]; 5 //リール回転 6 function slotMove() { 7 for (var i = 0; i < reelNum; i++) { 8 if (!reelStopFlg[i] || reelposY[i] % iconHeight) { 9 reelposY[i] += reelMoveSpeedY; 10 if (reelposY[i] > 0) reelposY[i] -= reelHeight; 11 $('.wrapper').eq(i).css("top", reelposY[i] + "px"); 12 } else { 13 slotSlip(reelStopOrder[reelStopCount]); 14 } 15 } 16 } 17 18 function slotSlip(i) { 19 if (slipPosY[i] < (iconHeight * 4)) { 20 if (reelposY[i] % iconHeight && stopIconArray[i][(reelposY[i] / iconHeight) + stopLineArray[stopLineId][i]] != 1) { 21 slipPosY[i] += reelMoveSpeedY; 22 reelposY[i] += slipPosY[i]; 23 if (reelposY[i] > 0) reelposY[i] -= reelHeight; 24 $('.wrapper').eq(i).css("top", reelposY[i] + "px"); 25 } 26 } 27 if (reelStopCount == reelNum){ 28 if (!winFlg) { 29 var adjust = slotAdjust(); 30 if (!adjust){ 31 adjust = slotAdjust(); 32 reelposY[i] += reelMoveSpeedY; 33 if (reelposY[i] > 0) reelposY[i] -= reelHeight; 34 $('.wrapper').eq(i).css("top", reelposY[i] + "px"); 35 } else { 36 $('#betbtn').css("pointer-events", "auto"); 37 clearInterval(reelmoveAnime); 38 slotHits(); 39 } 40 } else { 41 $('#betbtn').css("pointer-events", "auto"); 42 clearInterval(reelmoveAnime); 43 slotHits(); 44 } 45 } 46 } 47 48 function hitIconWrite() { 49 var hitIcon = [ 50 [0, 0, 0], 51 [0, 0, 0], 52 [0, 0, 0] 53 ]; 54 for (var i = 0; i < reelNum; i++) { 55 for (var j = 0; j < reelNum; j++) { 56 hitIcon[i][j] = ((-reelposY[i] / iconHeight) + j); 57 if (hitIcon[i][j] >= iconNum) { 58 hitIcon[i][j] -= iconNum; 59 } 60 } 61 } 62 return hitIcon; 63 } 64 65 function slotAdjust() { 66 var hitIcon = hitIconWrite(); 67 var hitCount = 0; 68 for (var c = 0; c < stopLineNum; c++) { 69 if (iconArray[0][hitIcon[0][stopLineArray[c][0]]] == iconArray[1][hitIcon[1][stopLineArray[c][1]]] && iconArray[1][hitIcon[1][stopLineArray[c][1]]] == iconArray[2][hitIcon[2][stopLineArray[c][2]]]) { 70 hitCount++; 71 } 72 } 73 if (0 < hitCount) { 74 return false; 75 } else { 76 return true; 77 } 78 } 79

投稿2018/03/17 03:46

nosonosolife

総合スコア42

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

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

0

iArray[0] = Math.floor(Math.random()*configTable[configId].length);

iArray[1] = Math.floor(Math.random()*configTable[configId].length);
iArray[2] = Math.floor(Math.random()*configTable[configId].length);
結果
[2][2][2]
[1][3][5]
[4][8][7]

上記の上下段をどのようにして導き出したのかは分かりませんがもうほぼ出来てるような…
ここまで実装出来たのであれば少し処理の順番を変えて、
中段リールを先に全て決める(上記だと1,3,5)ではなく、

1.あたりハズレを決める(どの絵柄を止めるかも)

2.左リールの上中下段を決める
→当たりなら必ず当たりの絵柄を含める

3.左リールと突き合わせて中リールを決める
→この際、テンパイラインを一つまでにするとあとが楽です

4.当たりの場合はテンパイラインに合わせて絵柄を止める、ハズレの場合はその逆

ご存知か分かりませんがドラクエのカジノのスロットみたいな動きに見受けられたのでこれで十分かと。
まぁボタンを押した際に止めるリールを決める場合も上記を応用するだけですが。

念の為3の左リールと突き合わせての部分ですが、考え方ということでもの凄いざっくりした実装手順を示すと

// 左リール決定 left[0] = Math.floor(Math.random()*configTable[configId].length); left[1] = Math.floor(Math.random()*configTable[configId].length); left[2] = Math.floor(Math.random()*configTable[configId].length); // 中リール上段決定(ハズレ時) var centerUpper = Math.floor(Math.random()*configTable[configId].length); if (left[0] != centerUpper && center[1] != centerUpper) { center[0] = centerUpper; }

でどうでしょうかね。

投稿2018/03/13 12:25

yag

総合スコア100

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

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

nosonosolife

2018/03/13 13:01

ご回答ありがとうございます。 ちょっと誤解されている部分がありますので説明しますと、 リールの作成は以下の絵柄を参照して、 var iconArray = [//絵柄配列 [4, 5, 1, 3, 4, 6, 1, 3, 2, 6, 4, 3, 5, 6, 2, 5, 6, 4, 3, 0, 6], [6, 4, 1, 3, 6, 5, 4, 5, 6, 4, 2, 3, 6, 0, 4, 3, 6, 1, 4, 2, 5], [5, 3, 1, 4, 6, 3, 4, 0, 6, 3, 5, 6, 2, 3, 4, 6, 5, 0, 3, 4, 6] ]; 以下のように連結して作成しています。 //リール作成 function addSlots() { for (var i = 0; i < reelNum; i++) { reelStopFlg[i] = false; $('.reel').eq(i).css("left", ((iconWidth + reelMargin) * i) + "px"); $('.wrapper').eq(i).css("height", reelHeight + "px"); $('.wrapper').eq(i).css("top", "-" + (iconHeight * Math.floor(Math.random()*iconNum)) + "px"); for (var j = 0; j < 24; j++) { if (j < iconNum) { $('.wrapper').eq(i).append("<li class='icon icon" + iconArray[i][j] + "'>" + iconArray[i][j] + "</li>"); } else { $('.wrapper').eq(i).append("<li class='icon icon" + iconArray[i][j - 21] + "'>" + iconArray[i][j - 21] + "</li>"); } } } }
yag

2018/03/13 13:49 編集

コードの記述ありがとうございます。 変数やclassが何を示しているのかの詳細が分からない部分があるので憶測になってしまし申し訳ありませんが、 何にしても左リールの上中下段から順番に決めれば簡単に実現できると思います。 左リールの配列から上中下段を取得(乱数で取ろうがなんでもお任せします) ↓ 中リールの上中下段を取得(上記同様) ↓ 先ほどの投稿の様にテンパイラインを判定 あとは、ハズレにしたいのであればテンパイラインが多くても一つになるまでずらす、 ずらすというのはリール配列が決まっているようなのでリールを一段下に下げる。 例として 仮に絵柄配列の一番最初の要素を左リール、二番目の要素を中リールとした場合に、各配列の0~2を使用した場合 1 1 6 4 4 6 ↓ 1 3 6 1 4 4 ↓ 1 6 6 3 4 1 何かまだ勘違いしていたらすいません。
nosonosolife

2018/03/13 13:50

ご返信ありがとうございます。 私の方も説明が足りなかったので申し訳ございませんが、 絵柄配列は var iconArray = [//絵柄配列 [4, 5, 1, 3, 4, 6, 1, 3, 2, 6, 4, 3, 5, 6, 2, 5, 6, 4, 3, 0, 6],// 左リール [6, 4, 1, 3, 6, 5, 4, 5, 6, 4, 2, 3, 6, 0, 4, 3, 6, 1, 4, 2, 5],//中リール [5, 3, 1, 4, 6, 3, 4, 0, 6, 3, 5, 6, 2, 3, 4, 6, 5, 0, 3, 4, 6]//右リール ]; というようになっています。
yag

2018/03/13 13:57

いえいえ、ご説明ありがとうございます。 でしたらやはり、上記の流れの再記述になってしまいますが 例としての 1 1 6 4 4 6 ↓ 1 3 6 1 4 4 ↓ 1 6 6 3 4 1 ↓ 1 6 1 6 3 3 4 1 5 ですかね。
yag

2018/03/13 14:01

すいません、左リールの数値間違えてました。 1 1 5 4 4 6 ↓ 1 3 5 1 4 4 ↓ 1 6 5 3 4 1 ↓ 1 6 1 5 3 3 4 1 5 です。
guest

0

当たりハズレのアルゴリズム云々の前に, まずはじめにリール(固定的な画像の並び)の設計が必要なのでしょう.

  • リールの絵柄の並びを設計する

その際に, 絶対にハズレとなるパターンをリストアップしておく

  • スロット開始時に「ハズレ」と判定した場合は, 予めハズレと判っているパターンにリールが止まるようにリールを滑らせる.(停止ボタンを押したタイミングから最も近いハズレの停止位置にリールを止める)

但しあまりにリールが「滑ると」インチキ臭く感じられてしまうので, なるべくハズレが均等となるようにリールの絵柄を配置しておく必要がある. もしくは常日頃リールが滑るように細工をしておくなど.

投稿2018/03/12 04:31

defghi1977

総合スコア4756

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

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

0

こう考えてはどうでしょう。

便宜上、9マスに次のように記号を振ってみます。

[a][b][c] [d][e][f] [g][h][i]
  1. まずa,b,d,eに適当に数字を振る。
  2. a,bに割り当てられていない数字のどれかをcに振る。
  3. d,eに割り当てられていない数字のどれかをfに振る。
  4. g,hに割り当てられていない数字のどれかをiに振る。
  5. a,d,c,eに割り当てられていない数字のどれかをgに振る。
  6. b,eに割り当てられていない数字のどれかをhに振る。
  7. a,e,c,f,g,hに割り当てられていない数字のどれかをiに振る。

投稿2018/03/09 15:19

KojiDoi

総合スコア13671

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問