マガジン

スライドパズルに「空きマスが2つ」あったら簡単になるか

遊びを見つける

執筆にClaudeを使用しています。

道をつなぐ線、丸い駒、幾何学のタイルからなるパズルの模型。
記事のテーマをもとに制作したAI生成イメージ。実際のゲーム画面ではありません。

3×3のスライドパズルで、空きマスが中央にあるときに動かせるタイルは上下左右の4枚です。角にあるときは2枚に減ります。ここに空きマスをもう1つ足す場面を考えてみます。動かせるタイルは増え、タイルを避けて回り込む余裕も生まれそうです。では、パズルは簡単になるのでしょうか。 「簡単」は一つの意味ではありません。完成までの手数が減るなら簡単かもしれません。一方で、1手ごとの選択肢が増えて迷う時間が延びるなら、手数が減っても楽とは言えません。この記事は、手数と考える時間を分けて測り、自由度の増加がどちらにどう効くかを自分で確かめるための実験設計書です。結果は書きません。測り方と読み方を示すので、手を動かして答えを出してください。

この記事の目次
  1. 問いを分ける:「簡単」を三つの量に分解する
  2. 準備するもの:比較する3つの条件と、測定用の小さなページ
  3. 手順:順序を入れ替えながら、同じ人が繰り返す
  4. 記録の取り方:何を、どの単位で、何回
  5. 結果の読み方:数字の組み合わせから判断する
  6. 起こりやすい誤り
  7. 次の行動

問いを分ける:「簡単」を三つの量に分解する

最初に、「簡単」を測れる量に分けます。

  • 手数:完成までにタイルを動かした回数です。
  • 初手までの時間:シャッフル直後から最初のタイルを動かすまでの秒数です。盤面を読んで方針を立てる時間の目安になります。
  • 合計時間:完成までの秒数です。「合計時間 ÷ 手数」で、1手あたりの時間も出せます。

この3つが別々に動く可能性が、実験の面白いところです。たとえば、手数が減って1手あたりの時間が増えれば、「動かす回数は減ったが、考える量は増えた」と読めます。逆に両方が減れば、自由度の増加が素直に効いたことになります。

実験を始める前に、予想を紙に書いておきます。「手数は減る・増える・変わらない」「初手までの時間は短くなる・長くなる」の2行です。結果を見てから予想を思い出すと、記憶が結果に寄ってしまいます。保護者の方が子どもと行う場合は、予想を一人ずつ書き、あとで見比べると話し合いの材料になります。

準備するもの:比較する3つの条件と、測定用の小さなページ

空きマスを増やすと、同じ盤では数字タイルが減ります。3×3で空きを2つにすると、タイルは8枚から7枚です。つまり「空きが増えた効果」と「タイルが減った効果」が混ざります。これを分けるため、条件を3つ用意します。

  • A、盤:3×3、タイル:8枚、空き:1つ、役割:基準
  • B、盤:3×3、タイル:7枚、空き:2つ、役割:調べたい条件
  • C、盤:4×2、タイル:7枚、空き:1つ、役割:タイル数をBに揃えた対照

BとCはタイルが同じ7枚です。Bが楽でもCも同程度に楽なら、空きマスの数ではなく、タイルが少ないこと自体が効いている可能性があります。BだけがCより楽なら、空きが2つであることの寄与が見えてきます。

測定には、次の最小のHTMLを使えます。テキストエディタに貼り付けて「.html」で保存し、ブラウザで開くだけで動きます。外部通信は使いません。条件を選んで「シャッフル」を押し、タイルをクリックすると、空きマスに隣り合うタイルが動きます。完成すると手数と時間が表示されます。

html
<!doctype html><meta charset="utf-8">
<select id="c"><option value="3,3,1">A 3×3 空き1<option value="3,3,2">B 3×3 空き2<option value="4,2,1">C 4×2 空き1</select>
<button id="s">シャッフル</button><div id="b"></div><p id="o"></p>
<style>#b{display:grid;gap:4px}#b button{width:60px;height:60px;font-size:22px}</style>
<script>
let W,H,K,a,n,t0,t1;
const $=i=>document.getElementById(i);
function nb(i){const x=i%W,y=i/W|0,r=[];
 if(x>0)r.push(i-1);if(x<W-1)r.push(i+1);
 if(y>0)r.push(i-W);if(y<H-1)r.push(i+W);return r}
