第3話 トライ&エラー

「私の名前は『小枝 絵里』エリーって呼ばれてる。どこにでもいる小学4年生だったんだけど、ある日突然、魔法少女になっちゃった。とはいっても、普通に学校に行ってるし、普通に友達と遊んだり、普通の女の子として生活してるよ。今日は土曜日、魔法の先生からいろいろな魔法を教えてもらうことになってるんだ。楽しみ。楽しみ」


 絵里とチーチャーは、辺りに誰もいなさそうな自然の満ちた草原にやってきた。戦うわけではないので、魔法使いのコスチュームには変身することなく普段着のままである。

 今日の絵里は黄色いトレーナーシャツと、ひだのついた赤いミニスカート、黒い短めの靴下で、赤い紐の白いスニーカーである。


 チーチャーとは絵里に魔法を教えている先生のような存在である。家では勉強を教えてくれている家庭教師のような存在でもある。


 見た目はチーターのぬいぐるみである。頭に青い学士帽を被っているのが特徴である。


「今日は、誰もいないここで、実践的な魔法を教えるニャ。まずは魔法の基本、スプライトだニャ。SPSETでクルマを出してみようかニャ」


 スプライトというのは、本来ではプログラミング用語である。ゲームやWEBサイトを作るときに表示するセル画のような絵を意味する。座標を指定することで、任意の位置に表示したり、角度を指定することで回転させたりすることができる。


この魔法の世界では物体そのものを意味する。すべての物体は、ある意味スプライトなのである。


「『SPSET 0,2400』えいっ!」


 絵里は頭でイメージしたプログラムを心で実行した。


 絵里の目の前に赤いクルマが出現した。全体的に赤く、屋根は白く、2ドアの4人乗りといったボンネットのあるハッチバックの形状をしている。


「おー。出てきた出てきた。もう一度、やったら、もう一台でてくるのかな?」


絵里は再び魔法のプログラムを実行する。


「『SPSET 0,2400』えいっ!」


2台めのクルマは……出てこなかった。


「あれぇ」


 絵里が少し困った表情を浮かべていると、チーチャーが先生のような口調で話した。


「SPSETには、管理番号というのがあることは知ってるニャ? 魔法もBASICと同じで、RUNで実行をしても、管理番号が同じだと、そこには既に存在してるので、新たに召喚されるわけではないのニャ。管理番号を変えれば、2つめは出てくるけどニャ」


 BASICの命令には書式というものが決まっている。SPSETの場合は『SPSET 管理番号,定義番号』である。管理番号というのは、そのスプライトを識別する任意の番号である。定義番号というのは、スプライトの種類(今回は右向きの赤いクルマ:2400番)である。

 どの定義番号でどの種類の物体が定義されているかは『SMILE BASIC』の『命令表』。『プチコン』に内蔵されている『スマイルツール』で知ることができる。


「じゃぁこれかな。『SPSET 1,2396』えいっ!」


 今度は紫色のクルマが出現した。


「大きな物を動かすときはそれなりに魔力も消費するから注意するニャ」


 チーチャーは説明した。絵里は魔法の練習に夢中だった。


「もっと出してみよう。SPSET……』えいっ。えいっ!」


 絵里は何度もプログラムを実行する。クルマはたくさん出現する。


「ちょっと疲れたよー。動けないよー」

「だから言ったニャ」


 魔法世界でのプログラミングではプログラムを実行する際に魔力を消費する。基本的に魔力の消費は物体の質量に比例する。大きなものを出現させたり動かすときは大きな魔力が必要になる。魔法を極めることで魔力は強くそして多くなっていく。

 絵里はこの前、魔法使いになったばかりであり、まだ魔力は決してたくさんあるわけではなかった。


「とりあえず、このリンゴを食べて元気つけるニャ」


 絵里はチーチャーが持ってきたリンゴを食べた。何とか魔力は回復した。


「SPCLRで片付けてっと、せっかくクルマが出てきたし、ドライブに行こう。さぁ乗って乗って、私の運転で」


 絵里は楽しそうな笑顔でチーチャーを誘う。絵里はSPSETで出現させたクルマに乗り込んだ。


「ドアも開く、シートもフカフカ。ハンドルもある。ペダルもある。さぁ走るぞー。あれっ、走らないよ」

