紙ひこうきが風に逆らえたら:操作を増やすと難しくなるか易しくなるか
遊びを見つける執筆にClaudeを使用しています。

風に流される紙ひこうきを、左右にしか動かせない場合と、上下にも動かせる場合を考えてみます。動かせる向きが増えれば、風船をよける手段も増えるので、易しくなりそうです。一方で、考えることと指の動きも増えるので、かえって失敗が増えそうでもあります。どちらの予想にも、もっともらしい理由があります。 こうした問いは、頭の中で議論を続けても決着しません。ゲームの中身を一か所だけ変えて、同じ条件で何度か遊び、記録を比べるのが近道です。この記事は、その実験の設計書です。結果は書いていません。短い試作コードを動かして、読者が自分で答えを出す形にしています。 確かめる問いは次の一つです。同じコース、同じ風のもとで、操作の向きを「左右のみ」から「左右+上下」に増やすと、風船との衝突と手紙の取りこぼしはどう変わるか。
比べる二つの条件と、変えてはいけないもの
「ルールを一つ変える」実験では、変えるのは一か所だけです。ここで変えるのは操作の自由度だけにします。
- 条件A(左右のみ):左右キーで横方向に力を加えます。紙ひこうきの高さは固定です。
- 条件B(左右+上下):Aに加えて、上下キーで画面内の高さを動かせます。
次の項目は、両条件でまったく同じにします。
- 風船と手紙の配置(乱数の種を固定します)
- 風の強さと時間変化
- 制限時間(40秒)
- 終了条件(風船に3回ぶつかるか、40秒経過)
- 左右の操作の強さ
風は時間の関数で決めてあるので、プレイヤーの操作に関係なく毎回同じ風が吹きます。コースが毎回違うと、条件の差なのかコースの運なのか区別できません。
実験を始める前に、予想を紙に書いておきます。「Bのほうが衝突は減る」でも「Bのほうが手紙の取りこぼしが増える」でも構いません。結果を見てから「やはりそう思っていた」と感じてしまうことを防ぐためです。
試作を作る
次のコードを test.html という名前で保存し、ブラウザで開くと動きます。外部ライブラリもサーバーも使いません。
<canvas id="c" width="320" height="480" style="background:#dff"></canvas>
<p id="r">矢印キーで操作します</p>
<script>
const MODE="A"; // "B"にすると上下にも動けます
const g=c.getContext("2d"),K={};
onkeydown=e=>{K[e.key]=1;if(e.key.startsWith("Arrow"))e.preventDefault()};
onkeyup=e=>K[e.key]=0;
let s=12345;
const rnd=()=>(s=(s*1664525+1013904223)>>>0)/4294967296;
const items=[];
for(let i=0;i<40;i++)items.push({x:30+rnd()*260,y:-i*90-100,l:i%4==3});
const wind=t=>Math.sin(t*0.9)*120+Math.sin(t*2.3)*60;
let p={x:160,y:380,vx:0},t=0,hit=0,mail=0,over=false,scroll=0;
function step(){
const d=1/60; t+=d;
p.vx+=(wind(t)+((K.ArrowRight|0)-(K.ArrowLeft|0))*300)*d;
p.vx*=0.98; p.x+=p.vx*d;
if(MODE=="B")p.y+=((K.ArrowDown|0)-(K.ArrowUp|0))*160*d;
p.x=Math.max(10,Math.min(310,p.x));
p.y=Math.max(60,Math.min(460,p.y));
scroll+=100*d;
for(const o of items){
if(o.done)continue;
if(Math.hypot(o.x-p.x,o.y+scroll-p.y)<16){o.done=1;o.l?mail++:hit++}
}
if(hit>=3||t>=40)over=true;
}
let last=0,acc=0;
function loop(n){
acc+=Math.min(n-last,100);last=n;
while(acc>=1000/60&&!over){step();acc-=1000/60}
g.clearRect(0,0,320,480);
for(const o of items){if(o.done)continue;g.fillStyle=o.l?"#c33":"#36c";g.fillRect(o.x-8,o.y+scroll-8,16,16)}
g.fillStyle="#333";g.fillRect(p.x-8,p.y-8,16,16);
r.textContent=`モード${MODE} 手紙${mail} 傷${hit} 経過${t.toFixed(1)}秒`+(over?" 終了":"");
if(!over)requestAnimationFrame(loop);
}
requestAnimationFrame(loop);
</script>灰色の四角が紙ひこうき、赤い四角が手紙、青い四角が風船です。風船に触れると「傷」が増え、3回で終了します。この傷の数え方は、公式作品の「紙ひこうき郵便」で風船にぶつかると紙が傷み、3回で終了する仕組みになぞらえています。
試作の作りで押さえておきたい点が三つあります。
- 固定ステップ:1/60秒刻みで進めているので、画面の更新頻度が高いパソコンでも速度は変わりません。
- 乱数の種の固定:s=12345 のままなら、再読み込みしても配置は同じです。
- 風と操作の釣り合い:風の最大はおよそ180、左右の操作の力は300です。逆らうことはできますが、つねに押し返せるわけではありません。ここを変えると難しさの性質が変わるので、実験中は触らないでください。
条件Bを試すときは、const MODE="A"; の A を B に書き換えて保存し、再読み込みします。ファイルを test-A.html と test-B.html の二つに分けておくと、取り違えを防げます。
記録の取り方
まず、条件ごとに2回ずつウォームアップを行います。この回は記録しません。操作に慣れる前の成績を混ぜると、最初に遊んだ条件が不利になるからです。
本番は各条件5回、計10回です。順番はA B B A A B B A A Bとします。AとBを交互に並べず、挟み込むように並べるのは、疲れや慣れの影響が片方の条件に偏らないようにするためです。
1回ごとに、画面の表示を見て次の表に書き込みます。
- 1、条件:A、手紙(個):、傷(回):、経過(秒):、完走(○/×):、難しさ(1〜5):
- 2、条件:B、手紙(個):、傷(回):、経過(秒):、完走(○/×):、難しさ(1〜5):
「経過」は、傷が3回に達して途中で終わった場合は、そこまでの秒数です。傷3回で終わると取れる手紙も減るため、手紙の数だけを見ると、失敗が多い条件ほど手紙が少ない、という重なりが生じます。経過秒数と完走の有無を併記しておくと、この重なりをほどけます。
「難しさ」は、遊び終えた直後に自分の感覚で1〜5をつけます。数字の成績に表れない、操作の負担感を拾うための欄です。
結果の読み方
表が埋まったら、条件ごとに手紙・傷・経過秒の中央値(小さい順に並べた真ん中の値)と、最小値から最大値までの範囲を出します。平均は一回の大失敗に引っ張られやすいので、5回程度では中央値のほうが扱いやすくなります。
読み方の目安は次のとおりです。
- Bで傷が減り、手紙が増える:自由度が回避の手段として働いたと読めます。
- Bで手紙は増えるが、傷も増える:欲張れる余地が増えた分、無理をした可能性があります。経過秒と難しさの評価も合わせて見ます。
- Bで傷が増え、手紙が減る:上下の操作が、判断や指の負担になった可能性があります。上下を使わず左右だけで遊んだ回がなかったか、思い返してみます。
- AとBの範囲が大きく重なる:5回の記録では差があるとは言えません。回数を増やして試す余地があります。
大事なのは、範囲が重ならない場合にだけ差を主張することです。たとえばAの傷が0〜2回、Bの傷が1〜3回なら重なっているので、「Bのほうが悪い」とは言えません。数回の記録で厳密な結論は出ないので、ここで得られるのはあくまで自分の環境での傾向です。
起こりやすい誤り
- 条件を替えるたびにコースが変わる:乱数の種を書き換えていないか確かめます。風の式や、配置を作る数値を触った場合は、AとBを同じ設定で取り直します。
- 順番の偏り:Aを5回続けてからBを5回続けると、後半の慣れがBの成績に混ざります。決めた順番を守ります。
- キーの同時押しが拾われない:キーボードによっては、複数のキーを同時に押すと反応しないことがあります。Bで「右と上」を同時に押す場面があるため、反応が悪いと感じたら記録に注記しておきます。
- タブを切り替える:裏に回ると描画が止まります。試行の途中で別タブを触らないようにします。
- 結果に合わせた後付けの調整:Bが不利だったから風を弱める、といった調整は、実験の意味を失わせます。調整するなら、AとBを両方取り直します。
- 「上下」の使い方の偏り:Bで高さをほぼ動かさずに遊ぶと、Aと実質同じになります。上下をどれくらい使ったかを、一言メモに残しておくと読み返したときに役立ちます。
公式作品で同じ問いを広げる
試作で自分なりの答えが見えたら、「紙ひこうき郵便」を遊んで、その答えと比べてみます。この作品には、風の異なる3つのルートがあります。海辺は36秒で5通、丘は40秒で8通、山は44秒で10通の手紙を集め、最後の6秒で赤い郵便受けへ向かいます。操縦は左右キー、ドラッグ、矢印ボタンの3通りです。
設計から読み取れるのは、少なくとも操縦の入力方法が複数用意されているということです。上下方向の操作の有無や、風の効き方の細部は、作品を開いて確かめてください。
ここからは、入力方法を変える小さな実験にもなります。同じルートを、キー、ドラッグ、矢印ボタンで数回ずつ遊び、傷の数を比べます。試作で見たのが「向きの数」の影響だとすれば、こちらは「入力のしかた」の影響です。変える要素は、必ず一度に一つだけにします。
次の行動
まず test.html を保存し、予想を書いてから、ウォームアップ、本番10回の順に進めてください。表がそろったら、中央値と範囲を並べて、予想が当たったかどうかより「なぜそうなったか」を一言添えて残します。その後、「紙ひこうき郵便」を一つのルートで遊び、試作で気づいた感覚が当てはまるかを確かめてみてください。