function sw(i,j){[a[i],a[j]]=[a[j],a[i]]}
function draw(){const b=$('b');b.style.gridTemplateColumns=`repeat(${W},60px)`;
 b.innerHTML='';a.forEach((v,i)=>{const e=document.createElement('button');
 e.textContent=v||'';e.style.visibility=v?'visible':'hidden';e.onclick=()=>go(i);b.append(e)})}
function go(i){const j=nb(i).find(j=>!a[j]);if(!a[i]||j===undefined)return;
 if(!n)t1=performance.now()-t0;
 sw(i,j);n++;draw();
 if(a.every((v,p)=>v===(p<W*H-K?p+1:0)))
  $('o').textContent=`手数${n} 初手まで${(t1/1000).toFixed(1)}秒 合計${((performance.now()-t0)/1000).toFixed(1)}秒`}
$('s').onclick=()=>{[W,H,K]=$('c').value.split(',').map(Number);
 a=[...Array(W*H).keys()].map(p=>p<W*H-K?p+1:0);n=0;$('o').textContent='';
 for(let s=0;s<200;s++){const z=a.map((v,p)=>v?-1:p).filter(p=>p>=0),e=z[Math.random()*z.length|0],c=nb(e);sw(e,c[Math.random()*c.length|0])}
 draw();t0=performance.now()};
</script>

完成形は、1から順に左上から右へ並び、空きマスが末尾(右下側)に集まった配置です。シャッフルは完成形から200回ランダムに動かす方式です。完成形から動かして作るので、必ず解ける配置になります。

通常の空き1つのスライドパズルの感覚を確かめたい場合は、アソバースの公式作品「かたちのあいだ」を使えます。3×3の入門と4×4の2段階があり、ヒントや一手戻すも備えています。ただし、この作品の盤の設定は作品を開いて確かめてください。この実験の測定には、条件を揃えやすい上のページを使い、「かたちのあいだ」はウォームアップや感覚づくりに回すのがおすすめです。

手順:順序を入れ替えながら、同じ人が繰り返す

1人で行う場合の手順です。

  1. 上のページを開き、各条件で1回ずつ練習します。この3回は記録に入れません。
  2. 1ラウンドを「A・B・Cを1回ずつ」とします。ラウンドごとに順番を入れ替えます(1ラウンド目はA→B→C、2ラウンド目はC→A→B、3ラウンド目はB→C→A、と回します)。
  3. 6ラウンド行い、各条件で6回分のデータを集めます。
  4. 各回、シャッフルを押した直後からスタートします。完成表示が出たら、手数と2つの時間を記録します。
  5. 完成表示が出たら、そのまま動かさずに「シャッフル」を押し直してください。完成後にタイルを動かすと、盤面と表示がずれます。

順番を回す理由は、慣れと疲れの影響を3条件に均等に配るためです。Aばかり先に10回やると、後半のBやCは「練習済みの手」で解くことになり、条件の差と慣れの差が区別できなくなります。

ルールも固定します。ヒントや一手戻すは使いません。公式作品を併用する場合、「一手戻す」では手数が減らない仕様なので、手数が数え直される前提で比較するとずれます。この実験では戻し機能を使わず、戻したくなったら手で逆向きに動かして、その1手も手数に数えます。

複数人で行う場合は、人ごとに全条件を回し、人どうしの数字を直接比べないでください。見るのは「同じ人の中での条件の差」です。得意不得意の差が条件の差を覆い隠してしまうからです。

記録の取り方:何を、どの単位で、何回

記録用紙は次の列で作れます。

ラウンド / 条件 / 手数 / 初手まで(秒) / 合計(秒) / 1手あたり(秒) / メモ

  • 手数は整数で、画面の表示をそのまま写します。
  • 秒は小数第1位までで、画面の表示をそのまま写します。
  • 1手あたりは後で「合計 ÷ 手数」を計算して埋めます。
  • メモには、途中で席を立った、通知が来た、といった外乱を書きます。外乱があった回は、集計から外す候補としてチェックを付けます。