「SPSETではスプライトを召喚するだけなんだニャ。プログラムがなければただの鉄の固まりってわけなのニャ。プログラムで制御することで動くようになるんだニャ。BASICには入力を受け付ける命令があるニャ。それを組み合わせることがポイントだニャ」


 召喚とは異世界から物体や生物を現実世界に呼び出すことである、SPSETは召喚魔法ではあるが、スプライトは形だけの物体であり、プログラムを使って始めて動かすようにできるものである。


 絵里は考えながらプログラムを組み立てる。


「入力を受け付ける命令は、BUTTON()、STICK……これが動かされたときに……ここの部分がこうなって……だからここでその値を使えば……できた。実行えぃっ!」


 絵里が実行したプログラムは『プチコン』の『BASIC』で表すと次のようなものであった。

ACLS

SPSET 0,2400

X=32

Y=120

S=0

WHILE 1

 IF BUTTON() AND #A THEN S=1

 X=X+S

 SPOFS 0,X,Y

 VSYNC

WEND


 絵里は魔法のプログラムを実行した。


「やったー。動いた動いた。でも、ブレーキはどこ? 止まらないよー」


 クルマがゆっくりと動き出した。


「プログラムは思った通りには動かないんだ。書いた通りに動くんだニャ。まぁ焦らずにプログラムを強制終了させるニャ」


 BASICにはプログラムを強制的に終了させる機能がある。プチコンでもスタートボタンを押せば、プログラムは止まってくれるのである。


 絵里はプログラムを書き直した。


「今度はここを書き換えて、ついでにここも工夫してRUN。えぃっ!」


 絵里が実行したプログラムをBASICで表すと次のようなものであった。

ACLS

SPSET 0,2400

X=32

Y=120

S=0

WHILE 1

 IF BUTTON() AND #A THEN S=S+1

 IF BUTTON() AND #B THEN S=S-1

 X=X+S

 SPOFS 0,X,Y

 VSYNC

WEND


「おー、前に進むし、ブレーキもできる。って、ブレーキかけすぎると後ろに進んじゃう。まぁ楽しいからいいっか。ハンドルはついてないけど。ハンドルつけるにはどうすればいいのかな。そっかSPROT……よしできた。さぁ走れ私のマシン!」


 絵里はどんどんプログラムを書き換えて実行する。


 絵里が書いたプログラムをBASICで表すと次このようなプログラムであった。ちなみにBASICは改行がなくても動作する場合もある。その場合「:」で区切る必要がある。

ACLS:SPSET 0,2400

X=32:Y=120:S=0

R=0

WHILE 1

 STICK OUT SX,SY

 IF BUTTON() AND #A THEN S=S+1

 IF BUTTON() AND #B THEN S=S-1

 R=R+SX

 X=X+S

 SPOFS 0,X,Y

 SPROT 0,R

 VSYNC

WEND


「さぁ走れ、さぁ曲がれ! あれ、曲がってるんだけど曲がってない」


 絵里が実行したプログラムでクルマは走った。ハンドルを操作すると、クルマの向きは変わった。しかし、クルマは旋回することなく、横滑りしたように直進したままだった。


「それだと向きが変わるだけで曲がらなんだニャ、クルマの旋回のような動きをさせるには向いてる角度に進ませる必要があるニャ。そこで登場するのはこれニャ。」


 チーチャーは説明する。


「ハイ、さんかくかんすうーっとニャ」 ――有名な青いロボットのように


 チーチャーは続けて説明する。

  

「難しいことは考えずにやってみることが大事ニャ。『三角関数』の『COS(コサイン)』と『SIN(サイン)』はこう使えばこう動くということは実際やってみれば分かるニャ。そうしたら算数の公式を覚えるかのように使えばいろんなことができるようになるニャ。プログラミングをやるのに小学生も大人も関係ないニャ。学校で習ったことがない数学の知識でも、どんどん取り入れることニャ。でも学校の勉強はがんばらないとダメニャ。ちなみに模範解答のプログラムはこれニャ。このプログラムを理解して、ちゃんと使いこなせるようになることが、魔法使い(プログラマー)として大切なことなのニャ」


チーチャーが示したプログラムをBASICで表すと次のようなものであった。

ACLS:SPSET 0,2400

X=32:Y=128:S=0:R=0

WHILE

 STICK OUT SX,SY

 IF BUTTON() AND #A THEN S=S+0.1

 IF BUTTON() AND #B THEN S=S-0.1

 R=R+(SX*0.1)

 X=X+COS(R)*S

 Y=Y+SIN(R)*S

 SPOFS 0,X,Y

 SPROT 0,DEG(R)

 VSYNC

