Little Strange Software

スマホアプリの開発を行う LittleStrangeSoftware のブログです。

【ゲーム案】昨日の推理ゲーム、修正できました

 どうも!LSSです!!

 

昨日のゲーム案、

little-strange.hatenablog.com

ですが、記事投稿した後で「推理不能パターン」が有り得るのかどうかを判断する方法に気づきました!

 

「推理不能」となるのは、
「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パターンに該当する並びになってしまったら再シャッフル」でいいかな、と^^

 

という事で、昨日の記事も既に修正しました!

現在、シャッフルしても「理詰めで並びを判別できる」ものばかり出てくるようになりました。

…とは言え、肝心のクリア判定などをまだつけていないんですけどね^^;

 

 

 

ってなとこで、今回はこのへんで!

次回もまた、よろしくお願いします^^