集計では、平均ではなく中央値を使うことをおすすめします。6回のうち1回だけ長く固まった試行があると、平均は大きく引っ張られます。条件ごとに6つの値を小さい順に並べ、3番目と4番目の平均が中央値です。あわせて、最小と最大も書き添えると、ばらつきの大きさがわかります。

条件の違いがバラつきの範囲に収まっているかどうかも見ます。たとえばAとBの中央値に差があっても、6回の値の範囲が大きく重なっているなら、差は偶然かもしれません。回数を12回に増やして、傾向が続くか確かめてください。

結果の読み方:数字の組み合わせから判断する

手数と時間の組み合わせで、解釈の候補が変わります。Bを基準にAおよびCと比べたときの読み方を表にします。

  • 手数が少なく、合計時間も短い、読み方の候補:自由度が近道として働いたと読めます。Cでも同様なら、タイル数の少なさが原因の可能性も残ります。
  • 手数は少ないが、1手あたりの時間が長い、読み方の候補:選択肢が増えて、1手ごとに考える量が増えたと読めます。
  • 手数は同程度で、初手までが長い、読み方の候補:動かせる手が増えて、方針を立てるのに時間がかかったと読めます。
  • 手数が多い、読み方の候補:定石の動かし方が使いにくくなり、動きが散らばった可能性があります。メモ欄の動き方の感想も見直してください。
  • 差がはっきりしない、読み方の候補:3×3程度の盤では、自由度の影響が小さいという答えも立派な結果です。盤を大きくして再実験する材料になります。

確かめるべき順序は、次のとおりです。まずBとAを比べます。差があれば、BとCを比べます。BとCに差がなくAとだけ差があるなら、空きの数よりタイルの少なさが原因です。BがCとも違うなら、空きが2つであることが効いている可能性があります。ただし、4×2と3×3は盤の形が違い、辺や角の数も違います。Cは完全な対照ではなく、あくまで近い比較対象です。この限界は、結論に書き添えてください。

数学的な背景を一つだけ知っておくと、読み方の助けになります。空き1つの3×3では、タイルの並べ方のうち半分(9!の半分で181,440通り)しか完成形にたどり着けません。空きが2つあると、この偶奇の制約がなくなることが知られています。このページは完成形から動かして配置を作るので、条件による解けない配置の違いは出ません。それでも、配置の空間が違うことは頭に置いておきます。

起こりやすい誤り

  • シャッフルの強さが揃っていない:このページは200回ランダムに動かして混ぜますが、同じ回数でも、盤や空きの数が違えば、実際の「完成までの距離」は同じとは限りません。条件間の難しさを厳密に揃えたい場合は、幅優先探索で最短手数を求めるプログラムを別に書き、「自分の手数 ÷ 最短手数」で比べる方法があります。この記事のページには含めていません。
  • 初手までの時間に準備動作が混じる:座り直す、ページを探すなどの時間を含めてしまいます。シャッフルを押す前に姿勢を整えてください。
  • 声に出して考える・メモを取る:条件によって癖が変わると時間が歪みます。やるなら全条件で同じようにします。
  • 同じ配置を覚えてしまう:ページはシャッフルのたびに配置が変わるので避けやすいのですが、公式作品の「同じ配置の再挑戦」を使うと、慣れの効果が強く出ます。実験の測定には使わないでください。
  • 結果を見て回数を決める:6回で差が出なければ12回にし、差が出たらそこで止める、という進め方は結論に偏りを生みます。回数は先に決めてください。
  • 一度の結果で結論を出す:日を変えて、もう一度同じ手順を行い、傾向が続くか確かめると信頼できます。

次の行動

まず、上のコードを保存して開き、A・B・Cを1回ずつ練習してください。そのうえで、予想を紙に書いてから、6ラウンドの記録を取ります。中央値を出して、手数・初手までの時間・1手あたりの時間のどれに差が出たかを確かめてみてください。