WEND


絵里はチーチャーの助言を元に、プログラムを書き直して実行する。


「うわーい。クルマだクルマだ。走る曲がる止まるバックする、たーのしー。音はしないけど……音を鳴らすプログラムは書いてないからね」

「どうすれば音が出るか?分かるニャ?」

「音を鳴らす命令は『BEEP』だよね。だったらこうすれば……」


 絵里はプログラムを書き換えて実行する。


「ほら。音が出たよ。違うスプライトでもやってみよう。今度は違うクルマ、飛行機、ネコ。背中に乗るにはちょっと小さいな。大きくする命令は……と、SPSCALEだ。大きくなった背中に乗るぞー。でもこれだと、滑ってるようでなんか変。じゃぁこうすれば……」


 絵里とチーチャーは楽しい魔法(プログラミング)のお勉強の時間を過ごした。


「よし、できたぁ。ネコが歩いてるみたい。ふぅー楽しかった。今日はこのくらいでいいかな」

「そうだにゃ魔法の勉強にはリフレッシュは大切ニャ」

「最後にプログラムをセーブっと『SAVE ”NORIMONO”』っと」


 プログラミングで大事なことの一つ。それは作ったプログラムをセーブすることである。ゲームをやるときにセーブをせずに冒険を進めて、突然ママに「いつまでゲームやってんの?」ブチっとか、ネコにリセットボタンをポチッと押されて、「俺の3時間を返せー」とならないためには、こまめにセーブをすることは大事なのである。

 プログラミングでもそれは同じなのである。ちなみにBASICのセーブの命令の書式は『SAVE ”プログラム名”』である。SAVEしたプログラムはLOAD命令で読み込むことができる。プログラミング言語では命令や変数ではない任意の文字列は『”』ダブルクォートで囲う必要がある。


 絵里とチーチャーはプログラミングの練習を終え、一息つく


「さぁ何か美味しいもの食べたいねー」


 絵里とチーチャーは家のほうに向かった。


「近くに新しいパン屋さんができたんだよね。今は安売りしてるから、ちょっと行ってみようかな」


 チーチャーはぬいぐるみ体型である。見た目はぬいぐるみそのものなので小学生のエリーとこうして絵里

の肩に乗って歩きながらお話していても何の違和感もないのである。


 絵里はパン屋さんでパンを買った。川沿いにあるベンチで座って、チーチャーと一緒にパンを食べる。


「おいしいね」

「にゃ、にゃ、にゃ」

「よし、パンも食べたし、元気回復」


 魔法世界では魔力は気力のようなものである。元気がいいときは魔力が多く、元気がないときは魔力が少なくなり魔法が使えなくなることもある。魔力は食べ物を食べたり、休息を取ることで回復する。


 突然、大きな物音が聞こえた。

 

 絵里があたりを見渡すと、山の方の遠くに巨大な何かが動いているようなものが見えた。


「にゃ、にゃ、また何かありそうな予感がするニャ」

「そうだね。ちょっと見に行こうか?」


 絵里もチーチャーに頷いて見にいくことにした。

 だが、歩いていくにはちょっと距離が遠いようであった。


「走って行くのは疲れるし、魔法を使ってクルマをだしてそれに乗っていこう。っておもったけど、私みたいな子供が運転してたら、おまわりさんに捕まりそうだし……そうだ! これなら」


 絵里はネコ、いや犬のスプライトを出した。


「これなら、まぁ大丈夫だよね。いっけー、はいよーワンちゃん」


 ここは人間の住む地域、大型の猫はいなくても大型の犬はいても不思議ではない。大型の猫となると、ジャガーやピューマといった猛獣である。大型の犬ならば西洋の野山の小さな家で老人と少女が買ってそうなイメージがあるだろう。

 絵里たちは、異変が起きてそうな山に向かった。その地域は薄暗い黒い霧で覆われていた。巨大な何かとはなんだったのか?


