見出し画像

IchigoJam で「しかのこのこのここしたんたん」

こどもパソコン IchigoJam で、「しか」「のこ」「こし」「たん」をランダムで表示し、「しかのこのこのここしたんたん」が出たら終了するプログラムを作ってみました。

戦略

パーツを用意する

まずは、「しか」「のこ」「こし」「たん」のパーツを用意します。
IchigoJam 標準のフォントには、カタカナはあるものの、ひらがなはありません。
(IchigoLatte ならひらがなあるんですけどね)
そこで、フリーフォントの美咲ゴシックから用いる文字のデータを抽出し、埋め込みます。
具体的には、「し」「か」「の」「こ」「た」「ん」の6文字を用いるので、これらの文字のデータをキャラクターパターンRAMの先頭から埋め込みます。
さらに、どの文字 (文字コード) が各パーツに該当するかの情報を、配列に格納しておきます。

正解を用意し、判定方法を考える

各パーツ「しか」「のこ」「こし」「たん」に、それぞれ番号0、1、2、3を割り当てます。
すると、0以上4未満の乱数により、これらのパーツから1個を選ぶことができます。
また、「しかのこのこのここしたんたん」は「0, 1, 1, 1, 2, 3, 3」と表すことができます。
この列をよく見ると、0番「しか」は先頭のみに現れていることがわかります。
よって、次に出るべきパーツと実際に出たパーツによって、以下のように状態を遷移すればいいことがわかります。

  • 0番「しか」が出た場合は、今の状態にかかわらず、2番目の「のこ」を期待する状態にする

  • それ以外が出た場合は、それが次に出るべきパーツであればその次のパーツを期待する状態に、そうでなければ最初の「しか」を期待する状態になる

今回は、幸いにも「しか」は先頭にしか現れないため、途中から一致している可能性などを考えず、「しか」が来たら常にそれが先頭だと仮定して状態遷移を始めればよく、簡単です。

最後のパーツを期待する状態で、そのパーツが来たら、終了となります。
実装では、最後のパーツの次に期待するべき仮想のパーツ (番兵) を用意し、そのパーツを期待する状態になったら終了、としています。

パーツを表示した回数を数える

単純に表示するだけではあまり面白くないので、「しかのこのこのここしたんたん」が出て終了する際、パーツを表示した回数を出力するようにしました。
実験してみると、1万回以内に終了することが多いようでしたが、IchigoJam の変数1個で扱える最大値の32,767回を超えて続くこともあるようでした。
そこで、変数を2個用い、下位を表す変数が1万になったら上位を表す変数に繰り上がるようにしました。
さらに、回数を出力する際、上位を表す変数が正の場合は、下位を表す変数の値に応じて0を補うようにしました。
この0を補う処理をしないと、たとえば1万20回が120回と表示されてしまうことになるでしょう。

ちなみに、IchigoJam においては、数値を16進数や2進数で表示するときに使えるHEX$やBIN$は桁数を指定すると足りない部分を0で埋めてくれるのですが、10進数で表示するときに使えるDEC$はなぜか足りない桁は0ではなく空白で埋められてしまいます。
そのため、今回のような多倍長整数の出力においては(少なくともそのままでは)使用できず、自前で実装するなど工夫が求められます。
なんでやねん、0で埋めるか空白で埋めるか統一しとけよ💢

実装

1回実行すると、1セット処理を行って終了します。
再試行するには、また実行してください。

10 ' シカノコノコノココシタンタン
20 POKE#700,32,32,32,32,32,34,28,0,32,32,244,42,74,72,176,0,0,56,84,146,162,68,24,0,0,60,0,0,32,64,62,0,32,240,46,64,72,80,142,0,16,16,32,32,80,82,140,0
30 LET[0],0,1,1,1,2,3,3,4:LET[10],#E0,#E1,#E2,#E3,#E3,#E0,#E4,#E5
40 S=0:C=0:D=0
50 R=RND(4):?CHR$([10+R*2],[11+R*2]);
60 IF R=0 S=1 ELSE S=(S+1)*(R=[S])
70 C=C+1:IF C>9999 D=D+1:C=0
80 IF [S]<4 GOTO 50
90 ?CHR$(#A);
100 IF D=0 GOTO 140 ELSE ?D;
110 IF C<1000 ?0;
120 IF C<100 ?0;
130 IF C<10 ?0;
140 ?C

このプログラムは、CC0 1.0 でライセンスします。

実行結果例

「しかのこのこのここしたんたん」を表示したところで終了できています。

実行結果例1

「しか」の直後に「しか」が来るケースでも、ちゃんと判定できています。
単純に「次に来るべきもの以外が来たら、最初のパーツを期待する状態に戻る」というアルゴリズムにしてしまうと、このようなケースで判定を誤ってしまいます。

実行結果例2

おわりに

IchigoJam で「しかのこたん」の文字を用意し、「しか」「のこ」「こし」「たん」をランダムで表示し、「しかのこのこのここしたんたん」が出たらそれまでにパーツを表示した回数を出力して終了するプログラムができました。

今回は、キャラクターパターンの変更を行っています。
キャラクターパターンの変更はシリアル出力には反映されないため、実行結果はシリアル出力ではなく画面で確認することを推奨します。

※IchigoJamはjig.jpの登録商標です。

おまけ


この記事が気に入ったらサポートをしてみませんか?