武骨なようで中身は繊細!? プチコンによるBASICプログラムにおいて、画面上の“見栄え”は非常に難しい問題だ。今回は、やり過ぎない程度のスパイスを加えたサンプルプログラムを紹介する。おや、ハカセの手に「ファミリー○ーシック」が……なぜ!?
『それは空を飛べるがハトではない。マネが得意だがインコでもない。ひきょう者といわれるがコウモリでもない……』。さて、この生き物は何じゃろう?
フン、『人間』じゃねェの?
!! なかなかの“テツガク的アタマ良さそう系”の答えじゃな! ワンパクよ、やるではないか!
この手のアイマイな謎掛けには、『人間』って答えとけば大体こじつけられるって聞いたことがあるゼ!
……。
と、というわけで、今回のテーマじゃが……。うむ、言葉で説明するより、まずは画面を見てもらおうではないか!(画像1)
あれ? これって有名なランプの魔人の……。
い、いやそれは気が早いというものじゃぞ。今や『Akinator(アキネイター)』はバツグンに有名なプログラムじゃが、その起源ははるかに古く、正直なところ最初に言い出したのは誰なのかワシもよく知らんのじゃ。
またズイブンと大ざっぱな話だな、オイ!
そもそも最初までさかのぼろうとすると、人間対人間の『20の質問』タイプの古典クイズゲームになってしまうのさ。
さよう。コンピュータの世界だと、AI(人工知能)の研究やデータベースの格好のサンプルとして扱われたようじゃが、それもパソコン以前、マイコン以前の時代からの話じゃからのう。ジャンケンや数当てといった定番ゲーム同様、これも起源は諸説あって難しいのじゃ。
聞くところによると、『Apple II(アップル ツー)』の一部バージョンでは、システムディスクにサンプルプログラムとして同梱されていたこともあるそうですね。
ふむ。今は人間やキャラクターを5段階評価の回答で当てるのが定番じゃが、当時は動物をYES/NOだけで当てるのが主流じゃったようじゃな。今回のプログラムもしかりじゃ。
と言っても、ジャンル変えだけなら初期設定部分を書き換えるだけでいいから、すぐに試せるね。
やはり、データが増えてからがこのプログラムの面白さじゃな。文化祭でマイコン部の展示にこのプログラムを走らせていると、意外に内容が増えていって、内輪ネタなんかも入ってウケも良かったりするのじゃぞ。
その発言にはイロイロと時代を感じるゼ……。大体、これニンテンドーDSi/3DS用のソフトだしナ……。
CLS:CLEAR DIM HINT$(2000),NAME$(2000),Y(2000),N(2000) @DATA I=I+1 READ HINT$(I),NAME$(I) Y(I)=-I:N(I)=I+1 IF HINT$(I)=="" THEN GOUKEI=I-1:N(I-1)=-I:I=1:GOTO @QANDA GOTO @DATA DATA "ソラヲトブ","ハト","ツノガアル","シカ","ヒトガノレル","ウマ" DATA "ササガスキ","ハ゜ンダ","ハネル","カエル","クビガナガイ","キリン" DATA "","クトゥル-" @QANDA IF I<0 THEN I=-I:GOTO @ANSWER PRINT "ソレハ ";HINT$(I);"? (YА/NБ)" GOSUB @BUTTON IF B==16 THEN J=I:I=Y(I):F$="Y" IF B==32 THEN J=I:I=N(I):F$="N" GOTO @QANDA @ANSWER PRINT"ソレハ ";NAME$(I);"デスネ? (YА/NБ)" GOSUB @BUTTON IF B==16 THEN PRINT"ヤッタ!":GOTO @RETRY PRINT"ザンネン! オシエテクダサイ。" INPUT"ソレハ ナンデスカ";NAME$ PRINT NAME$;" ノ ";NAME$(I);" ニナイ トクチョウハ ナンデスカ" INPUT HINT$ PRINT NAME$;" ハ ";HINT$;"。 オボエマシタ。" GOUKEI=GOUKEI+1 IF F$=="Y" THEN Y(J)=GOUKEI IF F$=="N" THEN N(J)=GOUKEI NAME$(GOUKEI+1)=NAME$ HINT$(GOUKEI)=HINT$ Y(GOUKEI)=-(GOUKEI+1) N(GOUKEI)=-I @RETRY PRINT"デハ モウイチド。" PRINT I=1:GOTO @QANDA @BUTTON WAIT 1 B=BUTTON(3) IF B==16 OR B==32 THEN RETURN GOTO @BUTTON
ご覧のようにシンプルなプログラムなので、あまり解説の必要はないでしょう。
配列変数の添字は、ヒント(HINT$)や名前(NAME$)のように、それぞれ対応し合っています。そして、ヒントに対してYES/NOのリアクションがあると、やはり同じ添字の変数Y(n)またはN(n)を参照して、次にすべき質問の添字を見つける仕組みです。
この2つの変数は質問切れのフラグも兼ねていて、マイナス値ならば“これ以上掘り下げる質問はなし”と判断して、回答フェーズに進むようになっています。
昔のマイコン向けプログラムとの大きな違いといえば、YES/NOの入力インタフェースがキーボードの「Y(Enter)」/「N(Enter)」方式ではなく、ニンテンドーDSi/3DSの「Aボタン」「Bボタン」になったことでしょうか。当時から現代まで見回しても、ボタンやジョイパッドを標準搭載するハードは少ないですが、あるとなかなか助かるものです。
それにしても、少々見た目が地味だったでしょうか? 連載第7回「『夏草や 負けるな一茶 夢のあと』――ランダム俳句プログラムで奇跡の一句は生まれるか!?」の俳句自動生成プログラムも文字ばかりでしたが、特に今回は性質上、テキストが何行も続くのでますます見栄えが寂しいかもしれません。
BASIC全盛期の家庭用マシンは、アーケードゲーム機などと比較して、はるかにグラフィックス/サウンド性能が劣っており、この当時、“見栄え”がどうあるべきか難しい問題でした。
ハードの限界で望み通りのベストには達せないまでも、プログラム技術で極限まで性能を引き出して、理想に近づける挑戦はやはりキャッチーでプログラミングの1つの醍醐味(だいごみ)でした。しかし、その一方で「主人公がテキストの『▲』、敵が『■』になっても面白いものが本当に良いゲームだ!」という一種のグラフィックス不要論もしばしば持ち出されたものです。これは、つい見栄えや演出に重きを置き過ぎて、ゲームシステムや練り込み、アイデアをおろそかにしがちなことへの警句でもありますが、現代でも耳に痛い問題ではありますね。
そこで、今回のプログラムでは、やり過ぎにならない程度に軽くスパイスを加えてみました。こんな感じになりましたがいかがでしょうか?(画像2)
Copyright © ITmedia, Inc. All Rights Reserved.