「何だあれ。大きい」


 巨大なロボットのような物体が動き回っていた。何の目的なのだろうか? あたりの自然は酷く荒らされている。大きな爆発があったのだろう。だが人間が犠牲になったような形跡はなかった。


 絵里は戦う準備をする。スマホから魔法の杖を出現させる。杖を手にとって、セットアップのプログラムを実行する。すると虹色の光とともに絵里はピンク色のドレスの魔法使いへと変身する。

 ちなみに魔法世界ではすべての物体はある意味スプライトである。当然魔法の衣装もスプライトであり、うっかりSPCLRなんて命令を実行してしまって恥ずかしい思いをしてしまった魔法使いも過去にはいたであろう。


 絵里の持っている魔法の杖はプチコン同様に複数のスロットが存在する。スロット毎にプログラムを保持することができる。


 絵里は各スロットに、飛び道具の攻撃魔法。打撃攻撃の魔法。防御魔法をLOADする。これで戦闘準備完了ってわけである。

 BASICプログラムでは、LOAD命令によって、過去に自分で書いてSAVEしたプログラムを読み込むことができる。BASICでなくても、セーブとロードはプログラミングする上では重要なことである。


 絵里は巨大ロボットに近づいていく、ある程度接近したら、飛び道具の魔法で攻撃する。


「狙い準備よし。まずはこの攻撃。予め用意しておいたプログラムを『RUN 1』いっけぇー!」


 絵里は杖を敵にむけて心でプログラムを実行した。杖の先から火の玉が飛び出して、敵の方に飛んでいく。当たると熱い思いをして火傷しそうであったが、敵はダメージを受けている様子ではなかった。


「火がダメなら次はこれ。ちょっとプログラムを書き換えて『RUN 1』いっけー!」


 絵里が次に放ったものは岩。これは当たると痛そうである。


 しかし、どうやら効き目はあまりなかった。敵の体が硬すぎるのである。そうしているうちに敵が絵里に気づく。敵の巨大ロボットの目から強力な光の玉による攻撃が飛んでくる。


「あれぇー。硬すぎだよぉー。え、危ない逃げないと」


 絵里は敵の攻撃をなんとか回避した。敵はどんどん攻撃をしてくる。絵里は走りまわるしかなかった。


「だめだめ、このままじゃ勝てない。どうすればいいの?」


 絵里が困っていると、チーチャーは助言した。


「にゃにゃ、どうやら敵は狙いをつけるのは上手くないようだニャ。一旦隠れて作戦練るのもありかもニャ」

「そうね。あそこの茂みなら隠れても見つからないと思う」


 絵里は茂みの中に逃げ込んだ。


「装甲が硬すぎるよ。どこか弱点はないかなぁ。顔ならどうかな。まだ攻撃していないし……。でもあの高さまで届く攻撃は、今の私にはない……。どうしよう……?」


 絵里は茂みの中で考えた。どうやら敵は完全に絵里を見失ってしまったらしい。どこか適当に攻撃をしているが絵里には届く状況とは思えない。


「まだ、見つかってないけど、念の為『GBOX』の命令を実行っと、色は緑色で。えいっ!」


 絵里は茂みのなかで、静かに魔法のプログラムを実行する。


 GBOXはBASICでは四角を描画する命令である。魔法の世界の場合はバリアや結界を張ることができる。さらにGBOXは引く図形には色を指定することができる。絵里は茂みに近い緑を指定した。これで、敵の攻撃が絵里に向かってきてもある程度は防ぐことができる。


 絵里は敵に有効な攻撃をするためのプログラムを模索する。


「スプライトの猫にのって、猫さんが高くジャンプできれば。敵に届くかな? よし、あのプログラムを改造しよう。まずはLOADで朝に書いたプログラムを読み込んで『LOAD ”NORIMONO”』っと」


 絵里はプログラムをLOADした。今日覚えたてのあのプログラムである。


「ここをこう改造すればできるかなぁ。目立たないように小さいプログラムで、小さいスプライトで作って。静かにRUN」


 絵里は試しに作ったプログラムを実行する。しかし、思ったとおりには動かなかった。


「あれぇ、ちょっと失敗。てへっ。でも諦めないもん。今度はこうして実行。あれぇ、まだだめ。だったらこうすれば……」

 

 プログラムは思った通りには動かない!

  書いたとおりに動くのである。

 

 大事なことなので2回目である。プログラミングでは失敗を恐れずに何度もトライ&エラーを繰り返すことが重要なのである。


 絵里はこの短時間で何度もトライ&エラーを繰り返す。少しずつ正解に近づいていくる。


