どうも!LSSです!!
昨日のゲーム案、
ですが、記事投稿した後で「推理不能パターン」が有り得るのかどうかを判断する方法に気づきました!
「推理不能」となるのは、
「A~Eに入る1~5の並びが異なるのに、ヒントとなる3つの数値が全く同一である」
という事が発生した場合。
ただ、このシャッフルパターンって、全部で「5x4x3x2x1=120」の120通りなんですね。
チェックできない数ではない…ですが、面倒臭がりな自分は手動でチェックするより、スクリプトで判定するものを作っちゃいました!(←実際どっちが面倒か怪しいですがw)
ヒント重複パターン
↑実際にスクリプトで検出した、ヒントが重複するパターンだけを列挙したものです。
ペア4組、8パターン、推理で判別できないパターンがありました^^;
今回の検証に使用したコード
<div id="gamen"></div>
<p>
<script>
txt='ABCDE A+C,B-D,C+E<br/>';
nums=;
hints=;
ptn('');
for(j=0;j<nums.length;j++){
if(hints.filter( (n)=>{if(n==hints[j]){return n}}).length>1){txt+=nums[j]+' '+hints[j]+'<br/>'};
}
gamen.innerHTML=txt;
function ptn(a){
var i;
for(i=1;i<6;i++){
if(a.indexOf(i.toString(10))<0){
if(a.length<4){
ptn(a+i.toString(10));
}else{
nums.push(a+i.toString(10));
hints.push( (parseInt(a.substr(0,1))+parseInt(a.substr(2,1)))+','+(parseInt(a.substr(1,1))-parseInt(a.substr(3,1)))+','+(parseInt(a.substr(2,1))+i) );
}
}
}
}
</script>
</p>
一応載せておくと、↑のようなコードで判定・検出しました。
function ptn(a)
という関数は、再帰呼び出しによって「1~5の並びのパターンを全て試み、5つ並ぶたびに配列変数 nums に'12345'のように文字列型で並びを記録、配列変数 hints にヒントとなる3つの数値を '5,-3,7' のように文字列型として記録する」ものです。
そうして全てのパターンを配列変数に収めてから、
for(j=0;j<nums.length;j++){
if(hints.filter((n)=>{if(n==hints[j]){return n}}).length>1){txt+=nums[j]+' '+hints[j]+'<br/>'};
}
今度はその出来上がった配列変数に対して、 hints が重複しているものだけを文字変数txtに追記。
あとはtxtを画面上に出力する、という処理になっています。
で、どうするか?
推理不能となるパターンを洗い出す事ができました。
120パターン中 8パターン なので…「ヒントのルールはそのまま。シャッフル時にこの8パターンに該当する並びになってしまったら再シャッフル」でいいかな、と^^
という事で、昨日の記事も既に修正しました!
現在、シャッフルしても「理詰めで並びを判別できる」ものばかり出てくるようになりました。
…とは言え、肝心のクリア判定などをまだつけていないんですけどね^^;
ってなとこで、今回はこのへんで!
次回もまた、よろしくお願いします^^