「さぁ、これならどうだろう。えぃ! おー、うまくいったぞ。わかった、そういうことだったんだ。何で今までわからなかったんだろう。凄い単純なことだったのに。って今敵と戦ってたんだよね。そうだ。直ぐ使えるように別のスロットにしようっと。さっきのプログラムをコピーしてこっちのスロットで貼り付け。実戦で使えるように、ここのパラメータを書き換えて。準備よし!」


 絵里はついに目的のロジックを見つけプログラムを組んだ。


 プログラミングでは新しいことを試すときはなるべく小さいプログラムを組んで実行して確認することが近道であることが多い。小さいプログラムで正常に動作することが確認できたら、実際に使うプログラムに組み込む。コピー&ペーストの機能を使えば効率よくプログラミングすることができるのである。


 絵里は猫のスプライトに跨って茂みから飛び出した。


「さぁかかってきなさーい。当てれるものならね。敵の弱点は多分そこ。いっくよー」


 絵里は敵に向かっていく、敵も絵里に気づいたのか、光の玉で攻撃をする。絵里が乗った猫は飛んでくる光の玉を軽やかに回避する。そして、絵里を乗せた猫は、高く高くジャンプした。どうやら、敵は絵里の速さについてこれず狙いが定まっていない。


「SPSETで攻撃魔法発動。勇者の剣を召喚。SPLINKで杖と合体融合!」


絵里はスプライトの剣で、巨大ロボットの顔面を攻撃する。攻撃は効いているようだ。ロボット顔の一部が壊れた。ロボットの動きが遅くなった。


「勝てる!」


しかし、ロボットは再び動き出す。そして、攻撃で壊れた部分が元に戻っていく、そしてさっきよりも、攻撃が激しくそして、狙いが正確に定まるようになっていた。


「えぇー。逃げないとー」


絵里は一旦ロボットから離れる。どうすれば勝てるのか?


「チーちゃん、強すぎだよー。勝てないよー。助けてよー」

「にゃにゃ、急に敵の動きが良くなったニャ? 何か秘密がありそうだニャ。何より自分で自分を修復することは凄く高度な魔術が必要なはずニャ」

「じゃぁ、私ではどうすることもできないの?」

「そうとも限らないにゃ、違うパターンを考えるニャ」


 絵里とチーチャーは敵の弱点を探るべく、頭をフル回転させて考える


「相手の魔力はそんなに強くない。なのに修復するということは…多分。だとしたら、急に狙いが正確になったの理解できる。そうかぁ」

「その通りニャ」


 絵里とチーチャーは何かに気づいた。


「敵はもうひとりいる。正確には、敵の本体は別にある。だとしたら、多分本当の弱点は…」


 絵里たちは敵の弱点を予想して行動に移った。


「もう一度、敵の顔を攻撃。翔べ猫さん!」


 絵里の乗せた猫は高くジャンプする。敵の顔の高さまで到達した。


「SPSETとSPLINKを組み合わせて、戦闘機と融合合体! さらにジャンプ。見えた! 本当の弱点!」


 絵里は戦闘機のスプライトを召喚して自分の背中に合体(LINK)させた。更に高く飛び上がり空を飛んだ。


「操ってるのは、あなたね?」


 ロボットの頭の後ろに謎の少女がいた。どうやら魔法で巨大ロボットを操っていたようだ。歳は絵里よりも上であるが、絵里よりは背丈も高いが、大人の体格をしているわけではない。黄色い髪の毛を三つ編みにして垂れ下げている。頭には赤いバンダナをしていた。


「何故こんなことを?」


 絵里が尋ねる。


「うるさい。うるさい。あんたには関係ない」


 謎の少女は反発する。


「関係なくない。こんなに酷いことして、この前の仕業もあなたなんでしょう?」

「ふん調子に乗るなよ。初心者魔法使いの癖に。まぁいい、今日のところはこれくらいで勘弁てやる。覚えてろよ。『GCIRCLE』これでも食らって静かにしてな。」


 ロボットの後にいた謎の少女は最後にGCIRLEの呪縛魔法で絵里を縛り付けて去っていった。絵里は何とか呪縛を解いたが、その時はすでに謎の少女の姿はなかった。


 絵里とチーチャーは家に帰った。


 普段どおりに勉強して、夕食を食べて、お風呂に入る。そして絵里の部屋で寝る前に今日の出来事についてチーチャーと話をした。


「あの子、逃してしまったけど大丈夫かな?」

「そもそも、戦う力が残っていたのかすらあやしいニャ」

「あの子、本当に悪い子なのかな?」

「わからないニャ。何でニャ」

「だって、騒ぎを起こしてる割には、犠牲者は1人もいないんだよね」

「まだ、わからないニャ」

「今日はそろそろ寝るニャ」

「おやすみ」

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る